GC 初识
经典三大问题
- 哪些内存需要回收?
- 什么时候回收?
- 如何回收?
GC 区域和分类
JVM 在垃圾回收时,不是每次都回收新生代、老年代、方法区,大多数时候是仅发生在新生代
- 新生代频繁发生
- 很少发生在老年代
- 几乎不回收方法区(1.7永久代,1.8元空间)
HotSpot VM 的 GC 分为两大类,部分收集和整堆收集
- 部分收集(Partial GC):堆的某个区进行垃圾回收,比如新生代、老年代
- Minor GC/Young GC:新生代垃圾回收
- Major GC/Old GC:老年代垃圾回收,Manor GC 和 Full GC 很多时候并没有明显区分,表述的是一个意思
- 整堆收集(Full GC):顾名思义,整个堆的所有区都进行垃圾回收
Minor GC
- 当年轻代空间不足时发生,具体是指 Eden 区,幸存区中某个区满了不会触发
- Eden 满了触发 Minor GC,但是会顺带回收 from 区
- from 满了不会触发 Minor GC
- 大多数对象都是在新生代创建并回收,所以 Minor GC 会很频繁
- Minor GC 会引发 STW,因为要此时要进行对象是否是垃圾的判定,所以所有线程都要暂停(个人理解是:一边使用对象一边回收很不准确)
Major GC
- 老年代空间不足是发生
- 如果 Major GC 时发现新生代空间不足,顺带会先进行一次 Minor GC
- Major GC 比 Minor GC 慢,一般慢 10 倍以上,所以 STW 时间更长
- 如果 Major GC 后老年代空间还是不足,就 OOM
Full GC
- 老年代、方法区空间不足,或显示调用
System.gc()
时发生(System.gc()
调用了不一定就会触发 Full GC,就像线程优先级的概念) - STW 时间更长,新生代、老年代、方法区都要回收,要尽量避免
- 很多时候 Full GC 和 Major GC 是一个意思,如果硬要区分,可以理解为 Major GC 是 Full GC 的一部分
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南