深入理解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个条件之一的情况才会初始化一个类。如果间接满足上述初始化条件是不会初始化类的。其中,直接满足上述初始化条件的情况叫做主动引用;间接满足上述初始化过程的情况叫做被动引用。
那么,只有当程序在运行过程中满足主动引用的时候才会初始化一个类,若满足被动引用就不会初始化一个类。
- 接口的初始化和类的初始化比较和区别
类和接口都需要初始化,他们初始化的过程大致相同,不同点在于:类初始化过程中如果发现该类的父类尚未被初始化,那么会先初始化父类,然后再初始化这个类;但是接口初始化的时候,并不要求父类已经全部初始化,当程序运行过程中需要用到父类的东西的时候在初始化父类接口。
转载于:https://www.cnblogs.com/BaoZiY/p/10632227.html
深入理解JVM(8)——类加载的时机相关推荐
- jvm类加载过程_JVM知识点——深入理解JVM的类加载
前言: 前面又说到Java程序实际上是将.class文件放入JVM中运行.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的Java类 ...
- JVM中类加载的时机
本文主要记录下类的加载过程,一个类从加载到内存中开始到被卸载的整个生命周期作为java程序员来说应该还是要清楚的. 类的生命周期 类从加载到内存中到卸载的整个过程中经历了如下的过程: 这几 ...
- 深入理解Java虚拟机——类加载的时机
目录 一.类加载的时机概述 二.加载阶段 三.初始化阶段 3.1.初始化阶段的概述 3.2.以下5种情况必须立即对类进行"初始化" 3.3.以下3种情况不被"初始化&qu ...
- 深入理解JVM(6)——类加载器
虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现 ...
- 深入理解JVM文章合集
原文地址:http://ddrv.cn/a/88331 Java动态追踪技术探究 在Java虚拟机中,字符串常量到底存放在哪 一次生产 CPU 100% 排查优化实践 聊聊 Java 虚拟机:类的加载 ...
- 深入理解JVM虚拟机(六):虚拟机类加载机制
1. 概述 虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类记载机制. 与那些在编译时需要进行连接工作 ...
- 深入理解JVM(5)——虚拟机类加载机制
在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...
- JVM之类加载机制(基于《深入理解Java虚拟机》之第七章类加载机制)(上)
asd在前两篇文章中,我们总结了Class文件结构以及相应的字节码指令,它让我们明白了Class文件存储格式的具体细节,接下来我们就要学习JVM如何加载Class文件. dsadClass文件应当是一 ...
- 深入理解JVM虚拟机6:深入理解JVM类加载机制
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...
最新文章
- 软件外包是中国程序员的大金矿,大家一起来挣×××吧
- python 除法取模_Python的运算符和表达式(上)
- Spring Transactional还能导致生产事故?
- AI时代,产品经理需要掌握的5项新技能
- 电机贴上锡纸到底有没有作用?
- lightoj 1063 求割点
- python多进程怎么样_Python执行多进程任务的方法
- 作者:刘勇,山东农业大学教授、博士生导师。
- 从一线技术人员到阿里合伙人,主导了去“IOE”,没有他,阿里只能给美国公司打工!...
- CS0656	缺少编译器要求的成员“Microsoft.CSharp..........
- 计算机网络第二章-----物理层
- python Django音乐推荐系统(课设、毕设、学习)
- Android CallStack
- 线段树学习总结 - 关于猹 ACM 生涯的第一次受苦受难
- linux触摸屏校准命令,Linux 触摸屏校准
- 小程序从云服务器获取视频,小程序从云服务器获取视频代码
- Spring Cloud的基本认识和使用Spring Cloud的基本教程
- 2021-10-27 求方向盘转角
- matlab学习笔记(一):清除命令
- 万字长文全解读 | 浅析银行数字化转型之二:打造金融敏捷中心
热门文章
- 有关调试CRM系统的一些感想
- ExpressQuantumGrid.Suite.v6.30 在Delphi 7中的安装 收藏
- 一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)
- 高级C语言教程-sscanf()函数使用方式
- 「 每日一练,快乐水题 」258. 各位相加
- C++ 应用程序性能优化,第 6 章:内存池
- zcmu-1957(状态压缩枚举)
- 区块链技术 好文收藏
- 【译】Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit
- Generative Adversarial Networks 生成对抗网络的简单理解