JVM系列二(类加载器子系统)

Java虚拟机(JVM)系列二

类加载子系统

一.类加载器子系统整体架构

类加载器子系统.png
  • 类加载器子系统负责从文件或网络中加载Class文件(字节码文件),字节码文件在文件开头有特定文件标识
  • ClassLoader只负责Class文件的加载,至于能否运行,则由ExecutionEngine(执行引擎)负责
  • 加载的类信息存放在一个叫方法区的内存空间。方法区还会存放运行时常量池信息,可能还包括字符串变量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

二.类加载器子系统具体加载过程分析

1.加载(Loading)
  • 通过一个类的全限定名来获取定义此类的二进制流文件
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  • 在内存中生成一个代表此类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2.链接(Linking)
(1)验证(Verify)
  • 确保Class文件的字节流中信息符合当前虚拟机的要求,如文件开头特定标识(CAFEBYBE)
  • 主要包括四种验证:文件格式、元数据、字节码、符号引用验证
(2)准备(Prepare)
  • 类变量分配内存并设置该类变量的初始值,即零值
  • 这里不包括用 final修饰的static,因为final在编译的时候就被分配了,准备阶段会显示初始化
  • 这里不会为实例变量分配初始化,类变量会分配到方法区中,实例变量会随对象一起分配到Java堆中。
(3)解析(Resolve)
  • 常量池内的符号引用转换为直接引用的过程
3.初始化(Initialization)
  • 初始化阶段就是执行类构造器方法<clinit>()的过程
  • 此方法不需定义,是javac编译器自动收集类中的所有类变量(静态变量)的赋值动作和静态代码块中语句合并而来
  • 构造器方法中的指令按照在源文件中的出现顺序执行
  • <clinit>() 不同于类的构造器
  • 若该类具有父类,JVM会保证在子类的<clinit>()执行前,父类的<clinit>()已经执行完毕
  • 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁(一个类只加载一次)

三.类加载器分类

类加载器分类.png
  • JVM支持两种类型的类加载器,即引导类加载器(BootstrapLoader)和自定义类加载器(User-Defined ClassLoader)
  • JVM规范定义,将所有派生于抽象类的ClassLoader的类加载器都划分为自定义类加载器,所以扩展类加载器系统类加载器也在自定义类加载器中包含。
  • Java核心类库都是引导类加载器进行加载的(Eg:String)
1.引导类加载器(也叫启动类加载器 虚拟机自带的加载器)
  • c/c++ 语言开发的,嵌套在JVM中,在代码中获取不到,获取的时候会得到null
  • 它用来加载Java核心类库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类
  • 不继承java.lang.ClassLoader,没有父加载器
  • 加载扩展类和系统类加载器,并制定为他们的父类加载器
  • 只加载包名为 java、javax、sun等开头的类
2.扩展类加载器( 虚拟机自带的加载器)
  • Java语言编写,由sun.misc.Launcher$ExClassLoader实现
  • 派生于ClassLoader类
  • 父类加载器为启动类加载器
  • 从java.ext.dirs系统属性所指定目录中加载或者JDK安装目录 jre/lib/ext 子目录下加载类库
3.系统类加载器(也叫应用程序类加载器 虚拟机自带的加载器)
  • Java语言编写,由sun.misc.Launcher$AppClassLoader实现
  • 派生于ClassLoader类
  • 父类加载器为启动类加载器
  • 负责加载环境变量classpath或系统属性java.class.path指定路径下的类库
  • 是程序中磨人的类加载器。一般来说,Java应用的类都由它加载
4.自定义类加载器
  • 后续具体讲解
5.ClassLoader
  • 它是一个抽象类,所有类加载器都继承自它(除了 引导类加载器)
  • 可通过以下方式获取ClassLoader


    获取加载器类型的方法.png

四.双亲委派机制

1.工作原来及演示
  • 当一个类加载器收到类加载请求,他并不会自己先加载,而是会把这个请求委托给他的父类加载器去执行
  • 如果父类加载器还存在其父类加载器,会继续向上委托,依次递归,请求将到达顶层的引导类加载器
  • 如果父类加载器可以完成加载任务,就成功返回,倘若父类加载器无法完成,子类加载器才会自己尝试加载。
2.优势
  • 避免类的重复加载
  • 保护程序安全,防止核心API被篡改(沙箱安全机制)
       解释:自定义java.lang.String,添加main()方法,但是在加载自定义String类的时候,会率先使用引导类加载器加载,而引导类加载器在加载的时候会先加载jdk自带文件(rt.jar包中java.lang.String.class),报错信息说没有main()方法,就是因为加载的是tr.jar包中的String类。这样可以保证对java核心源代码的保护,这就是沙箱安全机制

五.其他

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