JVM总结
JAVA类加载器
双亲委派模型
启动类加载器->扩展类加载器->应用类加载器->自定义类加载器
启动类加载器(rt.jar如io包,lang包)
扩展类加载器(%JAVA_HOME%/lib/ext/)
应用类加载器(classpath)
自定义类加载器(自定义路径,如自己导的包自己写的类)
类加载时如果未加载,会往上找类加载器,从而保证类的安全性不会被覆盖掉,如不可以重写一个String类,因为在启动类加载器时就加载完毕,你如果再要加载你自己写的Stirng类,就会往上找到启动类加载器,然后发现Stirng已经被加载过了从而加载失败。
类加载过程
加载
连接
验证(验证类的正确性,是否遵循jvm规范)
准备(为类里面的变量分配内存,将一些变量初始化)
解析(将类的一些符号引用转换为直接引用)
初始化(将静态方法块等组装为初始化方法然后去初始化)
执行静态代码块,静态变量
JVM模型
VM Stack栈
线程私有
方法在执行时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接(对常量的引用),方法出口等信息
方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程
局部变量表所需要的内存空间在编译期间完成分配,而且分配多大的局部变量空间是完全确定的,在方法运行期间不会改变其大小
出栈后空间释放
heap区 堆
线程共享
存储对象或者数组
heap区划分:
年轻代(Eden,s0,s1),老年代(Tenured),1.7以前还有一个永久代,new出来的对象先存在eden区,如果new出来的对象eden没空间放了就会GC,如果分配到s区的对象超过s区空间大小的一半就会直接放到老年代
Method Area方法区
线程共享
存储
类信息
常量
静态常量
方法字节码
Program Counter Register程序计数器
作用
当前线程执行的字节码的信号指示器,通过改变此指数器来选取下个需要执行的字节码指令
特征
在线程创建时创建
每个线程拥有一个
指向下一条指令的地址
JVM运行时数据区
JMM模型
线程工作内存,主内存