作者:秋秋传奇哦_729 | 来源:互联网 | 2023-08-14 17:41
JDK1.8之前
JVM1.8之前主要由五个部分组成:
- 线程共享
- 堆:主要存储实例对象,GC的主要活动区域。
- 方法区:主要存储类的原始信息,静态方法,类,属性,运行时常量池,即时编译,常量等信息
- 线程私有
- 程序计数器:指向当前线程正在执行的字节码的地址和行号,线程抢夺CPU时间片的现场。
- 虚拟机栈:里边包含多个栈帧,每个栈帧就是一个方法,栈帧记录着{局部变量表、方法出口、操作数栈}
- 本地方法栈:JVM调用本地方法
附图:
jdk1.8之前,JVM结构图
JDK1.8及之后
Jdk1.8之后去除了方法区,增加了元数据区,只存储类的原始信息,常量池等移动到堆中了。
原因如下:
- 字符串存在永久代中,容易出现性能问题和内存溢出。
- 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
- 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
- 多个JVM可以共用一份相同的类信息。
附图:
JDK1.8 JVM内存结构