`

JVM中java类的加载时机

 
阅读更多

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和卸载(Unloading)七个阶段。其中验证、准备和解析三个部分统称为连接(Linking),如下如所示。


这七个阶段,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类的加载过程必须按照这个顺序来按部就班地开始,而解析阶段则不一定,它在某些情况下可以在初始化阶段后再开始。

类的生命周期的每一个阶段通常都是互相交叉混合式进行的,通常会在一个阶段执行的过程中调用或激活另外一个阶段。
Java虚拟机规范没有强制性约束在什么时候开始类加载过程,但是对于初始化阶段,虚拟机规范则严格规定了有且只有四种情况必需立即对类进行“初始化”(而加载、验证、准备阶段则必需在此之前开始),这四种情况归类如下:

1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)时、以及调用一个类的静态方法的时候。
2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3.当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要触发父类的初始化。
4.当虚拟机启动时,用户需要指定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类。
对于这四种触发类进行初始化的场景,在java虚拟机规范中限定了“有且只有”这四种场景会触发。这四种场景的行为称为对类的主动引用,除此以外的所有引用类的方式都不会触发类的初始化,称为被动引用。

下面通过三个实例来说明被动引用:

示例1:

父类SuperClass.java 
public class SuperClass {  
    static{  
         System.out.println("SuperClass init!");  
      }  
     public static int value = 123;  
}  
子类SubClass.java
     public class SubClass extends SuperClass {  
     static{  
        System.out.println("SubClass init!");  
    }  
}  
 
主类NotInitialization.java
public class NotInitialization {  
    public static void main(String[] args) {  
        System.out.println(SubClass.value);  
    }  
}  
输出结果:

SuperClass init! 

123  


由结果可以看出只输出了“SuperClass init!”,没有输出“SubClass init!”。这是因为对于静态字段,只有直接定义该字段的类才会被初始化,因此当我们通过子类来引用父类中定义的静态字段时,只会触发父类的初始化,而不会触发子类的初始化。

示例2:

SuperClass[ ]   scs=new SuperClass[11];


如上,当初始化一个对象数组的时候,也不会触发类的初始化。

示例3:

public class ConstClass {

   static {

    system.out.printl("const");

}

   public static final int age =123;  

}

public class NotInitialization{

     public static void main(String[ ] args){

     system.out.println(ConstClass.age);

}

此时并不会出现 “const”,因为在NotInitialization类在编译的时候已经把ConstClass中的变量age放在常量池中了,访问时直接取出age即可,不会引发ConstClass的初始化。

分享到:
评论

相关推荐

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    类加载器文件

    类的加载时机取决于程序的运行情况: - **直接引用**: 当一个类直接引用另一个类时(例如,类A引用类B),JVM会使用加载类A的类加载器来加载类B。 - **反射调用**: 使用`Class.forName()`方法也会触发类的加载。 - ...

    类加载器(java)

    Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...

    java类加载机制

    Java 类加载机制是Java运行时环境的一个核心组成部分,它负责将编译后的Java字节码加载到JVM中,并确保Java应用程序能够正确地运行。类加载机制不仅涉及到类的加载、验证、准备、解析和初始化等步骤,还包括类加载...

    JAVA 类加载机制分析

    每个`Class`实例都关联着一个特定的类加载器,若加载器为`null`,则表示类由引导类加载器(bootstrap loader)加载,这是最基础的加载器,由JVM内置,非Java编写。 自定义类加载器(Custom ClassLoader)允许开发...

    java类加载过程详解.doc

    Java 类加载过程是Java虚拟机(JVM)在运行时动态加载类的机制,它涉及类的生命周期中的几个关键步骤,包括装载、连接、初始化和卸载。下面将详细阐述这些过程。 1. 装载 装载阶段是类加载的起始点,主要分为三个...

    深入理解Java类加载.docx

    Java 类加载机制是Java虚拟机(JVM)的核心组成部分,负责将类的定义从Class文件加载到内存,并对其进行校验、解析和初始化。这个过程确保了程序运行时能够正确使用类的静态和动态特性。本文将深入探讨Java类加载的...

    Java深度历险(二)——Java类的加载、链接和初始化

    Java类的加载、链接和初始化是JVM启动和运行过程中至关重要的步骤。通过类加载器,JVM能够动态地加载类,通过链接和初始化,确保类的正确性和完整性。了解这些过程有助于开发者更好地理解和优化Java程序的性能。

    JAVA 基础培训,JDK和JVM,核心类的介绍和使用

    类的加载时机取决于类的使用情况。当JVM首次遇到类的主动使用时,如创建类的实例、访问类的静态变量或调用静态方法等,JVM会使用相应的类加载器加载该类。被动引用,如反射访问或子类对父类的引用,则不会触发类的...

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    在实际项目中,我们可以通过控制类加载时机、使用动态代理、优化类路径等方式进行性能调优。例如,通过延迟加载(Lazy Loading)减少启动时的资源占用,或者通过CGLIB等库实现运行时代码生成。 总结,JVM类加载...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    详解JAVA类加载机制

    二、类加载时机 什么情况下JVM需要开始加载一个类呢?JVM规范中并没有对此进行强制约束,这点可以交给JVM的具体实现来自由把握。 三、类初始化时机 那么,什么情况下JVM需要开始初始化一个类呢?这在JVM规范中是...

    java类加载知识点整理

    ### Java 类加载机制详解 ...通过深入理解这些阶段及其细节,我们可以更好地掌握Java类加载机制的核心概念,并在实际编程中有效利用这些知识。这对于优化应用性能、排查类加载相关的错误等问题都至关重要。

    Java类加载

    Java 类加载是 JVM 运行时环境的核心组成部分之一,它负责将 Java 字节码文件(`.class` 文件)加载到内存中,并对其进行验证、准备和初始化等操作。本文将详细介绍 Java 类加载的过程、各个阶段的作用以及类加载器...

    浅谈JAVA虚拟机JVM及工作原理

    Java 类加载机制是指 JVM 将 .class 文件加载到内存中,并创建对应的 Class 对象的过程。类加载的时机包括隐式加载和显式加载两种。 7. 类加载的过程 类加载的过程包括加载、验证、准备、解析和初始化五个阶段。...

    深入了解JVM,Java 开发的需要深读

    1. **类加载机制**:JVM在运行时会通过类加载器将.class文件加载到内存中,分为启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器。理解类加载过程,有助于我们处理双亲委托模型、类的初始化时机等问题...

    类加载器代码

    类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的字节码从文件系统或网络中加载到JVM中,并转换为运行时的java.lang.Class对象。类加载器不仅涉及程序的启动,还关系到类的动态加载、类间的隔离以及安全性...

    Java类加载机制实现流程及原理详解

    Java类加载机制是Java虚拟机(JVM)的一部分,它负责将类的二进制数据加载到内存中,并对其进行验证、准备、解析和初始化,以形成可以被JVM直接使用的Java类型。下面是Java类加载机制的实现流程及原理详解。 一、类...

    JVM性能优化相关问题.pdf

    Java中类加载器的种类有多种,最顶层的父加载器是Bootstrap类加载器,其次是Extension类加载器和Application类加载器。此外,还可以通过实现java.lang.ClassLoader类来创建自定义的类加载器。类加载分为隐式加载和...

    类加载器加载过程.rar

    在Java编程语言中,类加载器(ClassLoader)是至关重要的组成部分,它负责将类的字节码转换为可执行的Java对象。理解类加载器的工作原理对于深入掌握Java虚拟机(JVM)运行机制和进行高效的问题排查至关重要。在这个...

Global site tag (gtag.js) - Google Analytics