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

 更新时间:2023年05月29日 08:49:35   作者: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
  • 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!

总结

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

相关文章

  • JPA-JpaRepository方法命名语法说明

    JPA-JpaRepository方法命名语法说明

    这篇文章主要介绍了JPA-JpaRepository方法命名语法说明,具有很好的参考价值。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 使用@Valid 校验嵌套对象

    使用@Valid 校验嵌套对象

    这篇文章主要介绍了使用@Valid 校验嵌套对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java基础第三篇 构造器与方法重载

    Java基础第三篇 构造器与方法重载

    显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。下面文字将对该内容做详细介绍,需要的小伙伴请参考
    2021-09-09
  • SpringBoot用JdbcTemplates操作Mysql实例代码详解

    SpringBoot用JdbcTemplates操作Mysql实例代码详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了SpringBoot用JdbcTemplates操作Mysql
    2022-10-10
  • Java 内省(Introspector)深入理解

    Java 内省(Introspector)深入理解

    这篇文章主要介绍了Java 内省(Introspector)深入理解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 关于HashMap 并发时会引起死循环的问题解析

    关于HashMap 并发时会引起死循环的问题解析

    JDK1.8之前采用头插,即在链表结构上每次都把数据放在链表头部。JDK1.8采用尾插方法,很多朋友在学习Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时不知道究其原因,今天小编通过本文给大家介绍下HashMap 并发死循环问题,一起看看吧
    2021-05-05
  • SpringBoot快速整合RabbitMq小案例(使用步骤)

    SpringBoot快速整合RabbitMq小案例(使用步骤)

    这篇文章主要介绍了SpringBoot快速整合RabbitMq小案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 详解Java的Hibernate框架中的缓存与原生SQL语句的使用

    详解Java的Hibernate框架中的缓存与原生SQL语句的使用

    这篇文章主要介绍了Java的Hibernate框架中的缓存与原生SQL语句的使用,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • JavaWeb实现RSA+AES混合加密

    JavaWeb实现RSA+AES混合加密

    RSA+AES的混合加密时,AES用于给传输的数据加密,然后通过RSA给AES的秘钥加密,本文就来详细的介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    Spring Boot集成MyBatis实现通用Mapper的配置及使用

    关于MyBatis,大部分人都很熟悉。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。这篇文章主要介绍了Spring Boot集成MyBatis实现通用Mapper,需要的朋友可以参考下
    2018-08-08

最新评论