Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

    • JVM

      • JVM内存模型
      • JVM垃圾回收中的道法术器
      • Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别
      • Minor GC时老年代在干什么
      • ​​Major GC时年轻代在干什么
      • Full GC​时年轻代和老年代在干什么
      • 常用垃圾回收器对比
      • OOM、内存泄漏与内存溢出的区别解析
      • 类的加载机制
  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • JVM
plantre
2025-05-04

JVM垃圾回收中的道法术器

JVM垃圾回收中的“道法术器”体系解析

一、道(原理与哲学)

  1. 自动内存管理的核心理念
    JVM垃圾回收(GC)的本质是通过自动化管理内存生命周期,避免内存泄漏和溢出。其核心哲学是“无感知回收”,开发者无需手动管理对象内存,降低心智负担。
    • 可达性分析算法:通过GC Roots(如虚拟机栈、静态变量等)构建引用链,判断对象是否存活。未被引用的对象标记为垃圾(如Object5、Object6、Object7在引用链外)。

    • 分代假设:根据对象存活时间将堆划分为年轻代(Young Generation)和老年代(Old Generation),采用不同回收策略(如年轻代用复制算法,老年代用标记整理)。

  2. 引用强度的层次性
    • 强引用(如Object obj = new Object()):即使内存不足也不会被回收。

    • 软引用/弱引用:分别在内存紧张时或下一次GC时回收,适用于缓存场景。

    • 虚引用:仅用于对象回收时的系统通知。


二、法(算法与策略)

  1. 经典垃圾回收算法
    • 标记-清除:分两阶段扫描内存,标记不可达对象后清除。优点简单直接;缺点内存碎片化(如图3中的内存空洞)。

    • 复制算法:将内存分为两半,存活对象复制到另一半后清空原区域。优点无碎片;缺点内存利用率低(仅50%)。

    • 标记-整理:标记后移动存活对象至内存前端,解决碎片问题(如图5),但耗时较长。

  2. 分代收集的实践
    • 年轻代:Eden区新对象快速分配,Survivor区通过复制算法筛选存活对象(如From/To区交替使用)。

    • 老年代:采用标记整理或并发标记清除(CMS),减少长时间停顿。


三、术(垃圾收集器实现)

  1. 按代划分的经典收集器
    • Serial GC:单线程STW回收,适用于客户端或小内存场景。

    • Parallel GC(吞吐量优先):多线程并行回收,适合计算密集型任务。

    • CMS:并发标记清除,减少停顿时间,但存在内存碎片问题(JDK9后废弃)。

  2. 新一代收集器
    • G1(Garbage-First):以Region为单元划分堆,优先回收垃圾最多的区域(Mixed GC模式),支持可预测停顿(如-XX:MaxGCPauseMillis=200)。

    ◦ Region设计:支持Eden、Survivor、Old和Humongous分区,解决大对象处理难题。

    ◦ RSet(记忆集):记录跨代引用,避免全堆扫描(如老年代引用年轻代对象)。

    • ZGC:基于染色指针和读屏障实现亚毫秒级停顿(<10ms),支持TB级堆内存(JDK15+生产可用)。

    • Shenandoah:类似ZGC,但通过Brooks指针实现并发整理,适用于低延迟场景。


四、器(工具与调优)

  1. JVM参数配置
    • 堆内存:-Xmx(最大堆)、-Xmn(年轻代大小)。

    • 收集器选择:-XX:+UseG1GC(启用G1)、-XX:+UseZGC(启用ZGC)。

  2. 监控与诊断工具
    • 命令行工具:jstat(实时监控GC统计)、jmap(堆转储分析)、jstack(线程堆栈跟踪)。

    • 图形化工具:JConsole、VisualVM(可视化堆内存与GC活动)。

    • GC日志分析:通过-XX:+PrintGCDetails记录详细回收过程,结合工具(如GCViewer)优化停顿时间。


总结与选型建议

• 低延迟场景:优先选择G1、ZGC或Shenandoah。

• 高吞吐量场景:Parallel GC或G1的默认模式。

• 超大堆内存:ZGC(TB级)或分代ZGC(JDK21+)。

• 调优核心:通过监控工具分析GC日志,平衡吞吐量、延迟和内存占用(如调整Region大小、并发线程数)。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
JVM内存模型
Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别

← JVM内存模型 Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式