精华内容
下载资源
问答
  • JVM类加载过程

    万次阅读 多人点赞 2019-06-20 15:10:25
    1. JVM类加载过程 1.概述 从的生命周期而言,一个包括如下阶段: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下...

    1. JVM类加载过程

        1.概述

        从类的生命周期而言,一个类包括如下阶段:

        

            加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。

        2. 类加载时机

        加载(loading)阶段,java虚拟机规范中没有进行约束,但初始化阶段,java虚拟机严格规定了有且只有如下5种情况必须立即进行初始化(初始化前,必须经过加载、验证、准备阶段):

        (1)使用new实例化对象时,读取和设置类的静态变量、静态非字面值常量(静态字面值常量除外)时,调用静态方法时。

        (2)对内进行反射调用时。

        (3)当初始化一个类时,如果父类没有进行初始化,需要先初始化父类。

        (4)启动程序所使用的main方法所在类

        (5)当使用1.7的动态语音支持时。

        如上5种场景又被称为主动引用,除此之外的引用称为被动引用,被动引用有如下3种常见情况

    • 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
    • 定义对象数组和集合,不会触发该类的初始化
    • 类A引用类B的static final常量不会导致类B初始化(注意静态常量必须是字面值常量,否则还是会触发B的初始化)
    public class TestClass {
        public static void main(String[] args) {
            System.out.println(ClassInit.str);
            System.out.println(ClassInit.id);
        }
    }
    class ClassInit{
        public static final long id=IdGenerator.getIdWorker().nextId();//需要初始化ClassInit类
        public static final String str="abc";//字面值常量
        static{
            System.out.println("ClassInit init");
        }
    }
    • 通过类名获取Class对象,不会触发类的初始化。如System.out.println(Person.class);
    • 通过Class.forName加载指定类时,如果指定参数initialize为false时,也不会触发类初始化。
    • 通过ClassLoader默认的loadClass方法,也不会触发初始化动作

        注意:被动引用不会导致类初始化,但不代表类不会经历加载、验证、准备阶段。

        3. 类加载方式

        这里的类加载不是指类加载阶段,而是指整个类加载过程,即类加载阶段到初始化完成。

       (1)隐式加载

    • 创建类对象
    • 使用类的静态域
    • 创建子类对象
    • 使用子类的静态域
    • 在JVM启动时,BootStrapLoader会加载一些JVM自身运行所需的class
    • 在JVM启动时,ExtClassLoader会加载指定目录下一些特殊的class
    • 在JVM启动时,AppClassLoader会加载classpath路径下的class,以及main函数所在的类的class文件

        (2)显式加载

    • ClassLoader.loadClass(className),只加载和连接、不会进行初始化
    • Class.forName(String name, boolean initialize,ClassLoader loader); 使用loader进行加载和连接,根据参数initialize决定是否初始化。

    2. 加载阶段

        加载是类加载过程中的一个阶段,不要将这2个概念混淆了。

        在加载阶段,虚拟机需要完成以下3件事情:

    • 通过一个类的全限定名来获取定义此类的二进制字节流
    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

        加载.class文件的方式

    • 从本地系统中直接加载
    • 通过网络下载.class文件
    • 从zip,jar等归档文件中加载.class文件
    • 从专有数据库中提取.class文件
    • 将Java源文件动态编译为.class文件    

        相对于类生命周期的其他阶段而言,加载阶段(准确地说,是加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。

    3. 连接阶段

      3.1 验证:确保被加载的类的正确性

        确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

    • 文件格式验证:验证字节流是否符合Class文件格式的规范,如:是否以模数0xCAFEBABE开头、主次版本号是否在当前虚拟机处理范围内等等。
    • 元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求;如:这个类是否有父类,是否实现了父类的抽象方法,是否重写了父类的final方法,是否继承了被final修饰的类等等。
    • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如:操作数栈的数据类型与指令代码序列能配合工作,保证方法中的类型转换有效等等。
    • 符号引用验证:确保解析动作能正确执行;如:通过符合引用能找到对应的类和方法,符号引用中类、属性、方法的访问性是否能被当前类访问等等。

        验证阶段是非常重要的,但不是必须的。可以采用-Xverify:none参数来关闭大部分的类验证措施。

      3.2 准备:为类的静态变量分配内存,并将其赋默认值

        为类变量分配内存并设置类变量初始值,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:

    • 只对static修饰的静态变量进行内存分配、赋默认值(如0、0L、null、false等)。
    • 对final的静态字面值常量直接赋初值(赋初值不是赋默认值,如果不是字面值静态常量,那么会和静态变量一样赋默认值)。

      3.3 解析:将常量池中的符号引用替换为直接引用(内存地址)的过程

        符号引用就是一组符号来描述目标,可以是任何字面量。属于编译原理方面的概念如:包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

        直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。如指向方法区某个类的一个指针。

        假设:一个类有一个静态变量,该静态变量是一个自定义的类型,那么经过解析后,该静态变量将是一个指针,指向该类在方法区的内存地址。 具体见后续文章。

    4. 初始化:为类的静态变量赋初值

        赋初值两种方式:

    • 定义静态变量时指定初始值。如 private static String x="123";
    • 静态代码块里为静态变量赋值。如 static{ x="123"; } 

        注意:只有对类的主动使用才会导致类的初始化。

    5. clinit 与 init

        在编译生成class文件时,编译器会产生两个方法加于class文件中,一个是类的初始化方法clinit, 另一个是实例的初始化方法init。

      5.1 clinit 

        clinit指的是类构造器,主要作用是在类加载过程中的初始化阶段进行执行,执行内容包括静态变量初始化和静态块的执行。

        注意事项:

        1. 如果类中没有静态变量或静态代码块,那么clinit方法将不会被生成。

        2. 在执行clinit方法时,必须先执行父类的clinit方法。

        3. clinit方法只执行一次。

        3. static变量的赋值操作和静态代码块的合并顺序由源文件中出现的顺序决定。如下代码所示:

    public class TestClass {
        public static void main(String[] args) {
            ClassInit init=ClassInit.newInstance();
    
            System.out.println(init.x);
            System.out.println(init.y);
        }
    }
    
    class ClassInit{
        private static ClassInit init=new ClassInit();
        public static int x;
        public static int y=0;
        static{
            x=10;
            y=10;
        }
        private ClassInit(){
            x++;
            y++;
        }
        public static ClassInit newInstance(){
            return init;
        }
    }
    //在类加载到连接完成阶段,ClassInit类在内存中的状态为:init=null,x=0,y=0
    //初始化阶段时,需要执行clinit方法,该方法类似如下伪代码:
    clinit(){
    	//init=new ClassInit();调用构造方法
        x++;//x=1 因为此时x的值为连接的准备阶段赋的默认值0,然后++变成1
        y++;//y=1 因为此时y的值为连接的准备阶段赋的默认值0,然后++变成1
        //x=0;//为什么这里没有执行x=0,因为程序没有给x赋初值,因此在初始化阶段时,不会执行赋初值操作
        y=0;//因为类变量y在定义时,指定了初值,尽管初值为0,因此在初始化阶段的时候,需要执行赋初值操作
        x++;//第一个静态块的自增操作,结果为x=2;
        y++;//第一个静态块的自增操作,结果为y=1;
    }
    //所以最终结果为x=2,y=1
    //如果private static ClassInit init=new ClassInit(); 代码在public static int y=0;后面,那么clinit方法的伪代码如下:
    clinit(){
        //x=0;//这里虽然没有执行,但此时x的值为连接的准备阶段赋的默认值0
        y=0;//因为类变量y在定义时,指定了初值,尽管初值为0,因此在初始化阶段的时候,需要执行赋初值操作
    	//init=new ClassInit();调用构造方法
        x++;//x=1 因为此时x的值为连接的准备阶段赋的默认值0,然后++变成1
        y++;//y=1 因为此时y的值为初始化阶段赋的初值,只是这个初值刚好等于默认值0而已,然后++变成1
        x++;//第一个静态块的自增操作,结果为x=2;
        y++;//第一个静态块的自增操作,结果为y=2;
    }
    //最终结果为x=2,y=2

        5.2 init

        init指的是实例构造器,主要作用是在类实例化过程中执行,执行内容包括成员变量初始化和代码块的执行。

        注意事项:

        1. 如果类中没有成员变量和代码块,那么clinit方法将不会被生成。

        2. 在执行init方法时,必须先执行父类的init方法。

        3. init方法每实例化一次就会执行一次。

        3. init方法先为实例变量分配内存空间,再执行赋默认值,然后根据源码中的顺序执行赋初值或代码块。如下代码所示:

    public class TestClass {
        public static void main(String[] args) {
            ClassInit init=new ClassInit();
        }
    }
    
    class ClassInit{
        public int x;
        public int y=111;
        public ClassInit(){
            x=1;
            y=1;
        }
        {
            x=2;
            y=2;
        }
        {
            x=3;
            y=3;
        }
    }
    //实例化步骤为:先为属性分配空间,再执行赋默认值,然后按照顺序执行代码块或赋初始值,最后执行构造方法
    //根据上述代码,init方法的伪代码如下:
    init(){
    	x=0;//赋默认值
        y=0;//赋默认值
        y=111;//赋初值
        x=2;//从上到下执行第一个代码块
        y=2;//从上到下执行第一个代码块
        x=3;//从上到下执行第二个代码块
        y=3;//从上到下执行第二个代码块
        //ClassInit();执行构造方法
        x=1;//最后执行构造方法
        y=1;//最后执行构造方法
    }
    //如果上述代码的成员变量x,y的定义在类最后时,那么init方法的伪代码如下:
    init(){
    	x=0;//赋默认值
        y=0;//赋默认值
        x=2;//从上到下执行第一个代码块
        y=2;//从上到下执行第一个代码块
        x=3;//从上到下执行第二个代码块
        y=3;//从上到下执行第二个代码块
        y=111;//赋初值
        //ClassInit();执行构造方法
        x=1;//最后执行构造方法
        y=1;//最后执行构造方法
    }

    6. 卸载阶段

        执行了System.exit()方法

        程序正常执行结束

        程序在执行过程中遇到了异常或错误而异常终止

        由于操作系统出现错误而导致Java虚拟机进程终止
       

    展开全文
  • JVM类加载过程

    千次阅读 2018-04-17 20:52:12
    (一)类加载JVM内存中图解: (二)(JVM)工作机制:(1)装载:查找和导入Class(二进制)文件。(2)链接:把的二进制数据合并到JRE中; ①验证:检查载入Class文件数据的正确性。 ②准备:给的静态...

    (一)类加载JVM内存中图解:

     

    (二)(JVM)工作机制:

    (1)装载:查找和导入Class(二进制)文件。

    (2)链接:把类的二进制数据合并到JRE中;

             ①验证:检查载入Class文件数据的正确性

             ②准备:给类的静态变量static)分配存储空间 。

             ③解析:将符号引用--转成-->直接引用

     (3)初始化:对(static)类的静态变量静态代码块儿执行初始化操作。

     【注意:Java动态拓展 由运行期动态加载动态链接实现的】比如:如果编写一个使用接口的应用程序,可以等到运行时再指定其实际的实现(多态),解析过程有时候还可以在初始化之后执行;比如:动态绑定(多态)

    (三)过程详解:

    (1)加载:类的Class文件的二进制数据---读入内存-->放在方法区,然后再创建java.lang.Class对象【用来封装类在方法区内的数据结构】

             加载.class文件方式:

    ---->对应JVM虚拟机做的事儿

     

    (二)验证:

     

    (三)准备:为类变量分配内存并设置类变量初始值方法区中进行】:

     

    (四)解析:【常量池的】符号引用--->直接引用的过程:

    (五)初始化【真正执行Java代码】:为类的静态变量赋正确的初始值。

    (1)java中对类变量进行初始化值设定的两种方式:

    (2)JVM初始化步骤:

     

    (3)初始化阶段执行构造器的过程:

     

    (4)初始化的触发条件: 

    展开全文
  • JVM类加载过程-面试题

    2020-10-26 11:37:11
    类加载过程大致分为三部分:加载、连接、初始化,其中连接过程分为:验证、准备、解析,其中顺序没有明确要求,总的来说在初始化之前前面步骤都要完成,具体以什么顺序完成则没有明确规定。 加载 加载过程分为三...

    前言

    我们知道虚拟机JVM要运行一个代码,需要我们先把.java文件编译成.class文件,然后把.class文件加载到JVM中,最后运行main方法。本篇class文件加载到JVM过程,面试经常问到。

    类周期

    类加载过程

    类加载过程大致分为三部分:加载、连接、初始化,其中连接过程分为:验证、准备、解析,其中顺序没有明确要求,总的来说在初始化之前前面步骤都要完成,具体以什么顺序完成则没有明确规定。

    加载

    加载过程分为三步骤:

    1、获取定义此类的二进制字节流,通过包名类名定位到class文件流,也可以自定义通过网络或者其他方式获取,通过这个性质,可以自定义类加载器实现热加载等等。

    2、二进制字节流代表的静态存储结构转化成运行时方法区的数据结构,static修饰的变量

    3、内存中生成java.lang.Class对象代表此类,作为方法区这个类的各种数据访问接口(java.lang.Class也是对象但存储在方法区,不存储在堆)

    验证(连接)

    验证过程大致分为四大类,当然验证的逻辑不仅仅这些,详细过程方式不细讲。

    1、文件格式验证:字节流是否符合Class文件规范

    2、元数据验证:类描述是否符合规范

    3、字节码验证:语义定义是否符合规范

    4、符合引用验证:根据全限名是否能找到类等等

    准备(连接)

    正式为类变量分配内存和初始化(类变量可以理解为static修饰的变量),初始化是把变量赋值为数据类型的零值(java中基本类型的默认值是0,引用类型会默认为null),除非被final修饰的类变量,会直接初始化为指定值。

    解析(连接)

    将常量池内的符号引用替换成直接引用的过程

    初始化

    类加载过程的最后步骤,根据程序员的主观计划去初始化类变量和其他资源,执行clinit()方法过程,根据编写的代码对类变量进行赋值等操作,执行父类、子类的static变量和static静态块,注意如果是接口,不用执行父类的static变量和static静态块,除非子类用到父类的static变量和static静态块。

    展开全文
  • jvm-类加载过程

    千次阅读 2018-08-12 20:41:35
    1.类加载机制 类加载阶段:虚拟机要完成的3件事情: 1)通过一个的完全限定名来 获取 此类的二进制字节流 2)将这个字节流所代表的静态 存储结构转化为方法区的运行时 数据结构 3)在 内存生产java.lang,...

    1.类加载机制

    类加载阶段:虚拟机要完成的3件事情:
    1)通过一个类的完全限定名来 获取 此类的二进制字节流
    2)将这个字节流所代表的静态 存储结构转化为方法区的运行时 数据结构
    3)在 内存生产java.lang,Class对象,作为 换个类的各种数据访问入口。
    在 Java 中默认提供了三个类加载器,分别是BootstarapClassLoader、ExtClassLoader、AppClassLoader,它们各自只负载加载规定目录内的Class文件,其中BootSrapCLassLoader 加载的目录为 JRE/lib/rt.jar 。ExtClassLoader 加载目录为JRE/lib/ext,appClassLoader 加载目录为classPath。

    2.双亲委派制

    双亲委派制就是当加载一个Class文件时会先交由上层ClassLoader来加载,如果发现已加载则直接返回,如果没有加载则去当前ClassLoader 的classes目录寻找该Class文件,找到则加载,找不到则交由下层ClassLoader来继续加载,如果直到最下层加载器都无法加载(找不到该Class文件)则抛出ClassNotFoundException异常。

    3.类 加载过程

    这里写图片描述
    加载
    通过类的全路径将这个类从外部加载到jvm中,同时在方法区生成该类的描述信息并在内存生成该类的Claas类型。作为方法区这个类的数据访问入口。
    验证
    字节码格式验证,如对jvm是否有害,释放符合当前虚拟机的要求 。
    准备
    为类的静态变量分配内存并根据这个静态变量所属的数据类型进行初始化。
    解析
    将符号引用替换成直接引用

    初始化
    在初始化阶段会调用类的初始化方法clinit()为静态变量赋予实际的值(例如将value赋值为123)、执行静态代码块。在 JVM 规范中没有强制约束加载的时机,不过对于初始化,JVM规范严格规定了有且只有5种情况必须立即对类进行初始化:
    下面我们讲解 一下clinit()方法是怎么生成的。clinit()方法是编译器 自动收集类中的静态变量和静态语句所产生的。编译器收集的顺序是由语句出现的顺序 所 决定的,静态语句块只能复制定义在它后面的变量,但是不能使用,如下 图 所示,而且虚拟机规范保证,父类的clinit()方法一定 在子类之前执行,但不是 通过继承来的。
    这里写图片描述

    4.自定义类加载器:

    public class CustomerClassLoaderTest  extends ClassLoader{
       private final String classDir;
    
        public CustomerClassLoaderTest(String classDir) {
            this.classDir = classDir;
        }
    
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            String fileName = name;
            if (fileName.indexOf('.') != -1) {
                fileName = fileName.replaceAll("\\.", "\\\\");
            }
            fileName = fileName + ".class";
            try {
                try (FileInputStream in = new FileInputStream(classDir + fileName)) {
                    try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while ((len = in.read(buffer)) != -1) {
                            out.write(buffer,0,len);
                        }
                        byte[] data = out.toByteArray();
                        return defineClass(name, data, 0, data.length);
                    }
                }
            } catch (IOException e) {
                throw new ClassNotFoundException(name);
            }
    
    
        }
    
    
    
    }

    参考:
    《深入理解Java虚拟机(第2版)》

    展开全文
  • JVM加载一个过程

    2020-08-31 11:14:35
    本文主要介绍了JVM加载一个过程。具有很好的参考价值,下面跟着小编一起来看下吧
  • JVM类加载机制详解(一)JVM类加载过程

    万次阅读 多人点赞 2016-05-05 16:07:06
    1、什么是类加载类加载的时机? 2、什么是初始化?什么时候进行初始化? 3、什么时候会为变量分配内存? 4、什么时候会为变量赋默认初值?什么时候会为变量赋人为设定的初值? 5、类加载器是什么? 6、如何...
  • jvm加载类机制CLass Loading
  • jvm加载类过程

    2018-04-08 22:10:35
    编译 javac 类名.java java编译一个时 如果这个所依靠的还没有被编译,则会先编译被依靠的 然后引用,如果 被编译了 则直接引用, 如果找不到该所依赖的的.class或.Java文件 编译器将报“can't find ...
  • jvm类加载和解析过程(总结性质)

    千次阅读 2018-03-18 22:47:30
    类加载机制的定义:把class文件加载到内存,对数据进行校验解析和初始化最终形成虚拟机直接使用的java类型。具体来说:1 通过一个的全限定名来获取定义此类的二进制字节流。2 将这个字节流所代表的静态存储结构...
  • java程序在对某个进行引用、使用时,就会开始对该进行加载,比如直接使用类加载器进行显式加载、创建该的对象、使用该变量等情况。加载是通过java虚拟机的类加载子系统完成的。加载主要分为三个...
  • JVM类加载过程.pptx

    2021-05-07 15:16:58
    JVM类加载过程
  • JVM类生命周期概述:加载时机与加载过程

    万次阅读 多人点赞 2017-05-18 13:48:22
    一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述的类的各种信息,最终都需要...本文概述了JVM加载类的时机和过程,并结合典型案例分析了类的初始化阶段,揭开了JVM类加载机制的神秘面纱。
  • 我们都知道一个java程序运行要经过编译和执行,但是这太概括了,中间还有很多步骤,下面这篇文章主要给大家介绍了关于JVM核心教程之JVM运行与类加载过程的相关资料,文中通过示例代码介绍的非常详细,需要的朋友...
  • 主要介绍了JVM类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载JVM 内存,然后再转化为 class 对象。,需要的朋友可以参考下
  • 二、Java虚拟机启动、加载类过程分析Step 1.根据JVM内存配置要求,为JVM申请特定大小的内存空间Step 2. 创建一个引导类加载器实例,初步加载系统类到内存方法区区域中;Step 3. 创建JVM 启动器实例 Launcher,并取得...
  • 图解JVM类加载机制与类加载过程

    千次阅读 2017-03-01 15:51:25
    一、为什么说Jabalpur语言是跨平台的二、Java虚拟机启动、加载类过程分析三、类加载器有哪些?其组织结构是怎样的?四、双亲加载模型的逻辑和底层代码实现是怎样的?五、类加载器与Class 实例的关系六、线程上下文...
  • JVM类加载过程——解析。

    千次阅读 2018-04-16 16:35:39
    解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,在Class文件中他以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现,那解析阶段中所说的直接引用与符号引用又...
  • JVM加载类过程

    万次阅读 2018-11-29 14:30:53
    JVM把class文件加载到内存中变成共有三大步骤,加载,链接,初始化。其中,链接需要验证是否符合JVM规范,而没有经过初始化的,在内存里是不能使用的。 大家都知道,java语言可以把类型分两大,基本类型...
  • (注:为了理解方便,这里没有考虑懒加载的情况,事实上的JVM加载类过程比这复杂的多) 加载顺序: 1. 加载java.lang.Object、java.lang.System、java.io.PrintStream、java,lang.Class  AppClassLoader...
  • JVM类加载机制和创建对象的过程

    千次阅读 2018-02-13 14:29:39
    1、JVM运行和类加载过程一、加载机制类加载机制:JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM 可以直接使用的Java类型的过程。主要有三步:加载、连接、初始化。其中连接又可以细分...
  • JVM类加载器之加载过程

    千次阅读 2018-11-07 23:30:07
    但是类加载器究竟是如何工作的,什么时候开始加载类,又有哪些具体步骤,类的生命周期又是如何的?我觉得了解这些对我们了解jvm虚拟机是非常有帮助的。 概述 类从被加载到虚拟机内存中开始,到卸载出内存...
  • jvm类加载顺序

    千次阅读 2017-11-29 16:52:59
    JVM类加载顺序 今天,梳理一下类加载顺序,从测试结果来推测类加载顺序。 第一步:基础准备 父类: public class Parent { public String parentProperty="ParentPropertyValue"; public static ...
  • JVM类加载器机制与类加载过程

    千次阅读 2016-09-11 22:29:26
    二、Java虚拟机启动、加载类过程分析 三、类加载器有哪些?其组织结构是怎样的? 四、双亲加载模型的逻辑和底层代码实现是怎样的? 五、类加载器与Class 实例的关系 六、线程上下文加载器 一、为什么说...
  • JVM加载class文件的原理机制 Java中的所有,必须被装载到jvm中才能运行,这个装载工作是由jvm中的装载器完成的,装载器所做的工作实质是把文件从硬盘读取到内存中
  • JVM 类加载机制、对象的创建过程

    千次阅读 2020-06-03 11:48:51
    目录类加载过程类加载类加载机制类加载时机类加载方式对象的创建过程对象的内存布局对象的访问方式   类加载jvm读取.class文件,解析获取的信息,生成对应的Class对象。   类加载过程 主要分为...
  • JVM类加载过程

    千次阅读 2019-03-16 11:38:42
    创建类加载器,类加载器从类路径根据需要加载的类的全限定名找到类文件.class,加载类文件,读取类文件字节码流,然后根据类文件的标准格式解析类文件内容,如最开头是魔数,然后是主次版本号等,根据静态常量池创建...
  • 019-JVM-加载过程

    万次阅读 2020-12-21 21:13:24
    1.类加载子系统 类加载子系统负责从文件系统或者网络中加载class文件到运行时数据区。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载信息存放在一块成为方法区的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 184,071
精华内容 73,628
关键字:

jvm加载类的过程