Java面试题冲刺第二十七天–JVM2

Java面试题冲刺第二十七天--JVM2

1. 内存模型

Java内存模型主要分为两种:

  • 堆内存:存放我们new出来的对象以及数组等,这部分内存可以动态申请或释放。一般情况下,堆内存比较大。
  • 栈内存:存放基本类型的变量以及对象的引用变量(指针),这些变量会随着程序的运行而申请或释放。栈的空间比较小,一般情况下,栈的大小是在程序启动的时候就固定下来。

2. JVM内存模型

JVM内存模型主要分为五种:

  • 方法区(JDK7及以前称为永久代):存放静态变量、类信息等,这部分内存可以动态申请或释放。运行时类的情况是在方法区中存储。
  • 堆内存:同上。
  • 虚拟机栈:与线程相关的数据存储在虚拟机栈中,包括方法调用的局部变量、返回值等数据。这个是栈内存的一部分。
  • 本地方法栈:较少使用,主要是为了支持本地(native)方法。
  • PC寄存器:记录当前线程执行的代码行号,也就是JVM中的“程序计数器”。

3. GC算法

  • 新生代GC:一般采用复制算法。
  • 老年代GC:一般采用标记-清除算法。

在JDK 1.2之后,Java默认使用的是能够自动适应应用程序所需的并行垃圾收集器(Parallel Collector)——也称之为吞吐量优先收集器(The throughput collector)。

4. 分代收集

对于JVM的“分代收集”策略,一般分为以下几步:

  • 对于新生代开辟一段内存,称之为“Eden”空间;
  • 运行过程中,将对象放入Eden空间;
  • 当Eden空间满时,将其中存活的对象,复制到其他内存空间,称之为“Survivor”空间中;
  • 当“Survivor”空间也满时,将存活下来的对象放入老年代空间;
  • 老年代也满,就会触发Full GC,也就是对整个堆都进行清理。

5. 示例说明

示例1

public class Test {
    private static int count = 0;
    public static void main(String[] args) {
        checkMemory();
    }
    private static void checkMemory(){
        while (true){
            new Thread(() -> {
                byte[] array = new byte[1024 * 1024];
                try {
                    Thread.sleep(1000);
                    count++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
            System.out.println("count=" + count);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这段代码实现了不断开启新的线程进行内存分配操作。在输出中,你会看到类似如下的内容:

count=985
count=987
count=999
Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space

这是因为每当开启一个新线程时,都会在堆内存中占用一定空间。由于没有使用相关手段对线程进行回收,最终导致堆内存耗尽。

示例2

public class Test {
    private static int count = 0;
    public static void main(String[] args) {
        while (true){
            new Thread(() -> {
                byte[] array = new byte[1024 * 1024];
                try {
                    Thread.sleep(1000);
                    count++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
            System.out.println("count=" + count);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这段代码与示例1非常相似,唯一的区别就是while循环在main方法中而不是checkMemory方法中。在输出中,你会看到类似如下的内容:

count=390
count=411
count=422
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

这是因为main方法一直处于运行状态,并在其中使用while循环不断加入新线程,最终导致堆内存耗尽。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java面试题冲刺第二十七天–JVM2 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 简单实现java上传图片文件功能

    下面是详细讲解“简单实现Java上传图片文件功能”的完整攻略。 1. 确认技术栈 在开始实现上传图片文件功能之前,需要确认一下使用的技术栈。Java Web 应用的上传图片文件功能通常包含以下几个技术: HTML 表单:用于用户在浏览器中选择图片文件并提交到服务器。 Servlet:处理浏览器的请求,获取前台提交的文件数据。 文件存储:将上传的文件保存到服务…

    Java 2023年5月26日
    00
  • 如何在IntelliJ IDEA 2018上配置Tomcat并运行第一个JavaWeb项目

    请参考以下步骤来配置Tomcat并运行第一个JavaWeb项目: 1. 下载和安装Tomcat 首先,下载Tomcat并解压缩到本地。 推荐使用Tomcat 8.0版本。 打开Tomcat/bin目录,双击startup.bat文件启动Tomcat服务器。 2. 在IntelliJ IDEA 2018中配置Tomcat服务器 打开IntelliJ IDEA,…

    Java 2023年5月19日
    00
  • Java 类与对象重难点详解

    Java 类与对象重难点详解 Java 类与对象是 Java 的重要特性之一,理解其概念和运用,对于学习 Java 编程语言和开发具有非常重要的意义。本篇攻略将为大家讲解 Java 类与对象的相关概念和用法,以及一些常见的难点和解决方案。 类与对象的基本概念 在 Java 中,类是一种自定义的数据类型,是描述具有相同属性和行为的对象的蓝图。对象则是类的一个实…

    Java 2023年5月26日
    00
  • 用JavaScript实现仿Windows关机效果

    当我们尝试模仿操作系统的某些效果时,如Windows关机效果,我们需要使用 JavaScript 和 CSS。下面是实现仿Windows关机效果的完整攻略。 准备工作 在开始实现之前,需要先准备好以下三个工具: 一个编辑器,如 Visual Studio Code 一个浏览器,如 Chrome 一段用于实现效果的HTML和CSS代码 实现过程 以下是实现该效…

    Java 2023年6月16日
    00
  • Docker 搭建 Tomcat 运行环境的方法

    下面我来详细讲解一下“Docker 搭建 Tomcat 运行环境的方法”的完整攻略。 背景介绍 Docker 是一个开源的容器化引擎,可以轻松地实现应用程序隔离和打包,并且可以快速迁移。Tomcat 是一个非常流行的 Java Web 应用程序服务器,支持 Servlet 和 JSP 技术。在实际开发中,使用 Docker 搭建 Tomcat 运行环境非常便…

    Java 2023年5月19日
    00
  • Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)

    针对“Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)”这个问题,我来给出完整的攻略。大致流程如下: 下载log4j-2.15.0.jar包 查找使用Log4j2进行日志记录的应用程序 停止应用程序 将原来的log4j-core jar包和log4j-api jar包替换成log4j-2.15.0.jar包 重新启动应用程序,…

    Java 2023年5月20日
    00
  • 详解SimpleDateFormat的线程安全问题与解决方案

    问题描述: SimpleDateFormat 是Java中用于格式化日期的类,它用来将给定的日期字符串转换为 Date 对象,或将 Date 对象格式化为指定格式的日期字符串。 然而,在多线程环境中使用 SimpleDateFormat 时,可能会出现线程不安全的问题,从而导致程序出错或结果不如预期。 问题原因: SimpleDateFormat 的实例不是…

    Java 2023年5月20日
    00
  • Java消息摘要算法MAC实现与应用完整示例

    我会给出完整的“Java消息摘要算法MAC实现与应用完整示例”的攻略。本文将从以下几个方面进行讲解: 什么是MAC MAC的实现方式 实现Java消息摘要算法MAC Java消息摘要算法MAC的应用 1. 什么是MAC MAC是消息认证码(Message Authentication Code)的简称,它是一种用于验证数据完整性以及认证消息来源的密码学算法。…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部