如果 Eden 空间占满了, 会触发 minor GC。
- Minor(Scavenge) GC 后仍然存活的对象会被复制到 S0 (survivor 0)中去。
- 这样 Eden 就被清空可以分配给新的对象。
又触发了一次 Minor GC ,
- S0 和 Eden 中存活的对象被复制到 S1 中,
- 并且 S0和 Eden 被清空。
- 在同一时刻, 只有 Eden 和一个 Survivor Space 同时被操作。
- 当每次对象从 Eden 复制到 Survivor Space 或者从 Survivor Space 中的一个复制到另外一个,
- 有一个计数器会自动增加值。
- 默认情况下如果复制发生超过 16.次,
- JVM 会停止复制并把他们移到老年代中去.
同样的如果一个对象不能在 Eden 中被创建,
- 它会直接被创建在老年代中。
如果老年代的空间被占满会触发老年代的 GC, 也被称为 Full GC。
- Full GC 是一个压缩处理过程, 所以它比 Minor GC 要慢很多。
综上,FULL GC 发生的原因有两种,①大对象分配时候引发老年代空间不足;②持续存活的对象转移到老年代引发的空间不足
有如下原因可能导致Full GC:
- a) 年老代(Tenured)被写满;
- b) 持久代(Perm)被写满;
- c) System.gc()被显示调用;
- d) 上一次GC之后Heap的各域分配策略动态变化;