G1垃圾收集器相关内容可以参考[G1垃圾收集器基础]
一般的垃圾收集器
一般的垃圾回收器把内存分成三类: Eden(E), Suvivor(S)和Old(O), 其中Eden和Survivor都属于年轻代,Old属于老年代,新对象始终分配在Eden里面,经过第一次垃圾回收的对象就被移动到Survisor区了也有可能是old区。这样的好处是1、把垃圾回收这个复杂的问题分成两个小的问题,针对于年轻代的对象,因为对象来的快去的也快所以垃圾比较多垃圾回收会比较频繁,但是年轻代在垃圾回收的时候需要暂停应用(因为需要清楚的标记哪些是垃圾对象,应用运行期间会不断的产生新的对象),针对于频繁的垃圾回收这个点,对于年轻代的垃圾收集就需要 执行时间短效率要高的垃圾收集算法,但是往往这种算法比如【复制法】需要消耗过多的内存,以空间换取时间;2、对于老年代的对象由于本身的垃圾对象和垃圾回收次数相对于年轻代就要少很多可以采用内存使用率高的算法【标记压缩算法】
G1垃圾收集器
G1内存分布跟一般垃圾收集器的区别在与取消了物理上的内存划分,将内存分成若干个Region(每个Region都有逻辑上的Elden,Suvivor,Old,H区(存放大对象)关系),与一般的垃圾收集器的内存分为三个部分相比,G1的若干个Region相当于将内存划分成若干个小内存,从而可以垃圾回收工作更彻底的并行化,因此它在应用停止时间STW(Stop-the-world)这个指标上比其它的GC算法都要好,
G1优化的步骤中有一个步骤是让使用者自行设置暂停应用的时间,为啥能够做到这一点,G1回收的第4步【G1垃圾收集基础】,它是“选择一些内存块”,而不是整代内存来回收,其它GC每次回收都会回收整个内存(Eden, Old), 回收内存所需的时间取决于内存的大小,以及实际垃圾的多少,所以垃圾回收时间是不可控的;而G1每次并不会回收整代内存,到底回收多少内存就看用户配置的暂停时间,配置的时间短就少回收点相反就多回收点,G1垃圾收集器的G1其实是Garbage First的意思,这里并不是垃圾优先 的意思,而是优先处理那些垃圾多的内存块的意思。