JAVA GC
JVM G1
https://juejin.cn/post/7249382407245512759
初始标记 从 GC Root 开始
被老年代对象引用到的年轻代对象 需要 标记活 (即使 GC Root 不可达)
GC Phase 代表整个 GC 过程的不同阶段,而 GC Task 是具体的执行任务(通常是多线程并行的)。
GC Task 发生在 GC Phase 之下,每个 GC Phase 可能会包含多个 GC 任务。
优化 GC 时,可以观察哪个阶段(Phase)或任务(Task)耗时较长,进行针对性优化。
【JDK21】 完整的一个GC过程日志, gc start -> gc [gc,cpu]
如何判断 G1 GC 日志是并行还是并发任务?
- 日志中出现
"Pause"
👉 说明是 STW 并行任务 - 日志中出现
"Concurrent"
👉 说明是并发任务 - 日志标签
[gc,phases]
或[gc,task]
👉 并行任务(STW) - 日志标签
[gc,mark]
或[gc,refine]
👉 并发任务(Concurrent)
默认 info 级别的日志
-Xlog:gc* <==> -Xlog:gc*=info
需要更详细的日志,可以增加 debug 级别:
-Xlog:gc*=debug:file=gc.log:time,uptime,level,tags
或
-Xlog:gc*,gc+phases=trace
-Xlog:gc*,gc+phases=trace,gc+heap=debug
-Xlog:gc*,gc+age=trace #打印年代信息
-Xlog:gc+phases=debug,gc+heap=debug,gc+ref=debug:file=gc.log:time,uptime,level,tags
这将包含 GC 过程的更多细节,比如:
GC 事件(暂停、并发周期等)
Heap 使用情况
GC 阶段
引用处理
想观察 G1 GC 运行细节(如 Mixed GC、回收等),可以开启:
-Xlog:gc+heap=debug,gc+phases=trace,gc+ergo*=trace:file=gc.log:time,uptime,level,tags
gc+heap=debug:查看堆内存变化。
gc+phases=trace:详细跟踪 GC 各个阶段的运行情况。
gc+ergo*=trace:查看 G1 GC 的自适应调整。
使用 jstat 监控 GC 情况,例如:
jstat -gcutil <pid> 1000
这将在终端每秒刷新一次 GC 使用情况。
如果应用正在运行,可以使用 jcmd 命令来动态获取 GC 信息:
jcmd <pid> GC.class_histogram
jcmd <pid> GC.heap_info
jcmd <pid> GC.finalizer_info
这样可以有效分析 G1 GC 的行为,帮助优化垃圾回收策略。
G1 参数
-XX:ParallelGCThreads 控制 Stop-The-World(STW) 阶段的 GC 线程数。
-XX:ConcGCThreads 控制 并发 GC 阶段 的线程数(不影响 STW 阶段)。
名称解析
Heap Roots 主要包括:
栈上的本地变量(线程栈、本地方法栈)
静态变量(存在于 ClassLoader 中的静态字段)
JIT 编译代码中的引用(Code Root)
JNI 引用(本地代码持有的引用)
Remembered Set(RSet) 记录的跨代引用
Scan Heap Roots 发生在 G1 GC 的初始标记(Initial Mark)阶段,这个阶段是 Stop-The-World(STW) 的。
Ext Root Scanning(扩展根扫描)
JNI 全局引用(JNI Global References)
线程本地存储(Thread Local Storage, TLS)
JVMTI(Java Virtual Machine Tool Interface)引用
其他 JVM 内部结构持有的引用
这是 G1 GC Stop-The-World(STW) 阶段的一部分,通常发生在 初始标记(Initial Mark)和重新标记(Remark) 过程中。
JVM ZGC
https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html
GC 基础
https://heapdump.cn/article/3144186
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端