JVM构成

本文详细阐述了Java类加载子系统的职责、类加载器类型及其工作机制,包括双亲委派机制、显示加载和隐式加载,同时介绍了运行时数据区的作用以及内存模型的构成,如方法区、堆栈计数器等,还讨论了自定义类加载器的需求和实现,以及垃圾回收器的设置和优化。
摘要由CSDN通过智能技术生成

类加载子系统

主要职责

负责将类加载到内存中,对类校验,构建类的字节码文件。

类加载器是做什么的

类加载子系统中负责将类读取到内存中的对象。

有哪些类加载器

  • BootstrapClassLoader(负责加载基础类库)
  • ExtClassLoader(负责加载JDK扩展包中的类)
  • AppClassLoader(负责加载自己写的类)
  • 自己定义的类加载器

类加载机制

双亲委派机制(向上询问是否已经加载,向下委派是否能够加载)

优点:可以保证同一个类只被一个类加载器加载一次

缺点:1、可能对效率多少有一些影响。2、在同一个JVM下的项目,包名类名相同的类无法实现正确类加载。

类加载方式

  • 显示加载
  • 隐式加载
显示加载
  1. ClassLoader.loaderClass("ClassName")
  2. Class.forName("ClassName")
隐式加载
  1. 构建对象
  2. 访问类成员(类变量、静态方法)

类加载过程

  1. 加载(查找类、读取类)
  2. 连接(校验字节码结构、词法、语法),准备(静态变量初始化),解析(将一些符号引用转换成直接引用)
  3. 初始化类
  4. 创建字节码对象
初始化类的时机

主动使用会初始化:访问本类属性、访问本类方法、构建对象。

被动使用不会初始化:通过子类访问父类属性、通过子类访问父类方法。

初始化的动作 
  • 对静态属性进行赋值
  • 执行静态代码块

自定义类加载器

为什么要自定义类加载器呢?
  • 改变加载源
  • 字节码进行加密、解密
  • 扩展加载模型(打破双亲委派机制)
如何自定义类加载器?

继承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   # 指定堆转储文件的保存路径

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值