当前位置: 首页 > news >正文

JAVA中JVM一次 GC的 流程

一、JVM 中一次完整的 GC 流程(以分代回收为例)

JVM 的垃圾回收(GC)流程依赖于分代收集机制,不同区域(新生代、老年代)采用不同的回收策略。以下是典型的完整 GC 流程(以 Parallel Scavenge + Parallel Old 组合为例):


1. Minor GC(新生代回收)
  • 触发条件

    • 新生代(Eden 区)空间不足,无法分配新对象。

  • 流程

    1. 标记存活对象
      从 GC Roots(如线程栈、静态变量等)出发,标记所有存活对象。

    2. 复制存活对象
      将 Eden 区和当前使用的 Survivor(From 区)中的存活对象复制到另一个 Survivor(To 区),并清空 Eden 和 From 区。

    3. 年龄增长
      Survivor 区中存活对象的年龄(Age)增加 1。

    4. 晋升老年代
      若对象年龄达到阈值(默认 15),或 Survivor 区空间不足,存活对象会晋升到老年代。


2. Major GC / Full GC(老年代回收)
  • 触发条件

    • 老年代空间不足(如晋升失败)。

    • 显式调用 System.gc()(不推荐)。

    • 元数据区(Metaspace)空间不足。

  • 流程(以 Parallel Old 为例):

    1. 标记存活对象
      标记老年代中所有存活对象。

    2. 压缩整理(Compaction)
      将所有存活对象向老年代一端移动,清理碎片化空间。

    3. 更新引用
      修正所有指向被移动对象的引用地址。


二、对象晋升到老年代的条件

对象从新生代晋升到老年代的条件如下:

  1. 年龄阈值

    • 对象在 Survivor 区经历的 Minor GC 次数达到阈值(默认 -XX:MaxTenuringThreshold=15)。

  2. 动态年龄判断

    • 如果 Survivor 区中某年龄段的对象总大小超过 Survivor 区的一半,则所有大于等于该年龄的对象直接晋升。

  3. 大对象直接进入老年代

    • 若对象大小超过 -XX:PretenureSizeThreshold(默认 0,需手动设置),直接分配到老年代。

  4. Survivor 区空间不足

    • 当 Survivor 区无法容纳 Minor GC 后的存活对象时,直接晋升到老年代。


三、重要的 JVM 参数

以下是常见的 JVM 参数分类说明:


1. 堆内存相关
参数作用示例
-Xms初始堆大小-Xms512m(堆初始 512MB)
-Xmx最大堆大小-Xmx4g(堆最大 4GB)
-Xmn新生代大小-Xmn1g(新生代 1GB)
-XX:NewRatio新生代与老年代比例-XX:NewRatio=2(老年代:新生代=2:1)
-XX:SurvivorRatioEden 区与 Survivor 区比例-XX:SurvivorRatio=8(Eden:Survivor=8:1:1)

2. GC 行为控制
参数作用示例
-XX:+UseSerialGC使用串行回收器(单线程)(适合低配机器)
-XX:+UseParallelGC使用 Parallel Scavenge 回收器(默认并行回收新生代)
-XX:+UseConcMarkSweepGC使用 CMS 回收器(已废弃)(低停顿,Java 8 前常用)
-XX:+UseG1GC使用 G1 回收器(分区回收,Java 9+ 默认)
-XX:MaxTenuringThreshold对象晋升年龄阈值-XX:MaxTenuringThreshold=15
-XX:PretenureSizeThreshold大对象直接进入老年代的阈值-XX:PretenureSizeThreshold=2m

3. GC 日志与监控
参数作用示例
-XX:+PrintGCDetails打印 GC 详细信息(需配合日志分析工具)
-XX:+PrintGCDateStamps输出 GC 时间戳
-Xloggc:<path>指定 GC 日志文件路径-Xloggc:/logs/gc.log
-XX:+HeapDumpOnOutOfMemoryErrorOOM 时生成堆转储(用于分析内存泄漏)

4. 元数据区(Metaspace)
参数作用示例
-XX:MetaspaceSize初始元数据区大小-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize元数据区最大大小-XX:MaxMetaspaceSize=256m

四、示例参数配置

# 启动一个 Java 应用,配置堆大小和 G1 回收器
java -Xms2g -Xmx2g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:MetaspaceSize=128m \
     -XX:MaxMetaspaceSize=256m \
     -Xloggc:/logs/gc.log \
     -jar myapp.jar

五、总结

  • GC 流程:分代回收通过 Minor GC 和 Full GC 协作完成,新生代用复制算法,老年代用标记-清除或标记-整理算法。

  • 对象晋升:基于年龄、动态判断、空间不足等因素决定是否晋升到老年代。

  • JVM 参数:需根据应用场景(吞吐量优先或低延迟)选择回收器和调整参数,结合监控工具(如 VisualVM、GCViewer)优化配置。

http://www.dtcms.com/a/106343.html

相关文章:

  • 电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
  • 分布式数据一致性场景与方案处理分析|得物技术
  • 谷粒商城:Redisson
  • TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享
  • Linux网络编程socket服务器端模拟实现
  • JSP 指令
  • Python数据类型-dict
  • 第八届 蓝桥杯 嵌入式 省赛
  • 【ESP32-IDF 笔记】02-LED PWM 配置
  • 运维面试题(ORACLE数据库)--20250401
  • Cesium学习(未完继续)
  • 题解:AT_arc050_c [ARC050C] LCM 111
  • Android的安全问题 - 在 Android 源码的 system/sepolicy 目录中,区分 public、private 和 vendor的目的
  • Kotlin 作用域函数:apply、let、run、with、also
  • 掩码图像建模 (MIM) 中的对数似然与交叉熵
  • 品铂科技与宇都通讯UWB技术核心区别对比(2025年)
  • C++:位图和布隆过滤器
  • spring-ai-alibaba第三章ollama集成Tool
  • 【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解
  • ERP管理系统:Java+Vue,含源码及文档,一体化管理资源,优化流程,强化企业运营效率
  • React.memo()和 useMemo()的用法是什么,有哪些区别
  • CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)
  • Unity插件SuperScrollView详解(基础篇)
  • Redis安全与配置问题——AOF文件损坏问题及解决方案
  • 机器人--ros2--IMU
  • 用jQuery和Canvas打造2D版“我的世界+超级玛丽“游戏
  • 知名界面控件DevExpress v24.2.6全新可用|发布重要更改
  • 安卓一些接口使用
  • dbgpt7.0 docker部署
  • Unity工具—默认取消Image和RowImage的Raycast Target