【大白话说Java面试题 第42题】【JVM篇】第2题:JVM内存模型有哪些组成部分?

📌 PDF :大白话说Java面试题 --- 02-JVM篇

第2题:JVM内存模型有哪些组成部分?

📚 回答:

  • 核心概念 :
    JVM内存模型是JVM运行时数据区的具体划分,它定义了Java程序运行过程中各种数据的存储位置和作用范围。

1. 堆(Heap)
  • 特点:

    • 线程共享,是JVM中最大的一块内存区域。
    • 用于存放对象实例和数组。
  • 分区:

    • 年轻代:存放新创建的对象,分为一个Eden区和两个Survivor区(From和To)。
    • 老年代:存放经过多次垃圾回收后仍然存活的对象。

    💡 代码示例 :

    以下代码展示了对象在堆中的分配:

java 复制代码
public class HeapDemo {
    public static void main(String[] args) {
        // 对象实例存放在堆中
        Person person = new Person();
    }
}

class Person {
    String name;
    int age;
}

2. 元空间(Metaspace)
  • 特点:

    • 线程共享,用于存储类的元信息(如类名、字段、方法)、常量池和静态变量。
    • 在JDK1.8之前称为永久代(PermGen),之后改为元空间,使用的是本地内存而非JVM内存。
  • 优化建议:

    • 如果程序中动态生成大量类(如Spring的代理类),需要适当调整元空间大小(-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize)。

3. 虚拟机栈(Virtual Machine Stack)
  • 特点 :
    • 线程私有,每个线程都有独立的栈空间。

    • 栈帧是栈的基本单位,每个方法调用对应一个栈帧,包含以下内容:

      • 局部变量表:存放方法参数和局部变量。
      • 操作数栈:用于计算过程中的临时存储。
      • 动态链接:符号引用转换为直接引用的过程。
      • 方法出口:方法返回时,恢复调用者状态的信息。

      💡 代码示例 :

      以下代码展示了栈帧的使用:

java 复制代码
public class StackDemo {
    public static void main(String[] args) {
        int a = 10; // 局部变量表
        int b = 20;
        int c = add(a, b); // 方法调用,压入栈帧
        System.out.println(c);
    }

    public static int add(int x, int y) {
        return x + y; // 操作数栈参与计算
    }
}

4. 本地方法栈(Native Method Stack)
  • 特点 :
    • 线程私有,用于支持本地方法(Native Method)的调用。
    • 例如,调用JNI接口时会使用本地方法栈。

5. 程序计数器(Program Counter Register)
  • 特点 :
    • 线程私有,用于记录当前线程执行的字节码指令地址。
    • 如果线程正在执行的是Java方法,则程序计数器记录的是当前指令地址;如果是本地方法,则值为空(Undefined)。

💡 面试官视角:

  • 面试官可能会问"堆和栈的区别是什么?"答:堆是线程共享,用于存储对象实例;栈是线程私有,用于存储方法调用过程中的局部变量和操作数。
  • 面试官可能会追问"为什么需要分代收集?"答:年轻代的对象生命周期短,适合快速回收;老年代的对象生命周期长,适合低频次回收,分代收集提高了垃圾回收效率。
相关推荐
FRing032 分钟前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿5 分钟前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
Thinker QAQ25 分钟前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
weixin_417396831 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
齐 飞1 小时前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色1 小时前
多AS互联BGP4综合实验设计
java
某不知名網友1 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog2 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程2 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn2 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode