JVM类加载机制讲解
文章目录
- 前言
- JVM类加载机制讲解
- 一、什么是JVM类加载机制?
- 二、类加载的时机
- 三、类加载的五个阶段
- 1、加载:
- 2、验证:
- 3、准备:
- 4、解析:
- 5、初始化:
- 四、什么类型的数据不会初始化? ------- 论点
- 结论:
- 论证前准备:
- 论证:
- 例子1:使用类字段
- 例子2:通过数组定义来引用类,不会触发此类的初始化
- 例子3:常量测试,不会触发定义常量所在类的初始化
- 五、类加载器
- 1、【类加载器】用处:
- 2、【类加载器】使用原则:
- 3、【类加载器】特性:
- 六、JVM提供了三种类加载器,分别为:
- 七、双亲委派
- 八、打破双亲委派例子
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
JVM类加载机制讲解
一、什么是JVM类加载机制?
概述:java JVM 把【描述类的数据】从class文件中加载到内存,并对该数据进行验证,转换解析和初始化,最终形成可以
【被虚拟机直接使用的java类型】,这个过程我们成为【JVM的类加载机制】。
二、类加载的时机
类【加载】的五个阶段:
加载、验证、准备、解析、初始化
类从【加载】到【卸载】的整个生命周期:
加载、验证、准备、解析、初始化、使用、卸载,其中验证、准备、解析可以把他们统称为连接:
即生命整个生命周期:
【加载】 --> 【连接】 -->【初始化】 --> 【使用】 --> 【卸载】
三、类加载的五个阶段
1、加载:
1)通过一个类的全限定定名来获取【定义此类的二进制字节流】:。
2)将这个字节流中所代表的【静态存储结构】:转化为【方法区中的运行时数据结构】:。
3)在内存中生成一个【代表这个类的 java.lang.Class 对象】:,作为方法区这个类的各种数据的入口。
2、验证:
确保 Class 文件的字节流中包含的信息是否符合【当前虚拟机】:的要求,保证这些信息被当做代码运行后,不会对JVM造成自身安全。
3、准备:
在方法区中分配这些变量所使用的内存空间。
4、解析:
虚拟机将常量池中的符号引用替换为直接引用的过程。
5、初始化:
执行类中定义的 Java 程序代码。
注::初始化阶段,主要通过类构造器来实现,即初始化阶段是执行类构造器方法的过程:。
四、什么类型的数据不会初始化? ------- 论点
结论:
所有【引用类型】外加【常量】的方式都不会触发初始化,我们称之为【被动引用】。
论证前准备:
什么是引用类型,什么是基础类型:
在Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。
【基础类型】:byte,short,int,long,char,float,double,Boolean
【引用类型】:类类型,接口类型和数组。
论证:
例子1:使用类字段
原因:通过子类引用父类的静态字段,不会导致子类初始化,对于静态字段,只有直接定于这个字段的类才会初始化。
public class SuperClass {static {System.out.println("This is SuperClass !!!");}public static int index = 55555;
}
public class NodeClass extends SuperClass{static {System.out.println("This is NodeClass");}
}
使用:
public static void main(String[] args) {System.out.println(NodeClass.index);
}
效果:父类初始化,子类并没有初始化
例子2:通过数组定义来引用类,不会触发此类的初始化
原因:数组是引用类型
正常初始化:
public static void main(String[] args) {NodeClass test = new NodeClass();}
效果:正常初始化
用数组初始化:
public static void main(String[] args) {NodeClass[] superClass = new NodeClass[10];}
效果:通过数组定义引用类,不会触发此类的初始化
例子3:常量测试,不会触发定义常量所在类的初始化
原因:在源码阶段,确实引用常量类ConstClass中的HELLO_WORLD,但实际上在编译阶段通过常量传播优化,
已经将此常量的值"hello world !!!" 直接存在ConstClass类的常量池中,因此ConstClass类对HELLO_WORLD中的引用,
其实都转化成类对自身【常量池】的引用了。
public class ConstClass {static {System.out.println("This is ConseClass");}public static final String HELLO_WORLD = "hello world !!!";public static String index = "Hello World !!!";
}
类调非常量:
public static void main(String[] args) {System.out.println(ConstClass.index);
}
效果:正常初始化
类调常量:
public static void main(String[] args) {System.out.println(ConstClass.HELLO_WORLD);
}
效果:不会触发定义常量所在类的初始化
五、类加载器
1、【类加载器】用处:
对于任何一个类,都必须由【加载它的类加载器】和【类本身】一起共同确认其在java JVM中的【唯一性】
2、【类加载器】使用原则:
类加载器是在双亲委派模型的基础上实现的。
3、【类加载器】特性:
每个类加载器,都拥有一个【独立的类名称空间】,即如果比较两个类是否相等,只有在这两个类在都是由同一个类加载器加载而来的前提下,才有意义。
六、JVM提供了三种类加载器,分别为:
1)启动类加载器(Bootstrap ClassLoader)
负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被
虚拟机认可(按文件名识别,如 rt.jar)的类。
2)扩展类加载器(Extension ClassLoader)
负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类
库。
3)应用程序类加载器(Application ClassLoader):
负责加载用户路径(classpath)上的类库。
JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader 实现自定义的类加载器。
七、双亲委派
双亲委派模型:
概述:
当一个类收到了类加载器的请求时,他首先不会尝试自己去加载这个类,而是把这个请求委派给【父类加载器】去完成,每一个层次的【类加载器】都是如此,因此所有的加载请求都应该传送到最顶层的【启动类加载器】其中, 只有当【当父类加载器】反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的 Class),【子类加载器】才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载 器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载 器最终得到的都是同样一个 Object 对象。
好处:
1)保证java类型体系中最基础的行为
2)双亲委派模型对于保证java程序的稳定运作极为重要
八、打破双亲委派例子
OSGI实现的模块化部署打破双亲委派模型
即在OSGI环境下,类加载器不在是双亲委派模型推荐的【树状结构】,而是进一步发展为更加复杂的【网状结构】。
JVM类加载机制讲解相关推荐
- JVM基础系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
- 【Java虚拟机规范】JVM类加载机制
[Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...
- JVM类加载机制(ClassLoader)源码解析
http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...
- 深入理解JVM虚拟机6:深入理解JVM类加载机制
深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...
- jvm类加载机制_面试:对于JVM类加载机制深度解析
目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...
- jvm类加载机制_JVM 类加载机制
学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑 Java 的类加载机制,这是 Java 的一个很重要的创新点,曾经也是 Java 流行的重要原因之一. Oracle 当初引入这个机制是为 ...
- JVM(2)——JVM类加载机制
一.JVM类加载机制简介 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言里面 ...
- jvm类加载机制和类加载器_在JVM之下–类加载器
jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...
- JVM类加载机制详解
本文来详细说下JVM类加载机制 文章目录 概述 类加载器是什么 类加载的过程 加载 连接 初始化 类的主动引用和被动引用 主动引用 被动引用 三种类加载器 双亲委托机制 核心思想 源码分析 类的动态加 ...
最新文章
- mysql 主从复制 position_mysql 主从复制原理及步骤。
- 挑战独立开发项目能力___ITlanbao
- freemark静态页面中文乱码
- shell脚本中用到的条件和循环语句
- SAP MM模块-实施顾问岗位-面试手册-项目管理经验面试清单-英文
- Edge Deletion CodeForces - 1076D(水最短路)
- sass-loader高版本的坑
- hmtl--textarea的滚动条(转)
- 反编译工具ILSpy下载
- 8、Linux下文件服务器搭建及原理讲解
- arm触摸屏的头文件_ARM触屏校准程序
- 软件工程阶段性总结(四)——测试和维护
- Oracle-表空间管理
- unturned服务器参数修改,《Unturned》3.X.X控制台指令教程
- 2022大作业项目报告
- 英雄联盟 无法服务器未响应,Win7英雄联盟登陆服务器未响应的解决方法
- 如何禁用 粘滞键(连按5次 shift键)
- L2级ADAS前装搭载量1月同比增超6成,国产供应商“崭露头角”
- 华为服务器怎么连接显示器,服务器怎么链接显示器
- 2022最新盲盒商城完整开源运营源码/对接免签支付接口/搭建教程
热门文章
- delphi WinExec CMD调用
- C++买糖-开学了,老师想要买棒棒糖分给同学们作为开学礼物。商店里共有两种包装的棒棒糖,每一包里面棒棒糖的数量可能不同,价格也不同。为了公平,老师决定只买一种棒棒糖。商店不允许将棒棒糖的包装拆开
- linux mrtg 进程名称,linux 下MRTG的使用
- 封面新闻的笔试小项目
- 2021青年男女健康调查:健康心虚指数飙升,90后压力感知最高
- Linux中chkconfig命令详解
- java nfa dfa_NFA 、DFA 简述
- debug没问题,release有问题的情况
- NewSQL是伪命题还是真突破?NewSQL系统综述
- 分时线的9代表什么_一位65岁长沙股神告诉你:为什么要打板?写给那些一年想几十倍的人!...