JVM:组成、垃圾回收器、垃圾回收算法、常见命令

一、JVM 核心组成

JVM 主要由以下四部分组成,协同管理内存、执行字节码和资源回收:

1. 类加载子系统(Class Loader Subsystem)
  • 作用:加载 .class 文件到内存,生成 Class 对象。
  • 关键流程
    加载
    验证
    准备
    解析
    初始化
  • 双亲委派模型
    • 层级:Bootstrap → Extension → Application → 自定义类加载器
    • 原则:优先由父加载器加载,避免核心类被篡改。
2. 运行时数据区(Runtime Data Areas)
区域作用线程共享性异常
堆(Heap)存储对象实例和数组,GC 主战场共享OutOfMemoryError
方法区(Metaspace)存储类元数据(JDK8+ 使用本地内存)共享Metaspace OOM
虚拟机栈(JVM Stack)存储栈帧(局部变量表、操作数栈、方法出口等)线程私有StackOverflowError
本地方法栈为 Native 方法(如 C/C++ 代码)服务线程私有StackOverflowError
程序计数器(PC)记录当前线程执行的位置(唯一无 OOM 的区域)线程私有
3. 执行引擎(Execution Engine)
  • 解释器:逐行解释字节码,启动速度快,执行效率低。
  • 即时编译器(JIT):将热点代码编译为机器码(如 C1、C2 编译器),提升执行效率。
  • 垃圾回收器(GC):自动回收堆内存中的无用对象。
4. 本地方法接口(JNI)
  • 提供调用操作系统底层功能(如文件操作、网络通信)的接口。

二、垃圾回收算法与回收器

1. 垃圾回收算法
算法原理优点缺点适用场景
标记-清除标记无用对象后清除实现简单内存碎片化老年代(CMS)
复制算法将存活对象复制到另一块内存无碎片,高效内存利用率低(50%)新生代(Survivor)
标记-整理标记后移动存活对象到一端无碎片,内存紧凑移动成本高老年代(G1、ZGC)
分代收集新生代(复制算法)+ 老年代(标记-整理)针对不同区域优化需组合使用主流 JVM
2. 垃圾回收器对比
收集器算法特点适用场景参数
Serial新生代:复制
老年代:标记-整理
单线程,STW 时间长客户端、小内存-XX:+UseSerialGC
Parallel Scavenge新生代:复制
老年代:标记-整理
多线程,吞吐量优先后台计算型应用-XX:+UseParallelGC
CMS标记-清除并发收集,低停顿响应速度敏感型应用-XX:+UseConcMarkSweepGC
G1标记-整理 + 复制分区化收集,可预测停顿时间大内存、低延迟-XX:+UseG1GC
ZGC染色指针 + 读屏障超低停顿(<10ms),TB 级堆超大内存、极致低延迟-XX:+UseZGC

三、JVM 常用命令与机制

1. 常用诊断命令
命令功能示例
jps查看 Java 进程 PIDjps -l(显示主类全名)
jstat监控 GC、类加载、JIT 编译状态jstat -gcutil PID 1000 5(每 1s 输出一次,共 5 次)
jmap生成堆内存快照(Heap Dump)jmap -dump:live,format=b,file=heap.hprof PID
jstack生成线程快照(排查死锁、线程阻塞)jstack -l PID > thread_dump.txt
jinfo查看/修改 JVM 参数jinfo -flags PID
2. 关键机制与调优参数
  • 内存分配策略

    • 对象优先在 Eden 区分配:新生代内存不足时触发 Minor GC。
    • 大对象直接进入老年代:通过 -XX:PretenureSizeThreshold 设置阈值。
    • 长期存活对象进入老年代:通过 -XX:MaxTenuringThreshold 设置年龄阈值。
  • GC 调优参数

    -Xmx4g -Xms4g           # 堆最大/初始内存
    -XX:NewRatio=2          # 老年代:新生代=2:1
    -XX:SurvivorRatio=8     # Eden:Survivor=8:1:1
    -XX:+UseG1GC            # 启用 G1 回收器
    -XX:MaxGCPauseMillis=200 # G1 最大停顿时间目标
    -XX:+PrintGCDetails     # 打印 GC 详细信息
    
