java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JDK1.8 默认垃圾收集器

解读JDK1.8 默认使用什么垃圾收集器

作者:FRESH_9527

这篇文章主要介绍了解读JDK1.8 默认使用什么垃圾收集器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

验证

我这里有几个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!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文