深入理解JVM(8)——类加载的时机
一、类的生命周期
- 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—》验证—》准备--》解析—》初始化—》使用—》卸载。
- 类加载包括五部分:加载—》验证—》准备--》解析—》初始化
- 在类加载的过程中,以下三个过程成为连接:验证—》准备--》解析
- 因此,JVM的类加载过程可以分为三个部分:加载—》连接—》初始化
- c/c++语言在程序运行之前需要完成预处理、编译、汇编、连接,但是在Java语言中类加载(加载、连接、初始化)是在程序运行期间完成。在程序运行期间完成类加载过程会增加程序的开销,但是随之会带来更大的好处—能够提高程序的灵活性。Java语言的灵活性主要体现在在程序运行期间能够动态的扩展,所谓的动态扩展就是动态加载和动态链接。
二、类加载的时机
- 类加载过程中每个步骤的顺序
a) 加载、验证、准备、初始化是按照先后顺序依次执行的
b) 解析过程会发生在初始化过程中
- 类加载过程中“初始化”开始的时机:JVM规范中只定义了类加载过程中初始化过程开始的时机,加载、连接过程都应该在初始化之前开始(解析除外)
a) 在类加载过程中遇到如下指令(new、getstatic、putstatic、invokestatic),如果当前的类尚未初始化,那么就要进行初始化。分别对应的Java代码场景为:
- 通过new创建一个对象
- 读取、设置一个类的静态成员变量(final修饰的成员变量除外)
- 调用一个类的静态成员函数
b) 使用Java.lang.reflect进行发射调用的时候,如果这个类没有被初始化,那么就要先进行初始化
c) 当初始化一个类时,如果这个类的父类还没有被初始化,那么先初始化这个类的父类,再初始化这个类
d) 当虚拟机启动的时候,虚拟机会首先初始化带有main方法的类
- 主动引用和被动引用
JVM虚拟机规范中要求在程序运行过程中,“当且仅当”出现上述4个条件之一的情况才会初始化一个类。如果间接满足上述初始化条件是不会初始化类的。其中,直接满足上述初始化条件的情况叫做主动引用;间接满足上述初始化过程的情况叫做被动引用。
那么,只有当程序在运行过程中满足主动引用的时候才会初始化一个类,若满足被动引用就不会初始化一个类。
- 接口的初始化和类的初始化比较和区别
类和接口都需要初始化,他们初始化的过程大致相同,不同点在于:类初始化过程中如果发现该类的父类尚未被初始化,那么会先初始化父类,然后再初始化这个类;但是接口初始化的时候,并不要求父类已经全部初始化,当程序运行过程中需要用到父类的东西的时候在初始化父类接口。
深入理解JVM(8)——类加载的时机的更多相关文章
- 深入理解JVM之类加载
---title: [学习]深入理解JVM之类加载.mddate: 2019-10-20 22:20:06tags: JVM 类加载--- Java类的加载,连接,初始化都是在程序运行期间执行的 ## ...
- 【深入理解JVM】类加载器与双亲委派模型 (转)
出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...
- 深入理解JVM - 虚拟机类加载机制 - 第七章
类加载的时机类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括了:加载/验证/准备/解析/初始化/使用/卸载七个阶段.其中验证/准备和解析统称为连接(Linking). 加载.验证.准 ...
- 深入理解JVM的类加载
前言: 前面又说到Java程序实际上是将.class文件放入JVM中运行.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的Java类 ...
- 深入理解JVM(3)——类加载机制
1.类加载时机 类的整个生命周期包括了:加载( Loading ).验证( Verification ).准备( Preparation ).解析( Resolution ).初始化( Initial ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- 深入理解JVM一类加载器原理
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...
- 深入理解JVM,类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...
- 理解JVM之类加载机制
类完整的生命周期包括加载,验证,准备,解析,初始化,使用,卸载,七个阶段.其中验证,准备,解析统称为连接,类的卸载在前面的关于垃圾回收的博文中已经介绍. 加载,验证,准备,初始化,卸载这五个阶段的顺序 ...
- JVM(二)类加载的时机及其过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的的整个生命周期包括: 加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化 ...
随机推荐
- fastjson如何判断JSONObject和JSONArray
1.fastjson如何判断JSONObject和JSONArray,百度一下,教程还真不少,但是是阿里的fastjson的我是没有找到合适的方法.这里用一个还算可以的方法,算是实现了这个效果. 网上 ...
- C#学习-索引器
当一个类包含数组成员时,索引器的使用将大大地简化对类中数组成员的访问. 索引器的定义类似于属性,也具有get访问器和set访问器,以下是 [修饰符] 数据类型 this [索引类型index] { g ...
- C#学习-属性是对字段的扩展
属性是对字段的扩展. 根据面向对象语言的封装思想,字段最好设为private,因为这样可以防止客户端直接对字段进行篡改,从而保证了内部成员的完整性. 于是为了访问类中的私有字段,C#提供了属性这种机制 ...
- WPF多屏最大化
如果计算机存在多个显示器,这时设置wpf窗口为最大化,窗口只能在主显示器中实现最大化,如果想要实现窗口拉伸至多屏,需要获取所有显示器分辨率之和.这时用到了System.Windows.SystemPa ...
- Newtonsoft.Json 高级用法
基本用法 Json.NET是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的.下面分别举例说明序列化和反序列化. DataTable: //序列 ...
- sqlserver中的数据转换与子查询
数据类型转换 --cast转换 select CAST(1.23 as int) select CAST(1.2345 as decimal(18,2)) select CAST(123 as var ...
- Flink应用开发-maven导入
flink和spark类似,也是一种一站式处理的框架:既可以进行批处理(DataSet),也可以进行实时处理(DataStream) 使用maven导入相关依赖 <properties> ...
- plt实现动态画图
用pycharm跑的没有出现动态线条的话: 1.点击setting,输入关键字Scien...搜索出Python Scientific, 在右侧去掉对勾(默认是勾选的),然后右下角Apply--OK, ...
- HDU1814 Peaceful Commission 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8099115.html 题目传送门 - HDU1814 题面 Description 根据宪法,Byteland民 ...
- Period kmp
For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...