3. OOM 排查流程
  1. 确定 OOM 类型:根据错误日志(如 Java heap spaceMetaspace)。
  2. 生成 Heap Dump:使用 jmap-XX:+HeapDumpOnOutOfMemoryError
  3. 分析 Dump 文件:通过 MAT(Memory Analyzer Tool)VisualVM 查找内存泄漏对象。
  4. 定位代码问题:检查静态集合、未关闭资源(如数据库连接)、大对象分配。

四、总结

  • JVM 组成:类加载、运行时数据区、执行引擎、本地方法接口。
  • 垃圾回收器选择
    • 小内存/客户端:Serial / Parallel。
    • 响应优先:CMS(JDK8)或 G1(JDK11+)。
    • 超大堆:ZGC 。
  • 核心命令jpsjstatjmapjstack
  • 调优原则:根据业务场景平衡 吞吐量延迟内存占用
### JVM 垃圾回收算法类型及详解 JVM垃圾回收(Garbage Collection,GC)是内存管理的重要组成部分。它通过自动管理内存,防止内存泄漏,提高应用程序的稳定性和性能。以下是 JVM常见垃圾回收算法及其详细说明: #### 1. **复制算法(Copying Algorithm)** 复制算法主要用于处理年轻代对象的回收。其基本思想是将内存划分为两个相等的区域(通常称为 From 区和 To 区),每次仅使用其中一个区域存放对象。当进行垃圾回收时,将存活的对象复制到另一个区域,并清理当前区域的所有对象[^1]。 优点: - 实现简单,运行高效。 - 不会产生内存碎片。 缺点: - 内存利用率较低,因为只使用了一半的内存空间。 #### 2. **标记-清除算法(Mark and Sweep Algorithm)** 标记-清除算法分为两个阶段:标记阶段和清除阶段。在标记阶段,遍历所有可访问的对象并打上标记;在清除阶段,遍历整个堆,清除未标记的对象,释放它们占用的内存[^3]。 优点: - 无需额外的内存空间来存储存活对象。 缺点: - 清除阶段会产生不连续的内存碎片,可能导致后续分配大对象时无法找到足够的连续空间。 #### 3. **标记-整理算法(Mark and Compact Algorithm)** 标记-整理算法是对标记-清除算法的改进。在标记阶段完成后,将所有存活的对象移动到堆的一端,从而避免了内存碎片问题[^4]。 优点: - 避免了内存碎片的产生。 缺点: - 移动对象需要额外的时间开销。 #### 4. **分代收集算法(Generational Collection Algorithm)** 分代收集算法基于对象的生命周期特点,将堆内存分为年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)。不同代的内存区域采用不同的垃圾回收算法。例如,年轻代通常使用复制算法,而老年代可能使用标记-清除或标记-整理算法[^5]。 优点: - 提高了垃圾回收的效率,减少了停顿时间。 缺点: - 需要对不同代的内存区域分别进行管理。 #### 5. **CMS 收集器(Concurrent Mark-Sweep Collector)** CMS 收集器是一种以获取最短回收停顿时间为目标的收集器。它主要应用于老年代的垃圾回收,采用“标记-清除”算法[^4]。 优点: - 并发收集,停顿时间短。 缺点: - 对 CPU 资源敏感。 - 可能存在浮动垃圾问题,即在并发标记和清理阶段产生的垃圾无法及时回收。 - 标记-清除算法可能导致内存碎片。 #### 6. **G1 收集器(Garbage First Collector)** G1 收集器是 JDK 7 引入的一种新型垃圾收集器,目标是在保证吞吐量的同时减少停顿时间。它将堆划分为多个大小相等的区域(Region),并通过预测停顿时间来选择回收哪些区域[^5]。 优点: - 可以精确控制停顿时间。 - 减少了内存碎片。 缺点: - 初期配置较为复杂。 ### 示例代码 以下是一个简单的 Java 程序,展示如何通过 JVM 参数启用不同的垃圾收集器: ```java public class GCExample { public static void main(String[] args) { System.out.println("Using G1 Garbage Collector"); } } ``` 可以通过以下命令启用 G1 收集器: ```bash java -XX:+UseG1GC GCExample ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值