JVM主要组成部分以及堆内存的详细解释
![](https://img2018.cnblogs.com/blog/285763/201912/285763-20191205095352804-1612807286.png)
-
class loader(类加载器):加载类文件到内存。只负责加载,不负责执行。
-
exectution engine(解释器/执行引擎):负责解释命令,交由操作系统执行,是jvm的核心。
-
native interface(本地方法栈):融合不同的语言为java所用。
-
PC Register(程序计数器):程序计数器是用于存放下一条指令所在单元的地址的地方。 每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。
-
Java虚拟机栈(栈内存):java程序的运行区,在线程创建时创建,生命周期跟随线程的生命周期。对于栈来说不存在垃圾回收的问题,只要线程一结束,该栈就结束。栈中的数据以栈帧的格式存在,栈帧是一个内存区块,是一个数据集(变量int等),是一个有关方法和运行期数据的集合。当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“先进后出”原则。
-
堆内存:一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
堆内存分为三部分:
- 永久存储区(JDK1.7之后变为元空间):用于存放jdk自身携带的class,interface的元数据,也就说他存储的是运行环境必须的类信息,被装载至此区域的数据是不会被垃圾回收的,只有关闭JVM才能释放此区域反占用的内存。
- 新生区:复制算法
- 老年代:标记整理算法
jdk1.7版本之前的堆内存
jdk8版本的堆内存
-
method area(方法区):永久代(perm)和元空间都是方法区的一种实现。方法区被所有线程共享,该区域保存的所有字段和字节方法以及一些特殊方法如构造函数,接口代码,静态的常量也再此定义。