程序员社区

(JVM面试题) 请你描述一下 Java 的内存区域?

JVM 在执行 Java 程序的过程中会把它管理的内存分为若干个不同的区域,这些组成部分有些是线程私有的,有些则是线程共享的,Java 内存区域也叫做运行时数据区,它的具体划分如下:

(JVM面试题) 请你描述一下 Java 的内存区域?插图

  • 虚拟机栈 : Java 虚拟机栈是线程私有的数据区,Java 虚拟机栈的生命周期与线程相同,虚拟机栈也是局部变量的存储位置。方法在执行过程中,会在虚拟机栈中创建一个 栈帧(stack frame)。每个方法执行的过程就对应了一个入栈和出栈的过程。

    (JVM面试题) 请你描述一下 Java 的内存区域?插图1

    • 本地方法栈: 本地方法栈也是线程私有的数据区,本地方法栈存储的区域主要是 Java 中使用 native 关键字修饰的方法所存储的区域。

    • 程序计数器:程序计数器也是线程私有的数据区,这部分区域用于存储线程的指令地址,用于判断线程的分支、循环、跳转、异常、线程切换和恢复等功能,这些都通过程序计数器来完成。

    • 方法区:方法区是各个线程共享的内存区域,它用于存储虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码等数据。

    • :堆是线程共享的数据区,堆是 JVM 中最大的一块存储区域,所有的对象实例都会分配在堆上。JDK 1.7后,字符串常量池从永久代中剥离出来,存放在堆中。

    堆空间的内存分配(默认情况下):

    命令行上执行如下命令,会查看默认的 JVM 参数。

    java -XX:+PrintFlagsFinal -version

    输出的内容非常多,但是只有两行能够反映出上面的内存分配结果

    (JVM面试题) 请你描述一下 Java 的内存区域?插图2(JVM面试题) 请你描述一下 Java 的内存区域?插图3

    (JVM面试题) 请你描述一下 Java 的内存区域?插图4

      • eden 区:8/10 的年轻代空间
    • survivor 0 : 1/10 的年轻代空间

    • survivor 1 : 1/10 的年轻代空间

    • 老年代 :三分之二的堆空间

    • 年轻代 :三分之一的堆空间

    • 运行时常量池:运行时常量池又被称为 Runtime Constant Pool,这块区域是方法区的一部分,它的名字非常有意思,通常被称为 非堆。它并不要求常量一定只有在编译期才能产生,也就是并非编译期间将常量放在常量池中,运行期间也可以将新的常量放入常量池中,String 的 intern 方法就是一个典型的例子。

Java面试题

赞(0) 打赏
未经允许不得转载:IDEA激活码 » (JVM面试题) 请你描述一下 Java 的内存区域?

一个分享Java & Python知识的社区