如何选择垃圾收集器
-
单CPU或小内存,单机程序 :
-XX:+UseSerialGC
-
多CPU,需要最大吞吐量,如后台计算型应用
-XX:+UseParallelGC或者 -XX:+UseParallelOldGC
-
多CPU,追求低停顿时间,需快速响应如互联网应用
-XX:+UseConcMarkSweepGC
-XX:+ParNewGC
G1(Garbage-First)收集器
G1是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集器暂停时间的要求。另外它还具有以下特性:
-
像CMS收集器一样,能与应用程序线程并发执行。
-
整理空闲空间更快
-
需要更多的时间来预测GC停顿时间
-
不希望牺牲大量的吞吐性能
-
不需要更大的Java Heap
G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色:
-
G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片
-
G1的Stop the World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿的时间。
-
G1能充分利用多CPU,多核环境硬件优势,尽量缩短STW
-
G1整体上采用标记-整理算法,局部是通过复制算法,不会产生内存碎片
-
宏观上看G1之中不再区分年轻代和老年代。把内存划分为多个独立的子区域(Region),可以近似理解为一个围棋的棋盘
-
G1收集器里面将整个的内存区都混合在一起了,但其本身依然在小范围内要进行年轻代和老年代的区分,保留了新生代和老年代,但它们不再是物理隔离的,而是一部分Region的集合且不需要Region是连续的,也就是说依然会采用不同的GC方式来处理不同的区域。
-
G1虽然是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备,G1只是逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换。
B站: