【JVM学习笔记】三、类加载过程及类加载器

关于JVM 的学习笔记,再再更新一下~

这一篇主要记录类加载过程及类加载器

一、class文件结构

  • 根据JVM规范,class 文件通过ClassFile 定义,类似于C语言中的结构体,通过分析ClassFile 可以知道class文件结构
  • class文件结构包括如下部分:
  1. 魔数:头四个字节,确定该文件能否被虚拟机接收
  2. 版本号:次版本号 + 主版本号
  3. Class 常量池及其计数器:存放字面量和符号引用(JVM中有三种常量池:运行时常量池、字符串常量池、Class常量池)
  4. 访问标志(access_flag):类 or 接口,是否public, 是否abstract,是否final等等
  5. 当前类、父类、实现接口的索引集合
  6. 字段表、方法表、属性表的集合及其数量

二、类的生命周期

加载——连接(验证-准备-解析)——初始化——使用——卸载

  • 卸载一个类需要满足的三个条件:所有实例对象已被GC,该类没有引用了,该类加载器的实例已被GC
  • JVM自带的类加载器加载的类不会被卸载,但是自定义的类加载器加载的类可能被卸载

三、类加载的过程

加载——连接(验证-准备-解析)—初始化

  • 加载(3件事)
  1. 通过全类名获取定义此类的二进制字节流(JAR、WAR)
  2. 将字节流的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的Class对象,作为方法区数据的访问入口

非数组类的加载阶段可控性最强,还可以自定义类加载器(重写一个类加载器的loadClass()方法)数组类型不通过类加载器创建,JVM直接创建

  • 验证(4个东西)
  1. 文件格式验证:文件是否规范(开头是否正确,主次版本号是否在处理范围内,常量池中的常量是否都是支持的类型)
  2. 元数据验证:对字节码描述的信息进行语义分析(是否有父类,是否继承了不被允许的类)
  3. 字节码验证:最复杂,确定程序语义合法
  4. 符号引用验证:确保能够正常解析
  • 准备:为类变量分配内存并设置初始值
  1. 只管类变量(static修饰的,亦称静态变量),不管实例变量。放进方法区
  2. 此处“初始值”指该变量所属类型的“零值”
  • 解析:符号引用替换为直接引用,针对类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用限定符

符号引用就是描述目标的字面量,直接引用就是直接指向目标的指针、相对偏移量或句柄

  • 初始化:执行(编译后自动生成)方法(有且仅有5种情况一定要初始化)
  1. new、getstatic、putstatic、invokestatic等四个直接码
  2. 反射调用一个类
  3. 初始化一个类其父类未初始化的话先初始化
  4. main方法说在类

四、类加载器有哪些

BootstrapClassLoader、ExtensionClassLoader、AppClassLoader

  1. BootstrapClassLoader:启动类加载器,由C++实现,负责加载%JAVA_HOME%/lib

目录下的 jar 包和类或者被 -Xbootclasspath参数指定的路径中的所有类

  1. ExtensionClassLoader:扩展类加载器,主要负责加载%JRE_HOME%/lib/ext

    目录下的 jar 包和类,或被 java.ext.dirs系统变量所指定的路径下的 jar 包。

  2. AppClassLoader:应用程序类加载器,面向用户,负责加载当前应用classpath下的所有jar包和类

五、多个ClassLoader协同工作的机制是什么?(双亲委派模型)

双亲委派模型:自下而上检查类是否被加载,自上而下尝试加载这个类

  • 实现代码在java.lang.ClassLoader的loadClass()中
  • 继承ClassLoader后,重写findClass()可以不打破双亲委派模型自定义类加载器,重写loadClass()可以打破双亲委派模型自定义类加载器
  • 优点是保证JAVA 程序的稳定运行,避免类的重复加载

【JVM常用参数】

-Xms -Xmx:最小堆内存、最大堆内存

-XX:NewSize -XX:MaxNewSize:新生代最小、最大内存

-Xmn:新生代内存(最小最大同)

-XX:NewRatio:新生代老年代比例

-XX:PermSize -XX:MaxPermSize:方法区最小、最大内存

-XX:MetaspaceSize -XX:MaxMetaspaceSize:元空间最小、最大内存

-XX:+UseSerialGC:Serial GC

-XX:+UseParallelGC:Parallel GC

-XX:+UseConcMarkSweepGC:CMS GC

-XX:+UseG1GC:G1 GC

-XX:+UseGCLogFileRotation:GC 记录

------ 本文结束,感谢观看! ------
 wechat
扫一扫,访问本站