JVM内存模型

97 阅读1分钟

1、程序计数器(线程私有)

指向当前正在执行的字节码的行号。如果当前线程是native方法,则其值为null

2、虚拟机栈(线程私有)

  • 线程私有,储存发放执行时的信息,每个方法在执行会创建一个栈帧,储存局部变量表、操作数栈、动态链接、方法返回地址等。
  • 每个方法从调用到执行完成,对应一个栈帧在虚拟机栈中的入栈和出栈。
  • 局部变量所需内存在编译期间完成分配,
  • 如果线程请求的栈深度大于虚拟机所允许的深度,则StackOverflowError。
  • 如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则OutOfMemoryError。

2、本地方法栈(线程私有)

和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。也会抛出StackOverflowError 和OutOfMemoryError。

4、java堆(线程共享)

  • HotSpot虚拟机区分为年轻代和年老代。
  • 年轻代分为Eden、From survivor、To survivor占比8:1:1。主要采用标记清除算法和复制清楚算法。GC时用可达法标记Eden和From survivor中对象,复制到To survivor区,回收Eden和From survivor区中内存。若To survivor放不下对象,则直接移到年老代。每躲过一次GC对象年龄加1,15岁时则移动到年老代中。
  • 年老代主要采用标记整理算法。

5、方法区(线程共享)

用于存储已经被虚拟机加载的类信息,常量,静态变量等。 这个区域的内存回收目标主要针对常量池的回收和堆类型的卸载。 JDK1.8时改为元空间储存在本地内存中。