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.rhkb.cn/news/42297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql架构之日志讲解:redo log,undo log,bin log 日志

一、buffer pool缓冲区 讲日志之前&#xff0c;我们要先认识一下buffer pool缓冲区。 mysql想完成数据的修改&#xff0c;会先从存储引擎层读取数据&#xff0c;把数据读取到服务层进行数据的修改&#xff0c;再通过存储引擎层把数据更新到数据库中。 mysql每次读取数据都会…

容器主机CPU使用率突增问题一则

关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 业务一台容器服务器&#xff0c;近期经常收到cpu不定期抖动告警&#x…

simpleITK - Setup - matplotlib‘s imshow

使用 matplotlib 显示内联图像 在此笔记本中&#xff0c;我们将探索使用 matplotlib 显示笔记本中的图像&#xff0c;并致力于开发可重复使用的函数来显示 SimpleITK 图像的 2D、3D、颜色和标签叠加层。 我们还将研究使用需要输入图像重叠的图像过滤器的微妙之处。 %matplot…

Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!

【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万&#xff01; ① 百宝箱式服务模块&#xff1a;AI能直接操作浏览器、读文件、连数据库&#xff0c;比如让AI助手自动整理Excel表格&#xff0c;三分钟搞定全天报表&#xff1b; ② 跨领域实战利器&#xff1a;…

硬件老化测试方案的设计误区

硬件老化测试方案设计中的常见误区主要包括测试周期不足、测试条件过于单一、样品选择不当等方面。其中&#xff0c;测试周期不足尤为突出&#xff0c;容易导致潜在缺陷未被完全暴露。老化测试本质上是通过加速产品老化来模拟长期使用状况&#xff0c;因此测试周期不足会严重削…

CSS学习笔记5——渐变属性+盒子模型阶段案例

目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变&#xff0c;以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状&#xff08;Shape&#xff09; 2. 大小&#xff08;Size&#xff09; 3. 颜色停靠点&#xff08;Color Sto…

Java StringUtils工具类常用方法详解

StringUtils是Apache Commons Lang库中一个极其常用的工具类&#xff0c;它提供了大量处理字符串的静态方法&#xff0c;能够简化我们的日常开发工作&#xff0c;提高代码的可读性和健壮性。下面我将详细介绍StringUtils类中最常用的方法及其使用场景。 一、StringUtils的基本…

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象&#xff0c;同时确保良好的性能表现。它通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非使用传统的构造函数创建方式。这种设计…

MQ的数据一致性,如何保证?

1 数据一致性问题的原因 这些年在Kafka、RabbitMQ、RocketMQ踩过的坑&#xff0c;总结成四类致命原因&#xff1a; 生产者悲剧&#xff1a;消息成功进Broker&#xff0c;却没写入磁盘就断电。消费者悲剧&#xff1a;消息消费成功&#xff0c;但业务执行失败。轮盘赌局&#x…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

简单介绍一下Unity中的ScriptableObject

ScriptableObject的本质 ScriptableObject是Unity引擎中的一个特殊基类&#xff0c;允许你创建不依附于游戏对象的数据容器&#xff0c;以资产(Asset)形式存储在项目中。这些资产&#xff1a; 可在编辑器中创建和配置 在构建后作为资产打包 可通过Resources或AssetBundle加…

ubuntu24.04.2 NVIDIA GeForce RTX 4060笔记本安装驱动

https://www.nvidia.cn/drivers/details/242281/ 上面是下载地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 赋予执行权限把下载的驱动复制到家目录下&#xff0c;基本工具准备&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …

LabVIEW 布尔控件回车键触发程序退出

在 LabVIEW 开发过程中&#xff0c;部分用户可能会遇到按下回车键&#xff08;Enter&#xff09;后&#xff0c;程序意外退出的问题。该问题主要源于布尔控件的属性设置冲突&#xff0c;包括键分配、数据绑定及 Tab 键行为等。本文将详细分析问题根源&#xff0c;并提供一套完整…

分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)

仅供自学回顾使用&#xff0c;请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁&#xff0c;在本人其他文章中也有涉及。 《JUC&#xff1a;三、两阶段终止模式、死锁的jconsole检测、乐观锁&#xff08;版本号机制CAS实现&#xff09;悲观锁》&#xff1a;https://blog.…

WebWorkers在项目中的使用案例

Worker | 文档 worker 线程的关闭在主线程和 worker 线程都能进行操作&#xff0c;但对 worker 线程的影响略有不同。 // main.js&#xff08;主线程&#xff09; const myWorker new Worker(/worker.js); // 创建worker myWorker.terminate(); // 关闭worker 复制代码 // wor…

vue ts+Windi CSS

1、创建vue项目 trae&#xff08;字节&#xff09;打开一个空文件夹 npm install -g vue/cli vue create my-project cd my-project vue add typescript npm run serve vue项目创建完成 2、安装windicss vue add windicss vue.config.js配置 npm install vue-router …

【HTML 基础教程】HTML 编辑器

HTML 编辑器推荐 可以使用专业的 HTML 编辑器来编辑 HTML&#xff0c;菜鸟教程为大家推荐几款常用的编辑器&#xff1a; VS Code&#xff1a;Visual Studio Code - Code Editing. RedefinedSublime Text&#xff1a;http://www.sublimetext.com/在线编辑器&#xff1a;HTML/C…

文件上传的小点总结(2)

4.黑名单绕过(.htaccess方法) 源码一打开&#xff0c;遇到这样的黑名单是不是看的头皮发麻&#xff0c;这么多后缀都禁用。 .htaccess可以启用或禁用apache的功能&#xff0c;利用这个特点&#xff0c;我们可以使用该文件来禁用上述黑名单功能&#xff0c;从而上传**文件。 简…

mysql--主从复制--部署

MySQL 主从复制部署教程 一、主节点&#xff08;Master&#xff09;配置 1. 创建目录结构 mkdir -p /usr/local/src/mysql_demo/master_replica/{logs,configFile,data}2. 编写主节点的 MySQL 配置文件 my.cnf 路径&#xff1a;/usr/local/src/mysql_demo/master_replica/co…

Qt弹出新窗口并关闭(一个按钮)

参考&#xff1a;Qt基础 练习&#xff1a;弹出新窗口并关闭的两种实现方式&#xff08;两个按钮、一个按钮&#xff09;_qt打开一个窗口另一个关闭-CSDN博客 实现&#xff1a; 一个按钮&#xff0c;点击一次&#xff0c;按钮的名字从open window变为close window&#xff0c;…