JVM的学习分两个阶段即原理和源码学习、通过原理知识的学习我们能粗略的了解从java代码到字节码文件再到JVM运行产出的流程,之后你肯定会有一万个为什么,那时只能阅读源码来回答你的一万个为什么……
一、JVM内存区域、JVM内存模型
1、计算机内存:计算机内存就是存储CPU计算时需要读取数据的一个区域。
2、JVM内存区域:同理JVM内存区域也就是java程序运行时读取、存放相关数据的区域。
3、JVM内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
其实JVM内存区域和内存模型没有一毛钱的关系,但是刚开始学的时候其实很多人都没分清楚内存区域和内存模型两个概念……
二、JVM运行时数据区
Java虚拟机在执行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。具体区域划分如下图:
三、JVM各个区域功能以及特性
1、内存区域
2、局部变量表
四、各个区域具体存储信息
1、方法区、运行时常量池
1.1、方法区具体存储那些信息那?
1.2、class字节码文件反编译后的结构
1.2.1、class文件基本信息
1.2.2、add方法中的Code属性
由于长度问题不把所有属性展开展示,你可以把class文件中的属性一一展开和方法区、运行时常量池存储的数据对比发现几乎”一样“……
2、虚拟机栈
2.1、虚拟机栈中具体栈帧的局部变量表、操作数栈中变量的逻辑运算和存储
2.2、对应代码:
public int add(int a, int b) {
int c = a + b;
return c;
}
2.3、对应字节码指令:
3、堆内存
3.1、堆内存用来存储对象,每创建一个对象就要堆内存申请内存空间用来保存对象信息,那创建一个对象需要申请多大内存,其实对象的大小是可以计算出来的。
3.2、对象组成部分:对象头(运行时数据、元数据指针)、对象体就是我们定义的对象实例属性、对齐填充。
3.3、按照对象组分部分我们可以计算对象大小从而确定对象申请堆内存空间。
对象的创建和堆信息不再这里细说、下篇文章学习对象创建过程所以对象、堆相关知识点留在下篇……
五、疑问解答
1、在JAVA程序中经常使用的Class对象是保存在堆内存还是方法区?
Class对象保存在堆内存而对Class对象的引用保存在方法区,在上面第一章图有说道……
2、在很多文章中时不时能看到instanceKlass 那instanceKlass是什么?
JVM在运行时,需要一种用来标识java内部类型的机制。在HotSpot中的解决方案是:为每一个已加载的java类创建一个instanceKlass对象,用来在JVM层标识java类。也就是JVM内部标识类的一个对象,也就是类元数据载体。
3、在之前的动态代理从jdk到HotSpot中我们跟进了创建Class对象的流程发现是先创建instanceKlass 在创建的Class对象,instanceKlass 对象表示JVM内部一个类的描述即类的元数据即保存在方法区。
4、经常看到Class对象和instanceKlass他们之间是什么关系?
要说这个关系就涉及到JVM的OOP-Klass模型
4.1JVM在加载class时,创建instanceKlass,表示其元数据,包括常量池、字段、方法等,存放在方法区;instanceKlass是jvm中的数据结构;
4.2 在new一个对象时,jvm创建instanceOopDesc,来表示这个对象,存放在堆区,其引用,存放在栈区;它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象;instanceOopDesc对应java中的对象实例;
4.3HotSpot并不把instanceKlass暴露给Java,而会另外创建对应的instanceOopDesc来表示java.lang.Class对象,并将后者称为前者的“Java镜像”,klass持有指向oop引用(_java_mirror便是该instanceKlass对Class对象的引用);
4.4要注意,new操作返回的instanceOopDesc类型指针指向instanceKlass,而instanceKlass指向了对应的类型的Class实例的instanceOopDesc;有点绕,简单说,就是Person实例——>Person的instanceKlass——>Person的Class;
六、声明
1、这里说到的具体的虚拟机为HotSpot虚拟机
2、因为每一版本JVM都有优化改进所以每一版本中内存区域中的具体实现方式可能都会有改变所以如果你看到的不一样可以在直接留言
3、本人也是在学习过程中,如果理解有误还请指正
七、个人公众号
八、参考资料
周志明著:《深入理解java虚拟机》第二版
周志明译:《java虚拟机规范(java se 8)》
程涛著:《HotSpot实战》
https://www.cnblogs.com/xy-nb/p/6773051.html
https://www.zhihu.com/question/50258991