JVM学习笔记---------类加载机制

说类加载器之前先说说类加载机制.

类加载机制:

1. 概念:

虚拟机把class文件加载到内存,并对数据进行检验,转换分析和初始化,形成虚拟机能够使用的java文件.

2.加载步骤:

1) 装载:
a. 查找和导入class文件
b. 类加载器Classloader加载文件

类加载器主要做了三件事情:
1.通过一个类的全限定名获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转换为方法区运行时数据结构
3.在java堆中生成一个代表这个类的java.lang.class对象,作为方法区中这些数据访问的入口.

2) 链接:

1.验证:保证被加载类的正确性,可理解为编译期错误(比如当我们有时候启动项目时,会有些pojo缺包导致启动失败)
2.准备:为类的静态变量分配内存并初始化默认值.
举例:

   private static a = 3   //此时会给静态变量a分配内存,并赋值为默认值0 

此时a的值并不是3.而是0
3.解析:将类中的符号引用转为直接引用.
其实大家打开class文件会发现里面都是十六进制的字节码.类似于这样:
JVM学习笔记---------类加载机制_第1张图片

可以在java官方文档上查到相关的一些东西帮助我们读取这中文件:
JVM学习笔记---------类加载机制_第2张图片
u4表示前四位,magic表示class文件固定开头格式 默认都为cafe babe
再往后两位为最小版本号,图片表示为0000
再往后两位是最大版本号,图片为0034
就不一一说了,大家可以自己查询.

而上面说的符号引用就是这种的引用,直接引用就是我们能够看懂的内容.

3)初始化 :

对类的静态变量初始化操作.
例如刚刚举的例子
private static a = 3
就是在初始化的时候才会将3赋值给变量a.

类加载器

JVM学习笔记---------类加载机制_第3张图片
当我们在加载一个类时,优先会让顶层的加载器加载,当顶层加载器加载成功时,其他的加载器不会再次加载,保证类只被加载一次.

双亲委派机制: 当我们自定义了加载器时,同样也会有顶层的父加载器加载,当自定义的加载器再去加载该类时会发现该类已被加载,则不会再次加载.

Over

你可能感兴趣的:(java)