四种主要的垃圾收集器
-
串行垃圾回收器(Serial)
为单线程环境设计,只使用一个线程进行垃圾回收,会暂停所有用户线程,不适合服务器环境。 -
并行垃圾回收器(Patallel)
多个垃圾收集线程并发工作,用户状态为暂停状态,适用于科学计算、大数据
处理首台处理等弱交互场景 -
并发垃圾回收器(CMS)
用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程,适用对响应时间有要求的场景。
- G1垃圾回收器
G1垃圾回收器京堆内存分成不同的区域然后并发的对其进行垃圾回收
GC垃圾回收器的主要类型
- java的GC垃圾回收器的类型主要有:
UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC
底层源码:
- 如何查看服务器默认的来及收集器:
java -XX:+PrintCommandLineFlags -version
E:\ideaIU\cloud2020>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=130858688 -XX:MaxHeapSize=2093739008 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndivid
ualAllocation **-XX:+UseParallelGC**
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
- 如何垃圾收集器
- 单CPU或小内存,单机程序
-XX:+UseSerialGC
- 多CPU,需要最大吞吐量,如后台计算型应用
-XX:+UseParallelGC 或者-XX:+UseParallelOldGC
- 多CPU,追求低停顿时间,需快速响应如互联网应用
-XX:+UseConcMarkSweepGC
-xx:+ParNewGC
G1垃圾收集器
- G1是什么
G1是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现搞吞吐量的同时尽可能的满足垃圾收集暂停时间的要求另外它还具有一下的特性:
- 像CMS收集器一样,能与应用程序线程并发执行。
- 整理休闲空间更快。
- 需要更多的时间来预测GC停顿时间。
- 不希望牺牲大量的吞吐性能。
- 不需要更大的Java Heap.
G1收集器的设计目的是取代CMS收集器,相比于CMS收集器,它在以下方面表现得更出色:
- G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。
- G1的Stop The World(STW)更可控,G1在停顿时间上添加预测机制,用户可以指定期望停顿时间。
G1是在2012年才在JDK 1.7u4中可用。Oracle官方计划在JDK1.9中将G1作为默认的垃圾收集器以替代CMS,主要的改变是Eden,Survivor和Tenured等内存区域不在是连续的了,而是变成了一个个大小一样的region,每个region从1M到32M不等,最多能设置2048个区域,也即能够支持最大的内存为:32M*2048 =65536MB=64G内存。一个region有可能属于 Eden,Survivor和Tenured内存区域。
- 以前收集器的特点
- 年轻代和老年代是各自的独立且连续的内存块
- 年轻代收集使用单eden+S0+S1进行复制算法
- 老年代收集必须扫描整个老年代区域
- 都是以尽可能少而快速地执行GC为设计原则
- G1收集器的特点
- G1能充分利用多CPU、多核环境硬件优势,尽量缩短STW。
- G1整体上采用标记—整理算法,局部是通过复制算法,不会产生内存碎片。
- 宏观上看G2之中不在区分年轻代和老年代。把内存划分成多个独立的子区域(region),可以近似的理解为一个围棋的棋盘。
- G1收集器里面整个的内存区都混在一起了,但其本身依然在小范围内要进行年轻代和老年代的区分,保留了新生代和老年代,但它们不再是物理隔离的,而是一部分region的集合且不需要region连续的,也就是说依然会采用不同的GC方式来处理不同的区域。
- G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代和老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每一个分区都可能随G1的运行在不同代之间前后切换。
- 底层原理
- region区域化垃圾收集器
区域化内存划片region,整体编为一些列不连续的内存区域,避免了全内存区的GC操作。
核心思想是将整个堆内存区域分成大小相同的子区域(region),在JVM启动时会自动设置这些子区域的大小,在堆的使用上,G1并不要求对象的存储一定是物理上连续的,只要逻辑上连续即可,每个分区也不会固定为某个代服务,可以按需在年轻代和老年代之间切换。
启动时可以通过参数-XX:G1HeapRegionSize=n可指定分区大小,默认将整堆划分为2048个分区。
在G1中,还有一种特殊的区域,交Humongous(巨大的)区域,如果一个对象占用的空间超过了分区容量的50%以上,G1收集器就认为这是个巨型对象,这些巨型对象默认直接就会被分配到老年代,但是如果他是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。若果一个H区装不下一个巨型对象,那么G1会寻找连续的H区来存储。为了能找到连续的H区,有的时候不得不启动Full GC.
最大好处是化整为零,避免了全内存扫扫描,只需要按照区进行扫描即可。
- 回收步骤
- 4步过程