JVM:类加载与类加载机制(双亲委派等)
Posted liu++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM:类加载与类加载机制(双亲委派等)相关的知识,希望对你有一定的参考价值。
JVM(一):类加载与类加载机制(双亲委派等)
首先看jvm的整体结构
类加载器的作用
将.class文件中描述类的数据加载到内存,并且对数据进行校验、转换、解析和初始化。
类加载的三个步骤
加载
加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象。
java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的
链接
链接又分为三步:校验、准备、解析
-
校验:为保证安全对加载的信息进行校验。
-
准备:为类变量(static变量)分配内存并设置初始值(对final static变量赋值在编译期完成,对实例变量分配是在对象被实例化时)。
-
解析:将常量池内符号引用转换为直接引用。
符号引用:符号引用是以一组符号来描述所引用的目标,符号可以是任何的字面形式的字面量,只要不会出现冲突能够定位到就行。布局和内存无关。直接引用:是指向目标的指针,偏移量或者能够直接定位的句柄。该引用是和内存中的布局有关的,并且一定加载进来的。
初始化
执行clinit()方法,为static变量赋予正确的值,例如static int a=10,在加载阶段a=0,初始化后a=10。
类加载器分类
BootstrapClassLoader加载核心类(java、javax。。)是用c/c++实现的
ExtensionClassLoader lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父加载器是null。
SystemClassLoader程序写的类都是靠它加载的。
它们是上下级关系。
而自定义类加载去是可以“破坏”双亲委派机制的。
双亲委派机制
目的是为了保证安全!
当一个类加载器收到加载类请求时首先它要把这个请求交给上级类加载器!!!一直到最顶级,如果这个类最顶级可以加载那就加载,加载不了返回给下级!
优势
避免重复加载类
保证安全,防止核心jar被篡改
沙箱机制
对核心api保护,对于自定义的核心api,比如java.lang.*不允许加载或者加载的仍是核心api,可以理解为将自定义的会破坏双亲委派机制的类隔离。
类加载的机制
用时加载
参考
jvm之java类加载机制和类加载器(ClassLoader)的详解
Java类加载器–手写一个String类能否被类加载器加载?
深入理解Java虚拟机第三版第7章
以上是关于JVM:类加载与类加载机制(双亲委派等)的主要内容,如果未能解决你的问题,请参考以下文章