`

【转】JVM核心之JVM运行和类加载全过程

阅读更多

来源:http://www.cnblogs.com/dooor/p/5289994.html

 

为什么研究类加载全过程?

  • 有助于连接JVM运行过程
  • 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性

 

类加载机制

  • JVMclass文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的java类型的全过程。

 

 

 

  • 加载
    • class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。

 

 

 

  • 链接    java类的二进制代码合并到JVM的运行状态之中的过程
    •   验证:确保加载的类信息符合JVM规范,没有安全方面的问题
    •   准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法去中进行分配
    •   解析:虚拟机常量池的符号引用替换为字节引用过程
  • 初始化
    • 初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句块(static)中的语句合并产生
    • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
    • 虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步
    • 当范围一个Java类的静态域时,只有真正声名这个域的类才会被初始化

 

 

1

复制代码
public class Demo01 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.width);
    }
}

class A{
    public static int width=100; //静态变量,静态域 field
    static{
        System.out.println("静态初始化类A");
        width = 300 ;
    }
    public A() {
        System.out.println("创建A类的对象");
    }
}
复制代码

 

分析:

说明:

内存中存在栈、堆(放创建好的对象)、方法区(实际也是一种特殊堆)

1JVM加载Demo01时候,首先在方法区中形成Demo01类对应静态数据(类变量、类方法、代码),同时在堆里面也会形成java.lang.Class对象(反射对象),代表Demo01类,通过对象可以访问到类二进制结构。然后加载变量A类信息,同时也会在堆里面形成a对象,代表A类。

2main方法执行时会在栈里面形成main方法栈帧,一个方法对应一个栈帧。如果main方法调用了别的方法,会在栈里面挨个往里压,main方法里面有个局部变量A类型的a,一开始a值为null,通过new调用类A的构造器,栈里面生成A()方法同时堆里面生成A对象,然后把A对象地址付给栈中的a,此时a拥有A对象地址。

3、当调用A.width时,调用方法区数据。

 

当类被引用的加载,类只会加载一次

  • 类的主动引用(一定会发生类的初始化)
    • new一个类的对象
    • 调用类的静态成员(除了final常量)和静态方法
    • 使用java.lang.reflect包的方法对类进行反射调用
    • 当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类
    • 当初始化一个类,如果其父类没有被初始化,则先初始化它父类
  • 类的被动引用(不会发生类的初始化)
    • 当访问一个静态域时,只有真正声名这个域的类才会被初始化
      • 通过子类引用父类的静态变量,不会导致子类初始化
    • 通过数组定义类的引用,不会触发此类初始化
    • 引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)

例2:

复制代码
public class Demo01 {
    static{
        System.out.println("静态初始化Demo01");
    }
    
    
    public static void main(String[] args) throws Exception {
        System.out.println("Demo01的main方法!");
        System.out.println(System.getProperty("java.class.path"));
        
        //主动引用
//        new A();
//        System.out.println(A.width);
//        Class.forName("com.sinosoft.test.A");
        
        
        //被动引用
//        System.out.println(A.MAX);
//        A[] as = new A[10];
        System.out.println(B.width);//B类不会被加载
        
    }
}

class B  extends A {
    static {
        System.out.println("静态初始化B");
    }
}

class A extends A_Father {
    public static int width=100;   //静态变量,静态域    field
    public static final  int MAX=100; 
    
    static {
        System.out.println("静态初始化类A");
        width=300;
    }
    public A(){
        System.out.println("创建A类的对象");
    }
}

class A_Father extends Object {
    static {
        System.out.println("静态初始化A_Father");
    }
}
分享到:
评论

相关推荐

    JVM类加载过程.pptx

    JVM的类加载机制是JVM的核心机制之一,它把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初识化,形成可以被虚拟机直接使用的Java类型。 Java代码执行流程是JVM的核心流程之一,它首先通过...

    JVM核心教程之JVM运行与类加载全过程详解

    《JVM核心教程之JVM运行与类加载全过程详解》 在Java开发中,了解JVM(Java Virtual Machine)的工作原理对于优化程序性能至关重要。本文将深入探讨JVM如何加载和运行类,揭示这一过程的详细步骤。 首先,类加载器...

    jvm 启动过程 JVM 原理

    JVM由多个组件构成,包括类加载器、运行时数据区、执行引擎、本地方法接口和本地库。 JVM的启动过程可以分为以下几个关键步骤: 1. **加载**:当Java应用程序启动时,JVM首先通过类加载器加载主类(即包含main方法...

    JVM:类加载器子系统.pdf

    Java虚拟机(JVM)的类加载器子...而类加载器作为类加载过程中的关键组件,其设计使得Java应用程序能够灵活地加载和运行各种不同的类文件。同时,双亲委派机制和沙箱安全机制进一步确保了加载过程的安全性和可靠性。

    JVM类加载机制1

    Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件加载到内存中,进行一系列处理并使其成为可执行的Java类型。这个过程包括五个主要阶段:加载、验证、准备、解析和初始化。 1...

    《 从NoSuchMethodError看jvm编译和class加载方式》的测试项目代码

    JVM(Java虚拟机)采用“双亲委派模型”加载类,即当一个类被加载时,它会首先尝试由启动类加载器(Bootstrap ClassLoader)加载,如果该类不在启动类加载器的路径中,则会委托给扩展类加载器(Extension ...

    jvm系列一java类的加载机制.doc

    Java虚拟机(JVM)系列的第一部分主要探讨的是Java类的加载机制,这是一个关键的运行时过程,确保程序能够正确地使用和执行类。类加载机制涉及到类从磁盘读取到内存,以及如何在JVM中管理和表示这些类。 1. 类的...

    深入Java虚拟机JVM类加载学习笔记

    当`MyTest`类运行时,JVM会先加载`Singleton`类,并初始化其静态成员变量。由于`Singleton`类中的静态变量`singleton`已经提前实例化,因此调用`GetInstance()`方法可以直接返回已创建的实例。 通过以上内容的学习...

    JVM--字节码和类的加载篇1

    "JVM--字节码和类的加载篇1"这个标题暗示了我们将深入理解JVM如何处理字节码以及类加载的过程。 在Java的Class文件中,数据类型扮演着基础的角色。描述符是用来表示各种数据类型的,包括基本数据类型如byte、char和...

    坚持写博客第一周--java基础知识回顾--jvm类加载1(csdn)————程序.pdf

    Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件从磁盘加载到内存中,并进行一系列处理以确保安全性和正确性。当我们通过`java`命令运行一个Java程序时,类加载器会开始工作...

    jvm类装载器原理

    Java的JVM(Java Virtual Machine)类装载器是Java运行时系统的重要组成部分,负责在程序运行期间查找并加载类的二进制数据。理解类装载器的工作原理对于优化Java应用性能和实现动态加载类至关重要。 装载过程包括...

    深入理解JVM内存结构及运行原理全套视频加资料

    包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码  第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲...

    java类加载器

    在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了Java程序在多线程环境中的安全性和隔离性。类加载器...

    类加载器代码

    总结来说,类加载器是Java运行时环境的关键组件,它决定了类的生命周期和加载方式,是理解和优化JVM性能、实现动态加载、保障系统安全等方面不可或缺的知识点。深入理解类加载器的工作原理和机制,对于开发高效、...

    JVM入门到JVM 调优实战

    总结来说,从JVM入门到实战调优,涉及了Java程序从编译到执行的全过程,包括Class文件格式、类加载、内存模型、运行时数据区、垃圾收集策略以及调优实践等多个层面。深入理解和掌握这些知识,不仅有助于提升Java程序...

    java之jvm学习笔记五(实践写自己的类装载器)

    1. **启动类装载器**:这是JVM内置的最基础的类装载器,负责加载JRE/lib目录下的核心类库,如rt.jar,保证了Java运行环境的基础功能。 2. **扩展类装载器**:负责加载JRE/lib/ext目录下的jar文件,提供Java的扩展...

    全套JVM面试题!面试必备!

    类加载过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)。类加载器主要有Bootstrap ClassLoader、Extension ClassLoader、Application ...

    JVM.pdf

    接着,JVM加载Class文件的原理机制基于类加载器(ClassLoader)。类加载器按需加载类,分为隐式加载(如`new`操作)和显式加载(如`Class.forName()`)。这种按需加载策略优化了加载速度和内存使用。 Java内存分配...

Global site tag (gtag.js) - Google Analytics