类加载子系统
主要职责
负责将类加载到内存中,对类校验,构建类的字节码文件。
类加载器是做什么的
类加载子系统中负责将类读取到内存中的对象。
有哪些类加载器
- BootstrapClassLoader(负责加载基础类库)
- ExtClassLoader(负责加载JDK扩展包中的类)
- AppClassLoader(负责加载自己写的类)
- 自己定义的类加载器
类加载机制
双亲委派机制(向上询问是否已经加载,向下委派是否能够加载)
优点:可以保证同一个类只被一个类加载器加载一次
缺点:1、可能对效率多少有一些影响。2、在同一个JVM下的项目,包名类名相同的类无法实现正确类加载。
类加载方式
- 显示加载
- 隐式加载
显示加载
- ClassLoader.loaderClass("ClassName")
- Class.forName("ClassName")
隐式加载
- 构建对象
- 访问类成员(类变量、静态方法)
类加载过程
- 加载(查找类、读取类)
- 连接(校验字节码结构、词法、语法),准备(静态变量初始化),解析(将一些符号引用转换成直接引用)
- 初始化类
- 创建字节码对象
初始化类的时机
主动使用会初始化:访问本类属性、访问本类方法、构建对象。
被动使用不会初始化:通过子类访问父类属性、通过子类访问父类方法。
初始化的动作
- 对静态属性进行赋值
- 执行静态代码块
自定义类加载器
为什么要自定义类加载器呢?
- 改变加载源
- 字节码进行加密、解密
- 扩展加载模型(打破双亲委派机制)
如何自定义类加载器?
继承ClassLoader并重写方法findClass()、loadClass()方法。
程序执行引擎
运行时数据区
为什么要存在运行时数据区?
- 存储数据(字节码信息、创建的对象、记录指令的地址)
- 执行计算
内存模型的构成
- 方法区
- 堆
- 栈
- 计数器
方法区
作用
负责存储类的字节码信息
如何调整大小
- 初始空间:-XX:MetaspaceSize=256m
- 最大空间:-XX:MaxMetaspaceSize=256m
可能出现的问题
类太多导致内存溢出
本地库接口
参数:
# 设置堆内存大小
-Xms<heap_size> # 初始堆大小
-Xmx<heap_size> # 最大堆大小
# 设置新生代大小
-Xmn<young_gen_size> # 新生代大小
-XX:NewRatio=<ratio> # 新生代和老年代的比例
# 设置永久代/元空间大小(仅适用于 JDK 8 之前的版本)
-XX:PermSize=<perm_size> # 初始永久代大小
-XX:MaxPermSize=<perm_size> # 最大永久代大小
# 设置垃圾回收器
-XX:+UseSerialGC # 使用串行垃圾回收器
-XX:+UseParallelGC # 使用并行垃圾回收器
-XX:+UseConcMarkSweepGC # 使用 CMS 垃圾回收器
-XX:+UseG1GC # 使用 G1 垃圾回收器
# 设置垃圾回收器参数
-XX:MaxGCPauseMillis=<pause_time> # 最大垃圾回收停顿时间
-XX:GCTimeRatio=<ratio> # 垃圾回收时间占总时间的比例
-XX:ParallelGCThreads=<num_threads> # 设置并行垃圾回收器的线程数
-XX:ConcGCThreads=<num_threads> # 设置 CMS 垃圾回收器的线程数
-XX:G1HeapRegionSize=<region_size> # 设置 G1 堆区域大小
# 设置元空间大小(JDK 8+)
-XX:MetaspaceSize=<metaspace_size> # 初始元空间大小
-XX:MaxMetaspaceSize=<max_metaspace_size> # 最大元空间大小
# 开启压缩指针(JDK 8+)
-XX:+UseCompressedOops # 使用压缩指针# 设置堆内存大小
-Xms512m # 初始堆大小为512MB
-Xmx2048m # 最大堆大小为2GB
# 设置新生代大小
-Xmn256m # 新生代大小为256MB
-XX:NewRatio=2 # 新生代和老年代的比例为1:2
# 大对象直接进入老年代的阈值
-XX:PretenureSizeThreshold=32m # 大对象直接进入老年代的阈值为32MB
# 设置垃圾回收器
-XX:+UseParallelGC # 使用并行垃圾回收器
-XX:+UseConcMarkSweepGC # 使用 CMS 垃圾回收器
# 设置垃圾回收器参数
-XX:MaxGCPauseMillis=200 # 最大垃圾回收停顿时间为200毫秒
-XX:ParallelGCThreads=4 # 设置并行垃圾回收器的线程数为4
-XX:ConcGCThreads=2 # 设置 CMS 垃圾回收器的线程数为2
# 设置元空间大小(JDK 8+)
-XX:MetaspaceSize=128m # 初始元空间大小为128MB
-XX:MaxMetaspaceSize=256m # 最大元空间大小为256MB
# 开启压缩指针(JDK 8+)
-XX:+UseCompressedOops # 使用压缩指针
# 其他常用参数
-XX:+UseBiasedLocking # 开启偏向锁
-XX:+DisableExplicitGC # 禁用显式 GC 调用
-XX:+HeapDumpOnOutOfMemoryError # 内存溢出时生成堆转储文件
-XX:HeapDumpPath=/path/to/dump # 指定堆转储文件的保存路径