解读JDK1.8 默认使用什么垃圾收集器
作者:FRESH_9527
JDK1.8 默认使用什么垃圾收集器
使用java -XX:+PrintCommandLineFlags -version查看一下
-XX:InitialHeapSize=132500864 //初始堆大小 -XX:MaxHeapSize=2120013824 //最大堆大小 -XX:+PrintCommandLineFlags //程序运行前打印出用户手动设置或者JVM自动设置的XX选项,因为我们执行时间加上了这个选项,所以这里会打印出来 -XX:+UseCompressedClassPointers // 默认开启类指针压缩 -XX:+UseCompressedOops // 默认开启对象指针压缩 -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC // 默认使用Parallel垃圾收集器 java version "1.8.0_221" // jdk版本 Java(TM) SE Runtime Environment (build 1.8.0_221-b11) // jre Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode) // Hotspot虚拟机,Server模式,混合编译
或者使用java -XX:+PrintFlagsFinal 查看亦可。可以看到UseParellelGC和UseParellelOldGC两个选项都是打开的,即JDK1.8中默认使用的是Parallel Scavenge和Parallel Old收集器组合。
我可也可以写一个堆溢出的小demo打印GC信息:
PSYoungGen total 6144K, used 3224K [0x00000000ff980000, 0x0000000100000000, 0x0000000100000000)
eden space 5632K, 57% used [0x00000000ff980000,0x00000000ffca6230,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 13824K, used 13440K [0x00000000fec00000, 0x00000000ff980000, 0x00000000ff980000)
object space 13824K, 97% used [0x00000000fec00000,0x00000000ff920338,0x00000000ff980000)
Metaspace used 2681K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 286K, capacity 386K, committed 512K, reserved 1048576K
PSYoungGen 表示的是由Parallel Scavenge垃圾收集器管理的新生代,ParOldGen表示由Parallel Old管理的老年代。
jdk1.8默认垃圾回收器的组合
问题是什么?
线上运行的项目,在不指定jvm运行参数的情况下,默认的垃圾回收器的组合是什么?
针对网上一大堆的介绍,个人觉得可能是我自己没有理解吧,总感觉有一些问题,或者欠缺点什么?
网上的言论大体上有一下两种:
- ps + po
- ps + so
究竟哪个是正确的呢?
答案是:ps + po
验证
我这里有几个java进程
[root@Game-TEST ~ 00:47:06]# jps 14576 CrossFamilyTopServerStart 14352 Start 1797 jar [root@Game-TEST ~ 00:47:25]# jinfo -flags 14352 Attaching to process ID 14352, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.121-b13 Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=264241152 -XX:MaxHeapSize=4217372672 -XX:MaxNewSize=1405616128 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88080384 -XX:OldSize=176160768 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
可以看到这里默认的jvm运行参数为:-XX:+UseParallelGC,查看周志明老师深入理解java虚拟机中关于垃圾回收器的介绍来看,这个参数对应的垃圾回收器的组合应该为:ps + so(红色框选中的部分)
乍一看!这是为什么呢,不是说默认的是ps + po么?
这就涉及到jdk版本的问题了,可以看看参考资料里面的描述:大致意思就是在jdk1.8以后-XX:+UseParallelGC是默认开启的,所以垃圾回收器的组合就是ps+po,但是为什么命令行的显示来看这个参数没有被指定呢?这个。。。。。不懂,留着后面再看吧!
我们也可以用下面的指令来查看,现在想想这个应该是最直接的!
[root@Game-TEST ~ 00:55:50]# java -XX:+PrintGCDetails -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) Heap PSYoungGen total 75264K, used 2580K [0x000000076c380000, 0x0000000771780000, 0x00000007c0000000) eden space 64512K, 4% used [0x000000076c380000,0x000000076c605368,0x0000000770280000) from space 10752K, 0% used [0x0000000770d00000,0x0000000770d00000,0x0000000771780000) to space 10752K, 0% used [0x0000000770280000,0x0000000770280000,0x0000000770d00000) ParOldGen total 172032K, used 0K [0x00000006c4a00000, 0x00000006cf200000, 0x000000076c380000) object space 172032K, 0% used [0x00000006c4a00000,0x00000006c4a00000,0x00000006cf200000) Metaspace used 2216K, capacity 4480K, committed 4480K, reserved 1056768K class space used 243K, capacity 384K, committed 384K, reserved 1048576K
出现了ParOldGen这个就是po的垃圾回收器了,所以默认情况下jdk1.8的默认垃圾回收器的组合为:ps+po!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。