Java虚拟机——类加载机制和类加载器

Java虚拟机——类加载机制和类加载器

类加载过程

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:Loading(加载)、Verification(验证)、Preparation(准备)、Resolution(解析)、Initialization(初始化)、Using(使用)和Unloading(卸载)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)


类加载过程

注意:此处的类加载指的是一个.class文件的加载,在Java中.class文件可能是一个类,也可能是一个接口。此处都叫做类加载。整个类加载的过程即:加载→验证→准备→解析→初始化

这里需要注意:从类的加载→验证→准备→初始化,过程是按顺序依次开始的,但是解析比较特殊。为了支持java语言的晚期绑定/动态绑定,有时解析可以在初始化之后才开始。而且,这只是开始顺序,一个阶段通常执行的过程中会激活调用另一个阶段,所以各个阶段只是按照这个顺序开始,而不会等一个阶段完全完成后才进行下一个阶段,各个阶段是交叉混合进行的,所以各阶段并不会严格按照此顺序结束。

1.Loading加载

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

1)通过一个类的全限定名来获取此类的二进制字节流。

一个类的二进制字节流即.class文件,如何获取一个类的.class文件其实可以通过多种方法实现,譬如:从ZIP包中读取、从网络传输中获取、运行时计算生成(动态代理技术)、从数据库中读取等。

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

加载的过程中主要由【类加载器】来完成。类加载器也分为不同种类,具体见下文↓,除了JVM自带的类加载器,用户也可以使用自己定义的类加载器。

3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

某个类的java.lang.Class对象,即通常所说的一个类的类对象,这个类对象作为程序调用这个类中方法和数据调用的入口。类对象生成的方式主要有以下5种:1). 使用new关键字创建对象2). 使用Class类的newInstance方法(反射机制)3). 使用Constructor类的newInstance方法(反射机制)4). 使用Clone方法创建对象5). 使用(反)序列化机制创建对象。具体可以看这篇文章:

https://blog.csdn.net/justloveyou_/article/details/72466416

2.Verification验证

验证是连接阶段的第一步,这一阶段的主要目的是为了确保Class文件的字节流包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段是非常重要的,这个阶段是否严谨,直接决定了Java虚拟机是否能够承受恶意代码的攻击,从执行性能的角度上讲,验证阶段的工作量在虚拟机的类加载子系统中又占据了相当大的一部分。

此阶段主要包含如下几个部分的验证:

1.文件格式验证  2.元数据验证  3.字节码验证  4.符号引用验证

3.Preparation准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量使用的内存都将在方法区中进行分配。(此处需注意的是,准备阶段是为类变量分配内存并设置初始值而不是实例变量,类变量属于class,实例变量属于方法。实例变量将会在对象实例化时随着对象一起被分配在Java堆中)

4.Resolution解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析主要包括:

1.类或接口的解析 2.字段解析 3.类方法解析 4.接口方法解析

5.Initialization初始化

类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码(字节码)。初始化对于类来说,就是执行类构造器<clinit>()方法的过程。

类加载器

类加载器的作用:

类加载器,顾名思义就是用来加载类的,但是其作用不仅仅是加载类。因为对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器都拥有一个独立的类名称空间。

说直白点:比较两个类是否“相等”,只有它们是由同一个类加载器加载时,才有意义。对于同一个类,如果由不同类加载器加载,则他们也必然不相等。

(相等包括Class对象的equals方法、isAssignableFrom()方法、isInstance()方法返回的结果,也包括用instanceof关键词判断的情况)

类加载器的分类:

A.从Java虚拟机的角度:

1.Bootstrap ClassLoader启动类加载器

2.其他类加载器

从JVM的角度,加载器只分为两类,即JVM自身实现的Bootstrap启动类加载器,和其他JVM以外的所有类加载器。Bootstrap翻译为根,故也叫根类加载器。

B.从开发者的角度:

1.Bootstrap ClassLoader根类加载器

2.Extension ClassLoader拓展类加载器

3.Application ClassLoader应用程序类加载器

1.根类加载器,加载位于/jre/lib目录中的或者被参数-Xbootclasspath所指定的目录下的核心Java类库。此类加载器是Java虚拟机的一部分,使用native代码(C++)编写。

如图所示,rt.jar这个jar包就是Bootstrap根类加载器负责加载的,其中包含了java各种核心的类如java.lang,java.io,java.util,java.sql等

2.扩展类加载器,加载位于/jre/lib/ext目录中的或者java.ext.dirs系统变量所指定的目录下的拓展类库。此加载器由sun.misc.Launcher$ExtClassLoader实现。

3.系统类加载器,加载用户路径(ClassPath)上所指定的类库。此加载器由sun.misc.Launcher$AppClassLoader实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容