当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-说下对JVM内存模型的理解

金三银四精选java面试题-说下对JVM内存模型的理解

来源:图灵教育
时间:2023-11-29 09:22:41
 

说下对JVM内存模型的理解

JVM 内存区域最粗略的划分可以分为,当然,按照虚拟机规范,可以划分为以下几个区域:

JVM 内存分为线程私有区线程共享区,其中方法区和堆是线程共享区,虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。

1)程序计数器

程序计数器是一块较小的内存区域,它是线程私有的。在多线程环境中,每个线程都有一个独立的程序计数器,用于指示当前线程执行的字节码指令地址。

2)Java 虚拟机栈

每个线程在运行时都会创建一个对应的虚拟机栈。每个方法在执行的同时都会创建一个栈帧,栈帧中保存了局部变量操作数栈动态链接方法出口等信息。栈帧随着方法的调用和返回而入栈和出栈。

3)本地方法栈

本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

4)Java 堆

堆是Java虚拟机管理的最大的一块内存区域。所有通过new关键字创建的对象都会被分配到堆中。堆是被所有线程共享的,在虚拟机启动时被创建。堆被划分为新生代老年代两个区域。

  • 新生代:新创建的对象首先被分配到新生代的Eden区,当Eden区满时触发Minor GC,并且根据分代收集理论,将存活的对象复制到Survivor区。经过多次Minor GC后仍然存活的对象会被移动到老年代。
  • 老年代:大部分存活时间较长的对象会被分配到老年代。当老年代满时触发Major GC(也称为Full GC),并且进行完整的垃圾回收操作。

5)方法区

方法区是比较特别的一块区域,和堆类似,它也是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。