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区空间大小的一半就会直接放到老年代

JVM总结

 

Method Area方法区

线程共享

存储

       类信息

       常量

       静态常量

       方法字节码

 

Program Counter Register程序计数器

作用

       当前线程执行的字节码的信号指示器,通过改变此指数器来选取下个需要执行的字节码指令

特征

       在线程创建时创建

       每个线程拥有一个

        指向下一条指令的地址

JVM运行时数据区

JVM总结

JMM模型

线程工作内存,主内存

 

JVM总结