JVM官网
可以参考oracle官网中jvm
jvm官网
学习jvm更好的排查问题
java通过javac编译生成class文件,接下来的工作就是jvm中运行了
class文件打开后是一个二进制或者16进制文件
在这里插入图片描述u4表示cafe babe,凡是class文件开头的都是cafe babe
u2表示版本,16进制换算成二进制文件
类加载机制是将class文件交给jvm
类加载机制步骤
1、装载
先找到类文件的所在的位置,类文件的信息交给jvm。类文件所对应的对象
类加载器,不同的类用不同的类加载器
如何进行加载
父类优先进行加载,确保jvm中只有一个全路径的类
这就是双亲委派机制
源码中有个方法,load,先加载父类,在加载子类
ClassLoader类中有一个loadClass方法,下面是一段代码,大家可以自己看一下源码
如何破坏双亲委派机制
我们可以重写上面的这个方法
加载完后,class文件分门别类放到jvm中,这就要讲jvm进行一个划分
类文件放在方法区,类文件中对象放到堆中
2、链接
验证:保证类加载的正确性
准备:为类的静态变量分配内存空间,并将其的值初始化为默认值
解析:将类中的符号引用转换为直接引用
直接引用就是地址,将一些符号转变为地址
3、初始化
为静态变量赋值
jvm运行时数据区
运行时常量池,在方法区中
栈:线程创建的时候会创建栈,解决线程执行方法
本地方法栈运行的是C语言的代码
PC Register:记录方法执行的位置
01方法区
jdk1.7 永久代
jdk1.8 元空间
02堆
03栈
一个线程的创建代表的是一个栈,每个方法被当前线程调用了,就代表一个栈桢
栈溢出 StackOverflowError
以上三个重点关注
未完
既然有了运行时数据区,那内存模型(JMM)是什么
当代码不在运行状态时,在物理落地的状态
内存模型中的metaspace 和heap相当于对运行时数据区中的方法区和堆得一个落地
java虚拟机栈执行方法时候经历了什么
字节码指令,描述了class文件在jvm中每一步的状态是做什么?请看下一篇文章