文档章节

虚拟机类加载机制概叙1:类加载的时机

玄影镜心
 玄影镜心
发布于 2015/06/16 11:24
字数 1034
阅读 13
收藏 0
点赞 0
评论 0

    在java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的(增加了开销,但是更加灵活,动态扩展就是依赖与此)

一:生命周期

    类的生命周期:加载----验证----准备----解析----初始化----使用----卸载      (7个阶段)

    其中:验证、准备、解析3个部分统称为连接阶段

    顺序加载、验证、准备、初始化和卸载,这五个阶段顺序是确定的,类加载过程中严格遵守顺序。而解析阶段在某些情况下可以在初始化之后再开始(为了支持JAVA的动态绑定)


二:什么时候初始化?

    虚拟机规范严格规定了,有且只有5种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始[严格的顺序])。

1:遇到new、getstatic、putstatic或者invokestatic这4条字节码命令时,如果类没有初始化,则触发
2:使用java.lang.reflect包的方法对类进行反射调用时,如果类没有初始化,则触发
3:当初始化一个类时没,如果父类没有初始化没,则先出发其父类初始化
4:当虚拟机启动时,用户需要指定一个要执行的主类(含有main方法的类),虚拟机会先初始化这个主类
5:当使用JDK1.7的动态语言时,如果一个MethodHandle实例最后的解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有初始化,则需要先出发其初始化。

说明:

    1:第一条的使用场景,使用new关键字实例化对象的时候、读取或设置一个类的静态字段时候(被final修饰、在编译期把结果放入常量池的静态字段除外)、调用一个类的静态方法的时候。

    2:除了以上5条之外,所有引用类的方法都不会触发初始化。(被动引用)

代码清单1:被动引用例子一

//初始化ConstClass时会先触发SuperClass的初始化,如果main方法放在ConstClass中,则先初始化ConstClass
//因为含有main方法的主类会被虚拟机优先初始化。  
public class SuperClass {
	static{
		System.out.println("SpuerClass init!");
	}	
	public static int CCC = 123;
}

public class ConstClass extends SuperClass {
	static{
		System.out.println("ConstClass init!");
	}
}

public class Test{
    public static void main(String[] args){
        System.out.println(ConstClass.value);
    }
}

//打印结果:SpuerClass init!
//         123

    从子类调用父类静态变量,子类并未被初始化。由此可见,对于静态字段的调用,只有直接定义这个字段的类才会被初始化。

代码清单2:被动引用例子二

//通过数组定义来引用类,不会触发此类的初始化
public class Test{
    public static void main(String[] args){
        SuperClass[] as = new SuperClass[10];
    }
}

SuperClass并没有被初始化,但是这个段代码触发了另一个名为“Lorg.fenixsoft.classloading.SuperClass”的类的初始化,这是由虚拟机自动生成的、创建动作由newarray指令触发。

代码清单3:被动引用例子三

//SuperClass不会被初始化
public class SuperClass {
	static{
		System.out.println("SpuerClass init!");
	}
	public static final String HELLO = "hello";
}

public class Test{
    public static void main(String[] args){
        System.out.println(SuperClass.HELLO);
    }
}

    常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发这个类的初始化。对HELLO的引用被直接放到Test类的常量池中。


三:接口和类加载的不同点:

    接口与类的加载,真正有所区别的是前面有且只有5种场景的第三种:一个接口在初始化时,并不要求父类接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化。

© 著作权归作者所有

共有 人打赏支持
玄影镜心
粉丝 8
博文 71
码字总数 49025
作品 0
西安
高级程序员
Class文件的加载过程

在class文件中描述的各种信息,最终都需要被加载到虚拟机中之后,才能被运行和使用。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚...

LCZ777 ⋅ 2014/08/05 ⋅ 0

(八)-虚拟机的类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类. 即虚拟机的类加载机制. 与那些在编译时需要进行链接工作的语言不同...

芥末无疆sss ⋅ 2017/12/19 ⋅ 0

深入理解JVM类加载机制

简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 下面我们具体来看类加载的过...

卡巴拉的树 ⋅ 2017/11/25 ⋅ 0

static{}语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 一、在程序的一次执行过程中,sta...

木子木 ⋅ 2014/03/26 ⋅ 0

java中static{}语句块详解

原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,...

巴顿 ⋅ 2014/01/20 ⋅ 0

JVM详解之类加载过程

JVM详解之类加载过程 什么叫类?类在什么时候进行加载?类加载过程发生了什么?或者叫jvm做了哪些工作? 类的概念(.java/.class的区别)和范围扩充 java语言和Java虚拟机的概念 java可以运行...

默默学习中 ⋅ 2016/04/15 ⋅ 0

Java 类的生命周期

参考博文:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/ 上图展示的是类生命周期流向;在本文里,我只打算谈谈类的"初始化"以及"对象实例化"两个阶段。 类初始化 类"初始化"...

Oscarfff ⋅ 2015/04/03 ⋅ 0

虚拟机类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,着就是虚拟机的类加载机制。 类加载时机 类的生命周期 加载、验...

无聊书生 ⋅ 2015/08/13 ⋅ 0

深入理解JVM类加载机制

简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 下面我们具体来看类加载的过...

Shuqing,Wang ⋅ 2017/11/29 ⋅ 0

Java 中的 GC -- GC基础常识

---------- 文中讨论的GC原理均基于 Sun Hotspot JVM,对于不同 JVM 实现可能会有不同。 1. GC (Gabage Collector) 做了什么事情 决定哪些内存需要回收(物理内存的位置)。 决定何时回收这...

longjuelegend ⋅ 2016/08/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部