精华内容
下载资源
问答
  • java 类加载执行过程

    千次阅读 2019-11-28 20:29:34
    编译器会将Java文件编译成 .class 文件,JVM会加载执行 .class 文件。下面的图展示了JVM的整体架构。 JVM 架构图 JVM在是如何工作的 如上图所示,JVM由三个子系统构成。 类加载系统 (Class Loader ...

    JVM的定义

    VM(虚拟机)是用软件实现的物理机,Java的一个重要的设计理念就是编写一次,到处运行,而运行的载体,就是VM。编译器会将Java文件编译成 .class 文件,JVM会加载并执行 .class 文件。下面的图展示了JVM的整体架构。

    JVM 架构图

    JVM在是如何工作的

    如上图所示,JVM由三个子系统构成。

    1. 类加载系统 (Class Loader Subsystem)
    2. 执行时数据区域(Runtime Data Area)
    3. 执行引擎(Execution Engine)

    1. 类加载子系统(Class Loader Subsystem)

    类加载子系统负责动态加载类,在运行时(而非编译时),当一个类初次被引用的时候,它将被加载、链接、初始化。

    1.1 加载(Load)

    类加载子系统主要🈶️三个具体的类加载器,包括引导加载器(BootStrap ClassLoader), 扩展加载器(Extension ClassLoader),应用加载器(Application ClassLoader)

    1. 引导加载器 BootStrap ClassLoader – 负责从 bootstrap classpath 中加载类,有且只有一个 rt.jar 文件,该加载器具有最高优先级。
    2. Extension ClassLoader – 负责从 ext 目录中加载类,ext 目录定义为 jre\lib。
    3. Application ClassLoader – 负责从应用定义的 classpath 的中加载类,用户可以通过指定环境变量的方式定义该目录。如: java -classpath

    以上类加载器通过双亲委派模型执行类加载:

    当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。

    采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。

    1.2 链接(Link)

    1. 校验(Verify) – 字节码验证器会验证生成的字节码是否正确,如果校验失败,会返回校验错误。
    2. 准备(Prepare) – 所有的静态变量会被分配内存并且赋默认值。
    3. 解析(Resolve) – 所有的符号内存引用 symbolic memory references 将被方法区的原始引用替代。

    1.3 初始化

    初始化是类加载的最后一步,在这里静态变量会被赋予初值,静态方法区会被执行。

    2. 运行时数据区(Runtime Data Area)

    运行时数据区可以划分为五个区域

    1. 方法区(Method Area) – 所有的类级别的数据都会存储到这里,包括静态变量。方法区在JVM中是唯一的,她是共享资源。
    2. 堆区(Heap Area) – 所有的对象和她对应的实例变量和数组都被存储在这个区域。堆区也是唯一的、线程共享的资源,所以存储在该区域的数据并不是线程安全的。
    3. 堆栈区(Stack Area):对于每个线程,将创建单独的运行时堆栈。对于每个方法调用,将在堆栈存储器中产生一个条目,称为堆栈帧。所有局部变量将在堆栈内存中创建。堆栈区域是线程安全的,因为它不共享资源。堆栈框架分为三个子元素:
    • 局部变量数组(Local Variable Array):与方法相关,涉及局部变量,并在此存储相应的值
    • 操作数堆栈(Operand stack):如果需要执行任何中间操作,操作数堆栈将充当运行时工作空间来执行操作
    • 帧数据(Frame Data):对应于方法的所有符号存储在此处。在任何异常的情况下,捕获的区块信息将被保持在帧数据中;

    4. PC寄存器(PC Registers):每个线程都有单独的PC寄存器,用于保存当前执行指令的地址。一旦执行指令,PC寄存器将被下一条指令更新;

    5. 本地方法堆栈(Native Method stacks):本地方法堆栈保存本地方法信息。对于每个线程,将创建一个单独的本地方法堆栈。

    3. 执行引擎

    分配给运行时数据区的字节码将由执行引擎执行,执行引擎读取字节码并逐个执行。

    3.1 解释器:解释器更快地解释字节码,但执行缓慢。解释器的缺点是当一个方法被调用多次时,每次都需要一个新的解释;

    3.2 JIT编译器:JIT编译器消除了解释器的缺点。执行引擎将在转换字节码时使用解释器的帮助,但是当它发现重复的代码时,将使用JIT编译器,它编译整个字节码并将其更改为本地代码。这个本地代码将直接用于重复的方法调用,这提高了系统的性能。JIT的构成组件为:

    • 中间代码生成器(Intermediate Code Generator):生成中间代码
    • 代码优化器(Code Optimizer):负责优化上面生成的中间代码
    • 目标代码生成器(Target Code Generator):负责生成机器代码或本地代码
    • 分析器(Profiler):一个特殊组件,负责查找热点,即该方法是否被多次调用;

    3.3 垃圾收集器(Garbage Collector):收集和删除未引用的对象。可以通过调用“System.gc()”触发垃圾收集,但不能保证执行。JVM的垃圾回收对象是已创建的对象。

     

    Java本机接口(JNI):JNI将与本机方法库进行交互,并提供执行引擎所需的本机库。

    本地方法库(Native Method Libraries):它是执行引擎所需的本机库的集合。

    展开全文
  • 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虚拟机进程终止
       

    展开全文
  • art启动过程、oat文件加载流程方法执行过程 以下内容均是通过阅读老罗博客总结而来: https://www.kancloud.cn/alex_wsc/androids/473619 一、art启动过程 二、oat文件加载流程 三、查找加载指定...

    art启动过程、oat文件加载流程、类方法执行过程

    以下内容均是通过阅读老罗博客总结而来:
    https://www.kancloud.cn/alex_wsc/androids/473619

    一、art启动过程

    二、oat文件加载流程

    三、查找加载指定类对象

    四、类方法执行过程

    展开全文
  • Java类加载执行顺序

    千次阅读 2020-05-22 18:20:26
    类加载是Java程序运行的第一步,研究加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性...

    当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化

    一、加载

    加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构

    类加载阶段:

    (1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。
    (2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。
    (3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。

    Student类加载过程图示:
    在这里插入图片描述
    二、连接

    连接包括验证、准备以及解析三个阶段。

    (1)验证阶段。主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。
    (2)准备阶段。负责为类的静态成员分配内存,并设置默认初始值。
    (3)解析阶段。将类的二进制数据中的符号引用替换为直接引用。
    说明:

    符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。

    直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量。

    举个例子来说,现在调用方法hello(),这个方法的地址是0xaabbccdd,那么hello就是符号引用,0xaabbccdd就是直接引用。

    在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。

    三、初始化

    初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。

    如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
    如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

    静态代码块>初始化属性值>普通代码块>构造方法
    注:构造方法最后执行。

    注意:
    类加载过程只是一个类生命周期的一部分,在其前,有编译的过程,只有对源代码编译之后,才能获得能够被虚拟机加载的字节码文件;在其后还有具体的类使用过程,当使用完成之后,还会在方法区垃圾回收的过程中进行卸载(垃圾回收)。

    四、类加载器
    虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的类。

    1、Java语言系统自带有三个类加载器
    Bootstrap ClassLoader :最顶层的加载类,主要加载核心类库,也就是我们环境变量下面%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。
    Extention ClassLoader :扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
    Appclass Loader:也称为SystemAppClass。 加载当前应用的classpath的所有类。
    我们看到java为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺序
    Bootstrap ClassLoader > Extention ClassLoader > Appclass Loader
    层次关系如下图所示
    在这里插入图片描述
    代码验证如下:
    在这里插入图片描述
    从上面的结果可以看出,并没有获取到ExtClassLoader的父Loader,原因是Bootstrap Loader(引导类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null。

    2、类加载的三种方式
    认识了这三种类加载器,接下来我们看看类加载的三种方式。

    (1)通过命令行启动应用时由JVM初始化加载含有main()方法的主类。
    (2)通过Class.forName()方法动态加载,会默认执行初始化块(static{}),但是Class.forName(name,initialize,loader)中的initialze可指定是否要执行初始化块。
    (3)通过ClassLoader.loadClass()方法动态加载,不会执行初始化块

    3、双亲委派原则

    他的工作流程是: 当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务

    采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
    双亲委派原则归纳一下就是:

    1)沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
    2)避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

    4、自定义类加载器

    自定义类加载器的两种方式:

    (1)遵守双亲委派模型:继承ClassLoader,重写findClass()方法。
    (2)破坏双亲委派模型:继承ClassLoader,重写loadClass()方法。 通常我们推荐采用第一种方法自定义类加载器,最大程度上的遵守双亲委派模型。

    参考文章:
    https://www.cnblogs.com/luohanguo/p/9469851.html
    https://www.jianshu.com/p/202f6abb229c

    展开全文
  • 【Java中加载执行过程

    千次阅读 2018-07-06 11:44:50
    Java中加载过程,总是搞不清楚,所以今天将所有的想法整理下来,认真分析一下。 (最后更新日期 2018/07/06 15:28) 学习的目标: 分清楚 加载 和 初始化,以及明确 加载 和 程序的执行顺序。   目前...
  • 加载过程

    千次阅读 2018-09-08 16:34:10
    的主动引用和被动引用、类加载过程
  • 类加载过程

    万次阅读 多人点赞 2018-08-06 12:30:04
    加载就是将class文件中的二进制数据读取到... 类加载的最终产物是堆内存中的Class对象,对于同一个ClassLoader来说,无论加载多少次,对应带堆内存中的对象始终是同一个,这里所说的加载类加载过程中的第...
  • java类加载过程

    万次阅读 2019-03-10 11:39:38
    类加载机制 JVM将描述数据从.class文件中加载到内存,并对数据进行,解析和初始化,最终形成被JVM直接使用的Java类型。 从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、...
  • 的编译、加载执行过程

    千次阅读 2018-02-15 00:09:11
    菜鸟版我们写了一个Book.java的编译:执行javac test.java命令,就可以成功把Book.java转化成Book.class编译有3步:词法分析和输入到符号表注解处理语义分析和生成字节码细化一点:源代码文件*.java -&...
  • Java加载和代码执行顺序

    千次阅读 2018-09-28 21:22:02
    关于类加载和初始化相关的案例 总的顺序是:先父类后子类,先静态后动态,属性和代码块的初始化遵循正常的出场顺序无论是静态还是动态,但是他们总是先于构造器执行。但是还是需要通过题目的学习来加深我们的理解。...
  • .class字节码文件是跨平台的,也就是不管什么平台的JVM,都可以加载执行的加载 Java的加载是动态的,它并不会一次性将所有全部加载后再运行,而是保证程序运行的基础(像是基类)完全加载到jvm中,至于其他...
  • title: 类加载机制(一):简述类加载过程 date: 2019-03-13 10:06:10 categories: Java虚拟机 tags: 类加载机制 类加载机制(一):简述类加载过程 引言 Java源文件经过编译之后,生成了一连串的16...
  • JVM类加载器之加载过程

    千次阅读 2018-11-07 23:30:07
    我们知道在jvm中是通过各类形形色色的类加载器对class文件进行加载后才能进行使用的,而且jvm中能提供动态加载的特性也全是依靠类加载的机制,它已经成为了Java体系中一块重要的基石。但是类加载器究竟是如何工作的...
  • 加载过程详解

    千次阅读 2021-02-10 14:01:29
    基本数据类型由虚拟机预先定义,引用数据类型则需要进行加载。 按照java虚拟机规范,从class文件到加载进入内存中的,再到卸载出内存为止,整个生命周期如下 一、加载 将java的字节码文件加载到机器...
  • 面试官:请你谈谈Java的类加载过程

    万次阅读 多人点赞 2018-02-01 00:08:28
    刚刚走出校门的应届毕业生,如果在去寻求一份Java开发的工作时,你的面试官很有可能一边看着你的简历,一边漫不经心地问你:了解过Java加载过程吗? 这个时候你一定要注意了,虽然这是一个老生常谈的问题,但是...
  • Java编译原理--类加载过程

    千次阅读 多人点赞 2018-08-15 20:44:47
    上一篇文章介绍了class文件的存储细节,class文件包括了的各种描述信息,但是Java程序的运行需要在内存中实现, 那么虚拟机是如何加载这些class文件的?class文件中的静态结构是如何转换成实际的存储结构...
  • 很多博客或是书籍都认为静态块是类加载的时候执行的,真相真的是这样么? 我们先来看两个例子: example 1:  public class Test { public static void main(String[] args) throws Exception { ...
  • 二、Java虚拟机启动、加载类过程分析Step 1.根据JVM内存配置要求,为JVM申请特定大小的内存空间Step 2. 创建一个引导类加载器实例,初步加载系统到内存方法区区域中;Step 3. 创建JVM 启动器实例 Launcher,并取得...
  • Java JVM的类加载过程详解

    千次阅读 2020-04-07 20:49:07
    本文深入介绍Java的类加载过程加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)。
  • JVM的类加载和字节码执行引擎

    千次阅读 2018-02-27 22:24:53
    在上篇《JVM的Class文件结构》中,简单...Class文件的类加载过程是怎样?进入到虚拟机中的Class文件信息又会以什么样的形式存储?虚拟机如何找到应该执行的方法?虚拟机如何执行Class文件中的字节码?这些都是需要思考
  • 面试题之请描述一下Java类加载过程

    千次阅读 2020-04-04 19:22:03
    Java类加载过程是面试中常问的问题之一,今天我们将对类加载的各个过程进行简单的分析和总结,这样在面试的时候对这个问题就有信心回答好了。 二、类加载过程 Java类加载过程包含下面5个步骤: 【a】加载 通过一...
  • Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。验证、准备、解析叫连接过程。今天我们讲解析。 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,符号引用在class文件中以CONSTANT_...
  • 类加载过程类加载

    千次阅读 2018-03-05 22:03:16
    在Java中,类加载都是在运行期间执行的,这种策略虽然令类加载稍微增加一些性能,但是会给java应用程序提供高度的灵活性。类加载过程 和其他语言一样,java编译器同样能够将.java文件编译成.class,但是对于JVM来...
  • 主要介绍了详解spring boot容器加载完后执行特定操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 类加载实例化的关系 昨天终于纠正了我多年的误区:类加载的时候会加载静态和成员资源。所以如下输出都是类加载的时候输出的。 public static void main(String[] args) { /** * percent 静态代码块 * child ...
  • JVM类加载器机制与类加载过程

    千次阅读 2016-09-11 22:29:26
    二、Java虚拟机启动、加载类过程分析 三、类加载器有哪些?其组织结构是怎样的? 四、双亲加载模型的逻辑和底层代码实现是怎样的? 五、类加载器与Class 实例的关系 六、线程上下文加载器 一、为什么说...
  • Java类加载过程

    万次阅读 多人点赞 2018-09-14 19:09:22
    JVM和 当我们调用 Java 命令运行某个 Java 程序时,该命令将会启动一条 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里。同一个 JVM 的所有线程、所有...
  • java中进行加载时方法的...今天我们要说的类加载过程中其内部方法的执行顺序,下面举几个例子来介绍 1.创建一个ClassA public class ClassA { public static ClassA classa = new ClassA(); static{ System.o
  • Java:浅析类加载过程(一)

    千次阅读 2019-07-01 08:47:00
    《深入理解java虚拟机》一文中,把类加载过程分为5步:加载、验证、准备、解析以及初始化。而第一步“加载”这个过程,虚拟机需要完成3大步骤: (1)通过一个的全限定名来获取此类的二进制流。 (2)将这个字节...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 960,943
精华内容 384,377
关键字:

类加载的执行过程