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

    千次阅读 2019-01-27 11:55:36
    根据冯.诺依曼定义的计算机模型,任何程序都需要加载到内存才能...类加载过程 加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。 java加载是一个运行时核心基础模块,主要是在启动之初...

    根据冯.诺依曼定义的计算机模型,任何程序都需要加载到内存才能被CPU执行,同样的java中的.class文件也需要加载到内存才能实例化类。ClassLoader负责加载.calss文件到内存中,加载类时使用的是双亲委派模型,接下来进行详细的介绍

    类加载过程

    类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。
    java的类加载是一个运行时核心基础模块,主要是在启动之初进行类的
    Load(加载)、Link(链接)、Init(初始化)

    • 第一阶段为Load阶段,这一阶段的工作是读取字节码文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe魔法数、常量池、文件长度、是否有父类等,然后创建对应类的java.lang.class实例
    • 第二阶段即Link阶段,可以分为验证、准备、解析三个小的步骤。验证是较为详细的校验,进行final是否合规、类型是否正确、静态变量是否合法等校验操作。准备阶段是为静态变量分配内存并初始化默认值。解析阶段是解析类个方法确保类与类之间的相互引用正确性,完成内存结构布局。
    • 第三阶段是Init阶段,这一阶段会调用类构造器的方法,如果赋值运算是通过其他类的静态方法来完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。
      在这里插入图片描述

    类加载器

    类加载器有三种,按层次分的话就是三层。
    第一层为Boostrap加载器,它是在JVM启动时创建的,通常由与操作系统相关的本地代码实现,负责装载最核心的java类,比如Object、System、String等。
    第二层在JDK9中称为Platform ClassLoader(平台类加载器),用以加载一些扩展的系统类,比如XML、加密、压缩相关的功能类等,在JDK9之前是Extension ClassLoader。
    第三层是Application ClassLoader的应用加载器,主要加载用户自定义的CLASSPATH路径下的类。

    双亲委派模型

    在这里插入图片描述
    低层次的当前类加载器,不能覆盖高层次类加载器已经加载的类。如果低层次的类加载器需要加载一个未知类,需要向上逐级询问,询问完毕后逐层尝试是否可加载,具体含义见上图,不在此展开详述。

    自定义类加载器

    用户可根据需要自定义类加载器,下面是需要自定义类加载器的几种情况:

    1. 隔离加载类:在某些框架内进行中间件与应用模块隔离,把类加载到不同的环境中
    2. 修改类加载方式:类的加载并非强制,除bootstrap外,其他的加载并非要引入,或者根据实际情况在某个时间点进行按需进行动态加载
    3. 扩展加载源:比如从数据库、网络,甚至是电视机机顶盒进行加载
    4. 防止源码泄露:java代码容易被编译和篡改,可以进行编译加密,那么类加载器也需要自定义以便还原加密的字节码
    展开全文
  • 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类加载过程图解

    千次阅读 2018-08-22 16:52:36
    朋友给我发了一道有意思的题目,如下 ...上图是我绘制的整个Java类加载过程。 首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传...

    朋友给我发了一道有意思的题目,如下

    为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。

    这就扯到基础理解上了,就是Java是如何加载一个类的呢?

    上图是我绘制的整个Java类加载过程。

    首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给类加载器,传输的是刚转换好的字节码文件,也可以是通过网络传输过来的字节码文件,这个是分布式架构下的情况。

    然后就是运行期,运行期一开始,类加载器初始化字节码文件,通过本地类库来验证字节码文件的正确性,然后交给JVM的解释器和即时编译器,最后汇合给JVM内部的Java运行系统,都ok了后传给PC的操作系统,最后就是物理硬件层面。

    所以问题的答案就有了

    .class是JVM将类装入内存,是在编译期间实现的,而编译期间只是做了字节码转换,所以不执行静态块

    而Class.forName()是在运行期间,JVM除了装入类外,同时通过类加载器对字节码文件进行校验,所以对静态块进行了初始化。

     

    展开全文
  • 面试题之请描述一下Java类加载过程

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

    一、简介

    Java类加载过程是面试中常问的问题之一,今天我们将对类加载的各个过程进行简单的分析和总结,这样在面试的时候对这个问题就有信心回答好了。

    二、类加载过程

    Java类加载过程包含下面5个步骤:

    【a】加载

    • 通过一个类的全限定名获取该类的二进制流;
    • 将该二进制流的静态存储结构转化为方法区运行时数据结构;
    • 在内存中生成该类的Class对象,作为该类的数据访问入口;

    【b】链接

    链接阶段又可以分为验证、准备和解析三个阶段。

    • 验证: 验证的目的是为了确保Class文件的字节流中的信息不会危害到虚拟机;
    1. 文件格式验证 :验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型等等;
    2. 元数据验证 :对字节码描述的信息进行语义分析,如这个类是否有父类,是否继承了不被继承的类等等;
    3. 字节码验证 :通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等等;
    4. 符号引用验证 :为了确保解析动作能正确执行;
    • 准备: 准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。      
     //在准备阶段value初始值为0,在初始化阶段才会变为123
     public static int value = 123  
    
     //注意下面是常量, 在准备阶段之后,number 的值将是 3,而不是 0
     public static final int number = 3;
    • 解析: 主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。

    【c】初始化

    • 初始化是类加载的最后一步,真正开始执行类中定义的Java程序代码;

    【d】使用

    • 当 JVM 完成初始化阶段之后,JVM 便开始从入口方法开始执行用户的程序代码;

    【e】卸载

    • 当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存;

    三、类加载器的双亲委派模型机制?

    参考回答:当一个类收到了类加载的请求,首先自己并不会去加载这个类,而是将其委派到父类加载器,由父类去加载,如果此时父类无法加载,反馈给子类加载器,子类加载器再尝试去加载。

    展开全文
  • 浅谈java类加载过程加载器

    千次阅读 2013-10-18 22:06:50
    Java是跨平台的, 指得是Java编译成的class文件,可以在(32/64) .* (Oracle/IBM/…) .* (Linux/Win)等不同的JVM实现下面运行,Java源文件在不同的JVM下面不需要重新编译... 类加载过程  首先要理解什么是jvm,jre,jdk
  • 深度分析Java的ClassLoader机制(源码级别)和Java类加载、链接和初始化两个文章中分别介绍过,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类加载和初始化过程都是线程安全的。所以,创建一个...
  • [Java内存]Java类加载过程

    千次阅读 2016-07-29 11:29:31
    本文主要介绍类加载,了解类加载过程Java类可以有更好的理解,比如static块里面的代码问什么比构造方法还先执行。基础知识首先咱们先了解Java代码的执行过程。 从这个框图很容易大体上了解 java 程序工作原理...
  • Java类加载过程和对象实例化详解

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

    2019-07-24 22:56:19
    JVM运行流程
  • 类加载过程即是指JVM虚拟机把.class文件中信息加载进内存,并进行解析生成对应的class对象的过程。JVM不是一开始就把所有的都加载进内存中,而是只有第一次遇到某个需要运行的时才会加载,且只加载一次。 ...
  • 从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载...
  • jvm之java类加载机制和类加载器(ClassLoader)的详解

    万次阅读 多人点赞 2018-08-13 15:05:46
    当程序主动使用某个时,如果该还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该进行初始化。如果没有意外,JVM将会连续完成3个步骤,...一、类加载过程 1.加载 加载指的是将的class文件...
  • 对于Java类加载过程中的顺序问题探究

    千次阅读 多人点赞 2012-02-13 15:59:47
    以前记得static代码块貌似是Java类加载过程中优先级最高的,但是最近几天写代码发现不是这样的,因为static变量 的优先级要比static代码块高得多,所以因此我犯了不少错误,下面以一个例子来说明一下一个初始化为...
  • Android:Java类加载过程面试题集锦

    千次阅读 2019-07-24 21:47:06
    下述是我收录整理的Android面试题汇总,由于篇幅原因,在这只把Java类加载部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花...
  • JVM源码分析之Java类加载过程 背景 最近对Java细节的底层实现比较感兴趣,如Java类文件是如何加载到虚拟机的,对象和方法是以什么数据结构存在于虚拟机中?虚方法、实例方法和静态方法是如何调用的?...
  • jvm加载类机制CLass Loading
  • [读书笔记]Java类加载过程

    千次阅读 2016-02-28 23:50:18
    以上“加载->验证->准备->解析->初始化”称为加载过程Java虚拟机规范中没有对什么时候需要开始加载的第一阶段进行强制约束,而是交给了虚拟机根据具体实现来自由把握。 但是对于初始化阶段,虚拟机有以下...
  • 类加载机制的特性JAVA类加载机制JAVA类加载java类加载器负责把一个一个编译好的class文件装入内存中,并为其创建对应的java.lang.Class对象。java中有如下几种类加载器: BootstrapClassLoader ExtClassLoader ...
  • java 类加载过程中static final 的特殊

    千次阅读 2018-07-18 18:17:53
    编程过程中经常用的static,final关键字,也经常听到同事谈起这些词,到底他们怎么样呢,jvm中class文件结构可以找到答案。 ConstantValue属性 ConstantValue属性的作用是通知虚拟机自动为静态变量赋值,只有被...
  • 深入理解Java类加载器(ClassLoader)

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

    万次阅读 多人点赞 2017-05-15 20:47:44
    每个开发人员对java.lang...本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。
  • java 类加载过程、JVM -verbose参数详解

    千次阅读 2014-11-12 09:17:42
    ava -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息。...你可以用verbose:class来监视,在命令行输入java -verbose:class XXX (XXX为程序名)你会在控制台看到加载的情况。 verbose和verbose:clas

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 601,489
精华内容 240,595
关键字:

java类加载过程

java 订阅