Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 9.2 垃圾回收机制

9.2 垃圾回收机制

9.2.1 垃圾回收概述

垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)自动管理内存的核心机制,负责回收不再使用的对象占用的内存空间。Java开发者无需手动释放内存,这大大降低了内存泄漏和指针错误的风险。

主要功能

  • 自动内存管理:识别并回收无用对象。
  • 内存碎片整理:压缩存活对象以减少内存碎片。
  • 分代回收:针对不同生命周期的对象采用不同的回收策略。

9.2.2 垃圾回收的基本原理

对象存活性判断

  • 引用计数法(Java未采用):通过计数引用数量判断对象是否存活,但无法解决循环引用问题。
  • 可达性分析(Java实际采用):从GC Roots(如栈帧中的局部变量、静态变量等)出发,遍历对象引用链。不可达的对象视为垃圾。

常见的GC Roots

  1. 虚拟机栈中引用的对象。
  2. 方法区中静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中JNI引用的对象。

9.2.3 分代收集算法

JVM将堆内存划分为不同代(Generations),针对不同代采用不同的回收策略:

1. 年轻代(Young Generation)

  • 特点:存放新创建的对象,生命周期短。
  • 回收算法:复制算法(Copying)。
    • Eden区:对象初次分配的区域。
    • Survivor区(S0/S1):存放经过一次GC后存活的对象。
  • 触发条件:Eden区满时触发Minor GC。

2. 老年代(Old Generation)

  • 特点:存放长期存活的对象(经过多次Minor GC后仍存活)。
  • 回收算法:标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)。
  • 触发条件:老年代空间不足时触发Major GC(通常伴随Full GC)。

3. 元空间(Metaspace, Java 8+)

  • 特点:替代永久代(PermGen),存放类元数据。
  • 回收条件:类加载器卸载时回收。

9.2.4 常见的垃圾收集器

JVM提供了多种垃圾收集器,适用于不同场景:

收集器作用区域算法特点
Serial年轻代复制算法单线程,适合客户端应用。
Parallel Scavenge年轻代复制算法多线程,注重吞吐量。
CMS老年代标记-清除低停顿时间,但会产生内存碎片。
G1全堆分区域标记-整理平衡吞吐量与延迟,JDK 9+默认。
ZGC全堆并发标记-整理超低停顿(<10ms),JDK 15+生产可用。

9.2.5 GC调优建议

常见问题与解决方案

  1. 频繁Full GC

    • 原因:老年代空间不足或元数据区溢出。
    • 解决:增大老年代(-Xmx)、优化对象生命周期。
  2. 长时间停顿(Stop-The-World)

    • 原因:CMS或Serial收集器的单线程阶段。
    • 解决:切换到G1或ZGC。
  3. 内存泄漏

    • 排查工具:jmap生成堆转储,通过MAT或VisualVM分析对象引用链。

常用JVM参数示例

# 设置堆大小
-Xms512m -Xmx2g  
# 使用G1收集器
-XX:+UseG1GC  
# 打印GC日志
-XX:+PrintGCDetails -Xloggc:gc.log

9.2.6 总结

垃圾回收机制是Java高效内存管理的基石,理解其原理和调优方法有助于开发高性能应用。根据应用需求选择合适的收集器,并结合监控工具持续优化,是提升系统稳定性的关键。

Last Updated:: 3/27/25, 12:48 PM