深入理解JVM
编译原理请查看之前内容,需要了解更多Java原创资料,请加qq:1811112688,或者加老薛的微信,在个人介绍中。
编译、加载过程
imagejava虚拟机何时会结束什么周期?
i:正常执行完毕程序
ii:执行了System.exit();
iii:程序执行期间发生了异常或者错误而终止
iv:由于底层操作系统出错,导致虚拟机结束进程
classloader将数据加载到内存中经过的步骤:
imagei、加载:加载类的二进制数据
ii、链接
.验证 确保加载的类的正确性。
.准备 类中的静态变量分配内存,并且其初始化为默认值。
.解析 把类中的符号引用变为直接引用。
iii、初始化
为类中的类中的静态变量赋值(正确的初始值)
如何确定一个类被加载了?
Java程序对于类的使用分为两个部分:
i:主动使用
A:创建一类的实例 new Person();
B*:访问某个类、接口中的静态变量,或者对于静态变量做读写;
C:调用类中的静态方法;
D:反射 (Class.forName("xxx.xxx.xxx"));
E*:初始化一个类的子类的,当前类加载。
F:Java虚拟机标明的启动器类(Test.class(main)|Person.class|Student.class,此时Test就是启动器类).
ii:被动使用
a:引用常量不会导致该类发生初始化[常量它是在编译器确定的]
b: 通过数组定义类的引用,不会触发该类的初始化
c:通过子类引用父类的静态变量,不会导致子类初始化。
剩余的都是被动使用。。。
加载.class文件的方式:
-1:本地系统当中直接加载 *
-2:通过网络下载.class文件
-3:从jar、zip等归档文件中加载.class文件 *
-4:数据库(.class文件)
-5:动态编译.class
当一个类加载到内存中之后,会在堆内存当中产生一个对应的Class的对象,所有当前的类的
实例以及当前该类都共享这一份Class实例。
类加载器
java虚拟机自带的加载器:
根类加载器(bootstrap)
扩展类加载器(PlatformClassLoader、低版本 Ext)
系统类加载器(AppClassLoader)
用户自定义加载器
java.lang.ClassLoader的子类
可以定制类的加载方法
注意:类加载器并不需要等到一个类"首次主动使用"时在加载它。
可以预先加载。JVM规范中定义类,类加载器可以在预料到某个类可能
需要加载时预先加载。
hotspot、jrokit、j9都是对于JVM规范的一种实现。
网友评论