JVM结构介绍
JVM一共分为三个组成部分:
1 类加载子系统
主要是将class文件加载到内存中的一个系统,其核心组件是类加载器
2 运行时数据区子系统
1 JVM私有部分
1 虚拟机栈
描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
2 本地方法栈
与虚拟机栈类似,不过却是为虚拟机使用到的Native方法服务
HotSpot虚拟机将虚拟机栈和本地方法栈合二为一
使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++ 语言实现的,并且被编译成了 DLL(是Microsoft Windows系统中的动态链接库(Dynamic Link Library,缩写为dll)。是一种嵌入到微软Windows操作系统中的特殊的应用程序),由 Java去调用。
这些函数的实现体在 DLL 中,JDK 的源代码中并不包含,是看不到的。对于不同的平台它们也是不同的。这也是 Java 的底层机制,实际上 Java 就是在不同的平台上调用不同的 native 方法实现对操作系统的访问的。
Java的底层实现是用C和C++编写的。Java的虚拟机(JVM)是用C++编写的,而Java标准库和一些底层功能则是用C编写的
3 程序计数器
可以看作当前线程所执行的字节码的行号指示器
2 JVM公有部分
1 方法区(类元信息)
存放已被虚拟机加载的类的类信息、常量、静态变量、即时编译器编译后的代码
对HotSpot虚拟机来说,也称为永久代(Permanent Generation)
-jdk1.6及之前:有永久代,常量池在方法区
-jdk1.7:有永久代,但已逐步“去永久代”,常量池转移到堆中
-jdk8及之后:无永久代,常量池在元空间
2 JAVA堆
存放几乎所有的对象实例和数组,GC的主要区域
从内存回收的角度,可划分为新生代和老年代,可进一步细分为Eden空间、From Survivor空间、To Survivor空间
从内存分配的角度,可能刻分出多个线程私有的分配缓冲区(TLAB)
3 执行引擎子系统:
负责程序的执行和垃圾回收