类从加载到内存虚拟机内存开始,到卸载出内存为止,整个生命周期是:加载,验证,准备,解析,初始化,使用,卸载。
加载,验证,准备,初始化,卸载。这五个阶段的顺序是固定的。类的加载过程必须按照这种过程进行,但解析就不一定了。在某些情况下可以在初始化后再开始。这是为了支持java的动态绑定。注意的是这几个阶段不是一个阶段结束了才会执行下一阶段。有可能是这一阶段执行过程中,下一阶段也开始执行了。
java虚拟机中对加载没有进行强制约束。但对于初始化阶段有且只有一下四种情况必须立即对类进行初始化(之前的几个阶段在此之前开始)
1,遇到new,getstatic,putstatic,和invokestatic这四条字节码指令时,如果类没有初始化,则必须进行初始化。
2,使用java.lang.reflet包的方法对类进行调用的时候。
3,当初始化一个类的时候,如果发现其父类没有进行初始化,则其父类要初始化。
4,当虚拟机启动时,用户需要指定一个要执行的主类(包括main())虚拟机会先进行初始化这个类
例1:
public class SuperClass{
static{
System.out.println("SuperClass init");
}
public static int vlaue = 123;
}
public class SubClass extends SuperClass{
static {
System.out.println("SubClass init");
}
}
public class NotInit{
public static void main(String args[]){
System.out.println(SubClass.value)
}
}
上面只会输出“SuperClass init”
原因:对于静态字段,只有直接定义这个类才会被初始化,通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。
例2:
public class NotInit{
public static void main(String args[]){
SuperClass sc = new SuperClass[10];
}
}
没有输出“SuperClass init”。
例3:
public class ConstClass{
static {
System.out.println("ConstClass init")
}
public static final String HELLOWORLD = "hello world";
}
public class NotInit{
public static void main(String args[]){
System.out.println(ConstClass.HELLOWORLD);
}
上面也不会输出“ConstClass init”
原因:虽然java源码中引用了ConstClass类中的常量HELLOWORLD但是在编译阶段将次常量的值“helloworld”存储到了NotInit类的常量池中,之后只对自己类中的常量池进行了引用。两个类在编译成class文件后就不存在任何联系了。
分享到:
相关推荐
### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`...希望本文能够帮助您更好地掌握Java虚拟机的核心机制之一:类加载初始化。
《Java核心技术系列:Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...
Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...
第1章 :简单地介绍了Java虚拟机的历史并... 第5章:定义了Java虚拟机启动以及类和接口的加载、链接和初始化的过程; 第6章:定义了Java虚拟机指令集; 第7章:提供了一张以操作码值为索引的Java虚拟机操作码助记表。
加载过程包括加载、验证、准备、解析和初始化五个阶段,确保加载的类符合规范且安全。 **虚拟机指令集** Java虚拟机指令集是虚拟机执行的基本操作单元,每条指令对应一个特定的操作,如加载和存储变量、算术运算、...
java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈);... 第五章:加载、链接与初始化
《Java核心技术系列:Java虚拟机规范(Java SE 8版)...第5章定义Java虚拟机启动以及类与接口的加载、链接和初始化过程;第6章阐释并列举Java虚拟机指令集;第7章提供一张以操作码值为索引的Java虚拟机操作码助记符表。
Java虚拟机的运行过程包括加载、验证、准备、解析、初始化等阶段,其中最重要的是解释器和JIT(Just-In-Time)编译器。解释器将字节码逐行解释执行,而JIT编译器会在运行时将热点代码编译成机器码,以提高运行效率。...
Java虚拟机(JVM,Java Virtual Machine)是Java平台的核心组成部分,它负责执行Java程序,为Java代码提供了跨平台的运行环境。Java虚拟机的概念始于Sun Microsystems,现在由Oracle公司继续发展和维护。JVM的设计...
《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...
《Java虚拟机规范(Java SE7版)》由林德霍尔姆著,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕.Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...
本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。...
《Java虚拟机规范(Java SE 7版)》是Java领域最...第5章定义了Java虚拟机启动以及类和接口的加载、链接和初始化过程。第6章阐释并列举了Java虚拟机指令集。第7章提供了一张以操作码值为索引的Java虚拟机操作码助记符表。
《Java虚拟机规范(Java SE 8版)英文版》全面而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,...
《Java核心技术系列:Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...
《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...
1. **类加载子系统**(Class Loader Subsystem):负责将Java类加载到内存中,并对它们进行验证、解析和初始化。每个Java应用程序都有一个类加载器子系统,该子系统包括: - **引导类加载器**(Bootstrap Class ...
2. **类加载机制**:JVM如何找到并加载类文件,包括类加载器、双亲委派模型和类加载过程(加载、验证、准备、解析和初始化)。 3. **内存管理**:JVM内存结构包括堆、栈、方法区等,书中会讲解如何模拟这些区域,...