GC 初识

经典三大问题

  1. 哪些内存需要回收?
  2. 什么时候回收?
  3. 如何回收?

GC 区域和分类

JVM 在垃圾回收时,不是每次都回收新生代、老年代、方法区,大多数时候是仅发生在新生代

  • 新生代频繁发生
  • 很少发生在老年代
  • 几乎不回收方法区(1.7永久代,1.8元空间)

HotSpot VM 的 GC 分为两大类,部分收集和整堆收集

  • 部分收集(Partial GC):堆的某个区进行垃圾回收,比如新生代、老年代
    1. Minor GC/Young GC:新生代垃圾回收
    2. Major GC/Old GC:老年代垃圾回收,Manor GC 和 Full GC 很多时候并没有明显区分,表述的是一个意思
  • 整堆收集(Full GC):顾名思义,整个堆的所有区都进行垃圾回收

Minor GC

  1. 当年轻代空间不足时发生,具体是指 Eden 区,幸存区中某个区满了不会触发
    • Eden 满了触发 Minor GC,但是会顺带回收 from 区
    • from 满了不会触发 Minor GC
  2. 大多数对象都是在新生代创建并回收,所以 Minor GC 会很频繁
  3. Minor GC 会引发 STW,因为要此时要进行对象是否是垃圾的判定,所以所有线程都要暂停(个人理解是:一边使用对象一边回收很不准确)

Major GC

  1. 老年代空间不足是发生
  2. 如果 Major GC 时发现新生代空间不足,顺带会先进行一次 Minor GC
  3. Major GC 比 Minor GC 慢,一般慢 10 倍以上,所以 STW 时间更长
  4. 如果 Major GC 后老年代空间还是不足,就 OOM

Full GC

  1. 老年代、方法区空间不足,或显示调用 System.gc() 时发生(System.gc()调用了不一定就会触发 Full GC,就像线程优先级的概念)
  2. STW 时间更长,新生代、老年代、方法区都要回收,要尽量避免
  3. 很多时候 Full GC 和 Major GC 是一个意思,如果硬要区分,可以理解为 Major GC 是 Full GC 的一部分
posted @   CyrusHuang  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示