JVM -- 类的初始化】的更多相关文章

我们知道,我们写的java代码称为源码,想要能够被jvm执行首先需要编译成.class文件,那么编译完到使用又都经理的哪些阶段呢?主要分为以下三个阶段: 加载:查找并加载类的二进制数据(.class文件硬盘到内存的一个过程). 连接 - 验证:确保被加载的类的正确性. - 准备:为类的 静态变量分配内存,并将其初始化为默认值. - 解析:把类中的符号引用转换为直接引用. 初始化:为类的静态变量赋予正确的初始值. 实例(一) class Singleton1 { private static Si…
<深入理解Java虚拟机> 第二版中介绍到了类的加载过程. 一个类从加载入内存到卸载出内存为止,整个生命周期包括: Loading(加载)-----Verification(验证)-----Preparation(准备)-----Resolution(解析)-----Initialization(初始化)-----Using(使用)----Unloading(卸载) 在Initalization 阶段,虚拟机规范严格定一个5种必须立即对类初始化的情况. 1.遇到new ,getstatic p…
在<深入理解Java虚拟机>(第二版,周志明著)中,作者介绍了JVM必须初始化类(或接口)的五种情况,但是是针对JDK7而言的. 那么,在JDK8中,这几种情况有没有变化呢?(我猜测应该会有扩展) 接下来我们探讨一下JDK8中JVM类的初始化这一部分内容. 官方文档为The Java® Virtual Machine Specification, Java SE 8 Edition, 2015-02-13. 类的初始化部分在https://docs.oracle.com/javase/spec…
在<深入理解 Java 虚拟机>(第二版,周志明著)中,作者介绍了 JVM 必须初始化类(或接口)的五种情况,但是是针对 JDK 7 而言的. 那么,在 JDK 8 中,这几种情况有没有变化呢?(我猜测应该会有扩展) 接下来我们探讨一下 JDK 8 中 JVM 类的初始化这一部分内容. 官方文档为 The Java® Virtual Machine Specification, Java SE 8 Edition, 2015-02-13. 类的初始化部分在 https://docs.oracl…
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始化: 2.在静态代码块中进行初始化. 没有经过显式初始化的静态变量将原有的值. 一个比较奇怪的例子: package com.mengdd.classloader; class Singleton { // private static Singleton mInstance = new Singl…
关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量分配内存,并将其初始化为默认值.(比如static int a  = 10 这里给a的默认初始值为0) 解析:把类中的符号引用转换为直接引用. 1.3.初始化 为类的静态变量赋予正确的初始值.(这个时候a的值才为10) 2.类在什么时候被初始化 1)创建类的实例,也就是new一个对象. 2)访问某一…
首次主动此用导致类的初始化 MyParent4 myParent4 = new MyParent4(); MyParent4 myParent5 = new MyParent4(); 输出: MyParent4 static block - -------- 依据:myParent5 new 对象的时候,并没有再次执行MyParent4的静态块. 初始化数组的时候,其类并没有导致被初始化 MyParent4[] myParent4s = new MyParent4[1]; 输出: 依据:new…
虚拟机规范严格规定了有且只有5种情况必须立即对类进行“初始化”(加载.验证.准备等阶段在此之前开始). 遇到new.getstatic.putstatic.invokestatic等4条字节码指令时.生成这4条指令的常见场景是: 使用new关键字实例化对象时. 读取或设置一个类的静态字段(被final修饰.已在编译期把结果放入常量池的静态字段除外)时. 调用一个类的静态方法时. 使用java.lang.reflect包的方法对类进行反射调用时. 准备初始化一个类时发现其父类还没进行初始化,则先对…
Java类的连接与初始化 (及2013阿里初始化笔试题解析)  转自http://www.cnblogs.com/iceAeterNa/p/4876747.html         Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析.   解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初…
深入理解Java对象的创建过程:类的初始化与实例化 对象实例化内存分析: 对内存分配情况分析最常见的示例便是对象实例化: Object obj = new Object(); 这段代码的执行会涉及java栈.Java堆.方法区三个最重要的内存区域. 该语句出现在方法体中,obj会作为引用类型(reference)的数据保存在Java栈的本地变量表中,在Java堆中保存该引用的实例化对象, 但可能并不知道,Java堆中还必须包含能查找到此对象类型数据的地址信息(如对象类型.父类.实现的接口.方法等…