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

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

    类加载机制

    JVM将类描述数据从.class文件中加载到内存,并对数据进行,解析和初始化,最终形成被JVM直接使用的Java类型。 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用卸载七个阶段。
    ——《深入理解Java虚拟机 JVM高级特性与最佳实践》
    在这里插入图片描述

    1. 加载(Loading):
      简单的说,类加载阶段就是由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例(Java虚拟机规范并没有明确要求一定要存储在堆区中,只是hotspot选择将Class对应哪个存储在方法区中),这个Class对象在日后就会作为方法区中该类的各种数据的访问入口。加载阶段由类加载器负责,过程见类加载器;简单的说,类加载阶段就是由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例(Java虚拟机规范并没有明确要求一定要存储在堆区中,只是hotspot选择将Class对应哪个存储在方法区中),这个Class对象在日后就会作为方法区中该类的各种数据的访问入口。加载阶段由类加载器负责,过程见类加载器;
    2. 链接(Linking)
      链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中,经由验证、准备和解析三个阶段。
      验证:验证类数据信息是否符合JVM规范,是否是一个有效的字节码文件,验证内容涵盖了类数据信息的格式验证、语义分析、操作验证等。
    • 格式验证
      验证是否符合class文件规范

    • 语义验证
      检查一个被标记为final的类型是否包含子类;检查一个类中的final方法是否被子类进行重写;确保父类和子类之间没有不兼容的一些方法声明(比如方法签名相同,但方法的返回值不同)

    • 操作验证
      在操作数栈中的数据必须进行正确的操作,对常量池中的各种符号引用执行验证(通常在解析阶段执行,检查是否通过引用中描述的全限定名定位到指定类型上,以及类成员信息的访问修饰符是否允许访问等)
      准备:准备阶段负责为类中static变量分配空间,并初始化(与程序无关,系统初始化);被final修饰的静态变量,会直接赋予原值;类字段的字段属性表中存在ConstantValue属性,则在准备阶段,其值就是ConstantValue的值。
      解析:解析阶段负责将常亮池中所有符号引用转换为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法),这个可以在初始化之后再执行。可以认为是一些静态绑定的会被解析,动态绑定则只会在运行是进行解析;静态绑定包括一些final方法(不可以重写),static方法(只会属于当前类),构造器(不会被重写);

    1. 初始化
      初始化阶段负责将所有static域按照程序指定操作对应执行(赋值static变量,执行static块)。
      如果执行的是static代码块,那么在初始化阶段,JVM就会执行static代码块中定义的所有操作。
      所有类变量初始化语句和静态代码块都会在编译时被前端编译器放在收集器里头,存放到一个特殊的方法中,这个方法就是方法,即类/接口初始化方法。该方法的作用就是初始化一个中的变量,使用用户指定的值覆盖之前在准备阶段里设定的初始值。任何invoke之类的字节码都无法调用方法,因为该方法只能在类加载的过程中由JVM调用。
      如果父类还没有被初始化,那么优先对父类初始化,但在方法内部不会显示调用父类的方法,由JVM负责保证一个类的方法执行之前,它的父类方法已经被执行。
      JVM必须确保一个类在初始化的过程中,如果是多线程需要同时初始化它,仅仅只能允许其中一个线程对其执行初始化操作,其余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程。
      上述阶段通常都是交叉混合允许,没有严格的先后执行顺序;

    类加载器

    类加载器的主要任务:是类加载过程中的加载操作:根据一个类的全限定名读取该类的二进制字节流到JVM内部,然后转换为一个对应的java.lang.Class对象实例
    开发者可以通过编写自定义类加载器来自定义类的加载规则

    类加载器分类

    • 启动类加载器/Bootstrap ClassLoader

    在HotSpot虚拟机中,Bootstrap ClassLoader用C++语言编写并嵌入JVM内部,主要负载加载JAVA_HOME/lib目录中的所有类,或者加载由选项-Xbootcalsspath指定的路径下的类;

    • 拓展类加载器/ExtClasLoader

    ExtClassLoader继承ClassLoader类,负载加载JAVA_HOME/lib/ext目录中的所有类型,或者由参数-Xbootclasspath指定路径中的所有类型;

    • 应用程序类加载器/AppClassLoader

    ExtClassLoader继承ClassLoader类,负责加载用户类路径ClassPath下的所有类型,一般情况下为程序的默认类加载器;

    • 自定义加载器
      Java虚拟机规范将所有继承抽象类java.lang.ClassLoader的类加载器,定义为自定义类加载器;

    双亲委派模型

    在这里插入图片描述

    双亲委派过程

    当一个类加载器收到类加载任务时,立即将任务委派给它的父类加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行;
    除了启动类加载器以外,每个类加载器拥有一个父类加载器,用户的自定义类加载器的父类加载器是AppClassLoader;
    双亲委派模型可以保证全限名指定的类,只被加载一次;
    双亲委派模型不具有强制性约束,是Java设计者推荐的类加载器实现方式;

    展开全文
  • Java加载过程内存分析Java加载过程编译类的加载加载器运行时数据区执行引擎 Java加载过程 具体过程如下: 编译 首先Java源代码会被编译器编译成class文件以供计算机执行(详细过程可参考编译原理)。java...

    Java类加载过程

    具体过程如下:类加载过程

    编译

    首先Java源代码会被编译器编译成class文件以供计算机执行(详细过程可参考编译原理)。java编译一个类时,若这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。

    类的加载

    类的加载过程为:
    加载 --> 链接(验证 --> 准备 --> 解析) --> 初始化
    加载过程的任务主要是根据类的权限和路径名查找并导入我们的class文件,将class文件转换成一个二进制的字节流。将静态字节流所代表的静态存储结果转化为方法区的运行时数据结构;在内存中生成一个java.lang.Class对象。
    链接过程分为三个步骤
    首先进行对各个方面进行验证(文件格式、符号引用等),以确保字节码的合法性,确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证完成后进行准备过程,主要为静态变量分配内存、并将变量初始成默认值(注意,这一步在变量赋值之前,所有变量都会被赋予初始值)。解析阶段是虚拟机将class常量池内的符号引用替换为直接引用的过程,通俗的讲就是将我们声明的那些引用符号(如Student oStu2 = new Student();)变成实实在在的指针。
    最后是初始化阶段,对静态变量进行赋值,然后执行类的初始化语句(static{}代码块)详细过程是:

    • 如果类还没有被加载,那就先进行加载和链接。
    • 如果类存在父类,并且父类还没有初始化,那么先初始化父类。
    • 如果类中存在初始化语句,顺序执行初始化语句。

    类初始化的时机

    • 创建类的实例(New、反射、序列化和反序列化、克隆)
    • 访问类的静态变量或者对静态变量进行赋值。
    • 主动调用类的静态方法。
    • Class.forName(包类名)
    • 完成子类的初始化之前。
    • 该类是程序的引导入口。

    类加载器

    Bootstrap ClassLoader
    JVM自带的引导类加载器,由C/C++实现,主要负责加载Java的核心类库(如resource.jar)以及以java、javax、sun等开头的包名类(如java.lang包)
    Extension ClassLoader
    由Java语言编写,指定Bootstrap ClassLoader为Parent的加载器(getParent方法获取Bootstrap ClassLoader,注意这里不是父类和子类的关系)它是用来读取Java的一些扩展类库,如读取JRE/lib/ext/*.jar中的包等。
    Application Classloader
    Java程序的默认加载器,指定Extension ClassLoader为Parent的加载器,加载Java应用类(我们写的类)。
    User ClassLoader
    用户自定义的类加载器。基用于加载非Classpath中(如从网络上下载的jar或二进制)的jar及目录。
    双亲委派机制双亲委派机制
    一个类被加载的过程当中,先由上次类加载器加载,如果无法加载在交给下层处理,直到User ClassLoader,如还不能加载则抛出classNotFoundException异常。
    举个例子:

    public class String {   
    	static{
    		System.out.println("我是String类");
    	}
    }		
    
    public class test {   
    	public static void main(String [] args){
    		String s = new String(); 
    		//这里不会打出"我是String类",因为在new String()时先由Bootstrap ClassLoader进行加载,则java.lang.String类会被加载
    	}
    }
    

    双亲委派机制一方面可以避免类的重复加载,另一方面可以保护程序安全,防止Java语言环境被破坏。

    运行时数据区

    程序计数器
    与线程同时存在,记录一个线程中程序执行的位置,控制程序随着CPU时间的切换不断往下执行。
    虚拟机栈
    当前执行线程的独占空间,以栈的数据结构出现。线程私有,它保存一个线程方法的调用状态,压入栈的单位为栈帧。程序执行时main()方法的栈帧先入栈,如果main()方法中调用了A方法,那么在执行到A方法时它的栈帧入栈,等A方法执行完成后栈帧出栈,继续执行main方法。
    本地方法栈
    该栈为C的栈结构,用来存储Java执行过程中的Native方法(也就是底层用C来实现的方法)。

    是一块不连续的内存空间,JVM运行过程中最大的一块内容,被所有线程共享,用来存放new出来的对象以及数组。
    方法区
    是堆的一部分,用来存放字面量(文本字符串、八种基本类型的值、被声明为final的常量等)以及符号引用(类和方法的全限定名、字段的名称和描述符、方法的名称和描述符),它是所有的线程共享的一块区域,当方法区不能满足内存分配需求时会报出OutOfMemoryError。

    执行引擎

    解释器
    将Class字节码的指令翻译成机器可以看懂的指令。
    即时编译器
    可以侦测并保存程序中的热点代码,在其反复调用时可以避开解释器直接执行。
    垃圾回收器
    直接对共享内存进行管理,回收不需要的变量。

    展开全文
  • Java加载过程

    千次阅读 2020-10-14 11:05:31
    Java加载需要经历一下7个过程: 1.加载 加载是类加载的第一个过程,在这个阶段,将完成一下三件事情: •通过一个类的全限定名获取该类的二进制流。 •将该二进制流中的静态存储结构转化为方法去运行时数据结构...

    Java类加载需要经历一下7个过程:
    1.加载
    加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:
        •通过一个类的全限定名获取该类的二进制流。
        •将该二进制流中的静态存储结构转化为方法去运行时数据结构。
        •在内存中生成该类的Class对象,作为该类的数据访问入口。
    2.验证
    验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:
        •文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
        •元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。
        •字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。
        •符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。
    3.准备
    准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。publicstaticintvalue=123;//在准备阶段value初始值为0。在初始化阶段才会变为123。
    4.解析
    该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
    5.初始化
    初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。
    6.使用
    7.卸载

    展开全文
  • java类的加载过程

    千次阅读 多人点赞 2019-07-16 09:10:56
    类的加载过程目录什么是类的加载过程加载过程讲解第一个部分:加载阶段加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情,就是下面的三件在类的加载过程中,相对于类加载过程里面的的连接...

    文章首发于我的个人博客,到个人博客体验更佳阅读哦

    https://www.itqiankun.com/article/1564899910

    什么是类的加载过程

    一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译和运行,其中编译就是把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件,然后运行则是把编译声称的.class文件交给Java虚拟机(JVM)执行。而我们所说的类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。
    举个通俗点的例子来说,JVM在执行某段代码时,遇到了class A, 然而此时内存中并没有class A的相关信息,于是JVM就会到相应的class文件中去寻找class A的类信息,并加载进内存中,这就是我们所说的类加载过程。由此可见,JVM不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类时才会加载,且只加载一次。

    类加载的过程讲解

    类加载的过程主要分为三个部分:加载、链接、初始化,这三个阶段

    第一个部分:加载阶段

    简单来说,加载指的是把class字节码文件从各个来源通过类加载器装载入内存中。这里的字节码文件的来源,一般包括从本地路径下编译生成的.class文件,从jar包中的.class文件,从远程网络,以及动态代理实时编译,按照类加载器:一般包括启动类加载器,扩展类加载器,应用类加载器,以及用户的自定义类加载器。

    加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情,就是下面的三件

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

    加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。

    在类的加载过程中,相对于类加载过程里面的的连接和初始化阶段而言,加载阶段是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。

    我记得阿里的pandora就是通过不同的类加载器来加载不同的类,可以去类加载器里面去看阿里的pandora框架知识点

    第二个部分:连接阶段

    在连接里面又可以被分成3个小阶段,分别是:验证,准备,解析

    连接阶段之验证小阶段

    验证的目的
    主要是为了保证加载进来的字节流符合虚拟机规范,不会造成安全错误。
    
    1.包括对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?
    
    2.对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
    
    3.对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。
    
    4.对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(privatepublic等)
    是否可被当前类访问?
    
    
    验证做的具体内容

    验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:

    1.文件格式验证:验证字节流是否符合Class文件格式的规范;
    例如:是否以0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。
    
    2.元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),
    以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。
    
    3.字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如循环、分支等
    
    4.符号引用验证:确保解析动作能正确执行,比如不能访问引用类的私有方法、全限定名称是否能找到相关的类。
    

    验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

    连接阶段之准备小阶段

    在准备阶段是为类的静态变量分配内存,并将其初始化为默认值

    主要准备阶段是为类的静态变量分配内存,不会对类的非静态变量分配内存

    在准备阶段,为静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认的初值是这样的
    1.基本类型(intlongshortcharbytebooleanfloatdouble)的默认值为0
    2.引用类型的默认值为null
    3.finalstatic共同修改的变量,我们通常称为常量,然后常量的默认值为我们程序中设定的值,
    比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100

    为什么被final和static变量修饰的成员变量在准备阶段的赋值会比较特别呢,这是因为,被final和static修改的变量,我们叫做ConstantValue属性,ConstantValue属性就是这样特殊的属性,至于什么是ConstantValue属性,看这篇文章:https://blog.csdn.net/weixin_43689480/article/details/96099841

    连接阶段之解析小阶段

    这一阶段的任务就是把常量池中的符号引用转换为直接引用

    什么是符号引用,什么是直接引用

    符号引用:即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
    
    直接引用:可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;
    在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。
    
    举个例子来说,现在调用方法hello(),这个方法的地址是1234567,那么hello就是符号引用,1234567就是直接引用。
    
    

    第三个部分:初始阶段

    类加载过程中的初始化阶段主要做的事就是:

    JVM负责主要对类变量(类变量就是static修改的变量)进行初始化

    JVM负责主要对类变量(类变量就是static修改的变量)进行初始化主要有两个方式

    1.声明静态类变量时指定初始值
    2.使用静态代码块为类变量指定初始值
    
    然后这里要注意一下,类变量进行显示赋值和使用静态代码块对类变量进行赋值,这里谁优先呢

    这个是看顺序的,比如下面的代码,为什么会这样,暂时不知道,记住就好了

    package com.one.jicheng;
    
    public class Zi {
        static int x = 10;
        static{ x = 20; }
    
        static{ y = 20; }
        static int y = 10;
    
        public static void main(String[] args) {
            System.out.println("x的值"+Zi.x);
            System.out.println("y的值"+Zi.y);
        }
    }
    

    在这里插入图片描述

    类的加载过程中里面的初始化时机

    类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

    – 创建类的实例,也就是new的方式
    
    – 访问某个类或接口的静态变量,或者对该静态变量赋值
    
    – 调用类的静态方法
    
    – 反射(如Class.forName(“com.shengsiyuan.Test”))
    
    – 初始化某个类的子类,则其父类也会被初始化
    
    – Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类
    

    能看到这里的同学,就帮忙右上角点个赞吧,Thanks♪(・ω・)ノ

    展开全文
  • Java加载过程详解

    千次阅读 2021-01-29 17:46:58
    类的生命周期类的加载加载过程加载链接验证准备解析初始化总结 首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1): 再详细具体一点(图2): 上面的图片有些地方看不懂没关系,先在脑子里...
  • Java加载过程

    万次阅读 多人点赞 2018-09-14 19:09:22
    当我们调用 Java 命令运行某个 Java 程序时,该命令将会启动一条 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里。同一个 JVM 的所有线程、所有变量都处于...
  • 面试题之请描述一下Java加载过程

    千次阅读 2020-04-04 19:22:03
    Java加载过程是面试中常问的问题之一,今天我们将对类加载的各个过程进行简单的分析和总结,这样在面试的时候对这个问题就有信心回答好了。 二、类加载过程 Java加载过程包含下面5个步骤: 【a】加载 通过一...
  • 浅谈java加载过程和类加载

    千次阅读 2013-10-18 22:06:50
    Java是跨平台的, 指得是Java编译成的class文件,可以在(32/64) .* (Oracle/IBM/…) .* (Linux/Win)等不同的JVM实现下面运行,Java源文件在不同的JVM下面不需要重新编译... 类加载过程  首先要理解什么是jvm,jre,jdk
  • Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。前三个叫连接过程。今天我们讲加载。 首先明确“加载”是“类加载”的一个过程,不要混淆。加载过程中,虚拟机需要完成下列三个事情: 通过一个类...
  • Java加载基本过程

    千次阅读 2016-12-14 21:51:49
    基本过程:   根据类的全限定名称加载定义类的二进制字节流。 将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口 ...
  • java加载过程

    千次阅读 2012-11-07 13:10:53
    java加载类的全过程 一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段: 加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载 其中加载(除了自定义加载)+链接的过程是完全...
  • Java加载过程和对象实例化详解

    千次阅读 2017-11-19 17:21:28
    Java虚拟机类加载过程加载时机 类加载过程加载 –验证 –准备 –解析 –初始化 1、类加载时机  类从被加载虚拟机内存中开始,到卸载出内存为止,他的整个生命周期包括:加载、验证、准备、解析、初始化...
  • 浅谈java加载过程

    2018-10-10 16:04:15
    java加载需要经历一下7个过程:   加载 加载时类加载的第一个过程,在这个阶段,将完成一下三件事情: 1. 通过一个类的全限定名获取该类的二进制流。 2. 将该二进制流中的静态存储结构转化为方法去运行时数据...
  • java加载过程是什么

    千次阅读 2018-08-09 23:14:58
    通过类的全限定名来获取定义此类的二进制字节流,将此二进制字节流所代表的静态存储结构转化成方法区的运行时数据结构,在内存中生成代表此类的java.lang.Class对象,作为该类访问入口. 2.验证阶段的作用 连接阶段...
  • Java加载过程和双亲委派机制

    千次阅读 2018-09-28 23:56:43
    1. 类加载机制的层次结构 加载加载阶段会在内存中生成一个代表该类的Class对象,作为访问方法...在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。 注意:虚拟机规范...
  • Java类的加载过程

    千次阅读 2016-05-06 12:50:49
    编译:即javac的过程,即把.java文件编译成.class文件,即编译成字节码文件,同时做一些类型以及格式的检查。  类只有在要运行的时候才会被加载进JVM,即编译后只有需要到这个类的时候才会把他加载进JVM运行,...
  • Java中类加载过程和对象创建过程

    千次阅读 2015-11-21 21:47:26
    加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态...
  • Java虚拟机类加载过程

    千次阅读 2017-09-02 18:03:31
    1. 类加载的时机: 类从被加载到虚拟机内存开始到卸载出内存,整个生命周期包括以下七个阶段,其中加载,验证,准备,初始化,卸载这5个阶段的顺序是确定的。 类在什么情况下进行加载: 虚拟机对类的加载时机并没有...
  • Java加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。 ...
  • 其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。 (2)链接:  验证...
  • [读书笔记]Java加载过程

    千次阅读 2016-02-28 23:50:18
    以上“加载->验证->准备->解析->初始化”称为类的加载过程Java虚拟机规范中没有对什么时候需要开始类加载的第一阶段进行强制约束,而是交给了虚拟机根据具体实现来自由把握。 但是对于初始化阶段,虚拟机有以下...
  • java加载的全过程

    2016-07-18 21:21:33
    java类进行加载的全过程主要有五个方面:加载->验证->准备->解析->初始化 一、加载 1.通过此类的全名来获取此类的二进制字节流 2.将此字节流所代表的静态储存结构转化为方法区运行时数据结构 3.在堆中创建一个java....
  • 加载过程:1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态...
  • Java虚拟机 类加载过程与机制

    千次阅读 2016-04-25 23:35:14
    ClassLoader在JVM运行的时候加载Java核心的API,以满足Java程序最基本的需求,...Java语言里,类型的加载和连接过程是在程序运行期间完成的。 类加载器是 Java 语言的一个创新。它使得动态安装和更新软件组件成为可能。
  • 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载...
  • Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。验证、准备、解析叫连接过程。今天我们讲验证。 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机...
  • 深入理解Java加载器(ClassLoader)

    万次阅读 多人点赞 2017-06-26 09:34:08
    【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) ...深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解
  • jvm加载类机制CLass Loading

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 406,666
精华内容 162,666
关键字:

java加载存储过程

java 订阅