【码歌】深入理解JVM

                                                                                                                         来源:https://www.jianshu.com/p/61fe6a67defa

编译原理请查看之前内容,需要了解更多Java原创资料,请加qq:1811112688。

编译、加载过程

image

java虚拟机何时会结束什么周期?

i:正常执行完毕程序
ii:执行了System.exit();
iii:程序执行期间发生了异常或者错误而终止
iv:由于底层操作系统出错,导致虚拟机结束进程

classloader将数据加载到内存中经过的步骤:

image

 

i、加载:加载类的二进制数据
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规范的一种实现。

本文转自:简书,作者:码歌老薛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值