JVM:类的生命周期
类的生命周期
综述
1. 只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算)
2. 若在加载一个类的过程中,有其他类被切实使用到,则会被一同级联加载到JVM中。
3. 当一个类中的某个符号被第一次使用到时,该类才会被初始化;当类被加载时,它并未被初始化。
4. 初始化顺序:
静态函数/变量初始化(Textual Order)
实例成员变量初始化
构造函数
加载(Loading)
1)类加载器通过类的全限定名来获取定义此类的二进制字节流
2)字节流-> 方法区运行时数据结构
3)在方法区生成java.lang.Class 对象 (作为这个类在方法区的入口)
验证 (Verification)
确保Class字节流中包含的信息符合当前JVM的要求,且不会危害虚拟机安全
1)文件格式验证 (验证字节流是否符合Class文件格式规范)
2)元数据验证(对元数据进行语义校验,确保符合Java语法)
3)字节码验证(对类的方法体进行校验,确保符合语义和逻辑)
4)符合引用验证(对类中的符号引用进行校验,以确保解析动作可正常执行)
准备(Preparation)
为类变量的静态字段在方法区分配内存并设置零值的阶段
1. 进行内存分配的对象仅包括类变量的static字段
2. 初始化的为变量的零值,而非默认值
解析(Resolution)
JVM将常量池内的符号引用替换为直接引用的过程,包括
类/接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符
初始化(Initialization)
执行<clinit>()方法的过程
1. <clinit>()方法是由类变量的赋值动作和static语句块合并产生的;合并后的顺序即自然语句顺序(Textual Order);static语句块只能访问定义在该语句块之前的变量,定义在其后的变量只能赋值,不能访问。
2. JVM自动在子类<clinit>()方法执行之前,先执行父类<clinit>()方法
3. 若类中没有静态语句块,也没有对变量的赋值操作,则compiler可以不生成<clinit>()方法
4. 执行接口的<clinit>()方法前不需要先执行父接口的<clinit>()方法,当需要使用到父接口定义的变量时,再行初始化。
5. 接口的实现类在初始化时不会执行父接口<clinit>()方法
6. JVM保证一个类的<clinit>()方法运行时是线程安全的;但是如果执行<clinit>()的线程退出该方法,其它线程被唤醒后不会再进入<clinit>(),即:一个类加载器下,每个类型只会被初始化一次。
Reference:
https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html#9766
http://www.programcreek.com/2013/01/when-and-how-a-java-class-is-loaded-and-initialized/
http://www.programcreek.com/2011/10/java-class-instance-initializers/
http://stackoverflow.com/questions/7560721/when-does-the-jvm-load-classes
JVM:类的生命周期的更多相关文章
- JVM 类的生命周期、类加载器
类的加载.连接与初始化 • 1. 加载:查找并加载类的二进制数据 • 2. 连接 – 2.1 验证:确保被加载的类的正确性 ...
- Java - JVM - 类的生命周期
概述 简述 JVM 里 类的生命周期 上次写了 30%, 居然丢了 难受, 又要重新写 类的生命周期 加载 使用 卸载 1. 加载 概述 类型的加载 大体流程 装载 连接 验证 准备 解析(可选的) ...
- JVM类加载器及Java类的生命周期
预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...
- JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- Java类的生命周期详解
引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...
- 【转】Java 类的生命周期详解
一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...
- 【转载】详解java类的生命周期
原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...
- [Java]类的生命周期(上)类的加载和连接[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...
随机推荐
- webstorm中github的配置
1.申请一个github账号,我这里的操作是已经有了账号的情况之下进行的. 打开webstorm,File-->settings,弹出settings框,输入git,得到以下界面,输入githu ...
- 0417 jQuery基础知识
jQuery基础知识 jQuery需要引入一个js文件,并且这个文件在所有js代码之前(包括引入的其他js文件) 基础操作(对比js): 1.找标签: js:document.getElement.. ...
- 音频压缩编码 opus 附完整C++代码示例
绝大数人都知道mp3格式编码,以及aac,amr等压缩格式编码. 而在语音通信界有一个强悍的音频格式编码opus. 经过实测,压缩比最高可以达到1:10. 100KB 压缩后 10KB 虽然是有损压缩 ...
- no zuo no die
#include <iostream> #include <cstring> #include <cstdio> using namespace std; name ...
- 【Noip2017游记】
好像是考Noip的第5个年头了...高中的第一次Noip... 考了三年PJ,今年是第二次TG,希望不要像去年那么萎(gou) Day -1 考前停课了挺久的来着的,学长出了N套题来模拟,自己练了DP ...
- ●BZOJ 2154 Crash的数字表格
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2154 题解: 莫比乌斯反演. 题意还是很清楚的,就不赘述了. 显然有 $ANS=\sum_{ ...
- ●BZOJ 2005 NOI 2010 能量采集
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: 一个带有容斥思想的递推.%%% 首先,对于一个点 (x,y) 在路径 (0,0 ...
- 基于 HTML5 的 WebGL 3D 智能楼宇监控系统
前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...
- # C语言程序设计第一次作业1234
---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...
- A TensorBoard plugin for visualizing arbitrary tensors in a video as your network trains.Beholder是一个TensorBoard插件,用于在模型训练时查看视频帧。
Beholder is a TensorBoard plugin for viewing frames of a video while your model trains. It comes wit ...