资讯专栏INFORMATION COLUMN

jvm类加载机制

lastSeries / 1500人阅读

摘要:前面提到,对于数组类来说,它并没有对应的字节流,而是由虚拟机直接生成的。对于其他的类来说,虚拟机则需要借助类加载器来完成查找字节流的过程。验证阶段的目的,在于确保被加载类能够满足虚拟机的约束条件。

Java 虚拟机将字节流转化为 Java 类的过程。这个过程可分为加载、链接以及初始化

三大步骤。

加载是指查找字节流,并且据此创建类的过程。加载需要借助类加载器,在 Java 虚拟机中,类加载

器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。

链接,是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。链接还分验证、准备和解析

三个阶段。其中,解析阶段为非必须的。

初始化,则是为标记为常量值的字段赋值,以及执行 < clinit > 方法的过程。类的初始化仅会被执

行一次,这个特性被用来实现单例的延迟初始化。

加载

加载,是指查找字节流,并且据此创建类的过程。前面提到,对于数组类来说,它并没有对应的字
节流,而是由 Java 虚拟机直接生成的。对于其他的类来说,Java 虚拟机则需要借助类加载器来完
成查找字节流的过程。

由类加载器classLoadder负责类装载,JDK 默认提供了如下几种ClassLoader

Bootstrp loader

Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。

ExtClassLoader

Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

AppClassLoader

Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。

java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,或者叫双亲委派模型。

链接

链接,是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。它可分为验证、准备以及解
析三个阶段。

验证阶段的目的,在于确保被加载类能够满足 Java 虚拟机的约束条件。

准备阶段的目的,则是为被加载类的静态字段分配内存。Java 代码中对静态字段的具体初始化,则

会在稍后的初始化阶段中进行。

在 class 文件被加载至 Java 虚拟机之前,这个类无法知道其他类及其方法、字段所对应的具体地
址,甚至不知道自己方法、字段的地址。因此,每当需要引用这些成员时,Java 编译器会生成一个
符号引用。在运行阶段,这个符号引用一般都能够无歧义地定位到具体目标上。

初始化

在 Java 代码中,如果要初始化一个静态字段,我们可以在声明时直接赋值,也可以在静态代码块中
对其赋值。

类的初始化何时会被触发呢?JVM 规范枚举了下述多种触发情况:

当虚拟机启动时,初始化用户指定的主类;

当遇到用以新建目标类实例的 new 指令时,初始化 new 指令的目标类;

当遇到调用静态方法的指令时,初始化该静态方法所在的类;

当遇到访问静态字段的指令时,初始化该静态字段所在的类;

子类的初始化会触发父类的初始化;

如果一个接口定义了 default 方法,那么直接实现或者间接实现该接口的类的初始化,会触发

该接口的初始化;

使用反射 API 对某个类进行反射调用时,初始化这个类;

当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在的类。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73079.html

相关文章

  • 从一无所知到无所不知————jvm系列(1)

    摘要:学习能更深入的理解这门语言,能理解语言底层的执行过程,深入到字节码层次。 目录   前言 程序的运行 1.JVM类加载机制 ①一般在什么情况下会去加载一个类?也就是说,什么时候.class字节码文件中加载这个类到JVM内存里来? ②验证、准备、初始化 ③初始化 2.类加载器和双亲委派机制 ...

    Betta 评论0 收藏0
  • Java的加载机制

    摘要:如果需要支持类的动态加载或需要对编译后的字节码文件进行解密操作等,就需要与类加载器打交道了。双亲委派模型,双亲委派模型,约定类加载器的加载机制。任何之类的字节码都无法调用方法,因为该方法只能在类加载的过程中由调用。 jvm系列 垃圾回收基础 JVM的编译策略 GC的三大基础算法 GC的三大高级算法 GC策略的评价指标 JVM信息查看 GC通用日志解读 jvm的card table数据...

    aervon 评论0 收藏0
  • 浅谈java classloader

    摘要:类加载器三杰有三类,分别是以及。线程上下文类加载器线程上下文类加载器可以不遵循双亲委派机制。免费领取验证码内容安全短信发送直播点播体验包及云服务器等套餐更多网易技术产品运营经验分享请访问网易云社区。文章来源网易云社区 本文由作者张远道授权网易云社区发布。 类加载器三杰 jvm有三类classloader,分别是bootstrap classloader,extended classlo...

    liuyix 评论0 收藏0
  • JVM_加载机制详解

    摘要:加载器种类启动类加载器在中用来加载自身需要的类,实现,用来加载。那么就能保证的类会被优先加载,限制了使用者对系统的影响。这种方式下就完成类加载器的双亲委派机制此处会将作为参数传入进去实际上是调用了方法 Class 文件的装载流程 (类加载过程) 加载 -> 连接 (验证 -> 准备 -> 解析) -> 初始化 -> 使用 -> 卸载 加载 加载阶段,jvm 会通过类名获取到此类的字节码...

    MasonEast 评论0 收藏0
  • JVM 的 工作原理,层次结构 以及 GC工作原理

    摘要:执行引擎作用执行字节码,或者执行本地方法运行时数据区其实就是指在运行期间,其对内存空间的划分和分配。 虽是读书笔记,但是如转载请注明出处https://uestc-dpz.github.io..拒绝伸手复制党 JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实现了Java语言最重要的特征:即平台...

    qqlcbb 评论0 收藏0
  • JVM 知识点 01

    摘要:新生代又被划分为三个区域和两个幸存区。这样划分的目的是为了使能够更好地管理堆内存中的对象,包括内存的分配及回收。新生代主要存储新创建的对象和尚未进入老年代的对象。 在Java中主要有以下三种类加载器: 引导类加载器(bootstrap class loader) --用来加载java的核心库(Strin...

    不知名网友 评论0 收藏0

发表评论

0条评论

lastSeries

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<