JDK默认GC算法是个谜

背景

我们系统采用openjdk:8u212-b04-jdk-stretch作为基础镜像,java -version命令输出:

    openjdk version "1.8.0_212"OpenJDK Runtime Environment (build 1.8.0_212-b04)OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

从输出信息可以看出是1.8.0版本的OpenJDK。现在因为应用GC的一些问题,我们想知道它的默认GC算法。

下面是查找JDK默认GC算法是一些方法,其中方法一和方法二在我们这个OpenJDK没有用。

方法

方法一,PrintCommandLineFlags

命令行执行:java -XX:+PrintCommandLineFlags -version

理论上输出有开启GC的参数,如-XX:+UseParallelGC。我们这个没有。

方法二,PrintFlagsFinal

命令行执行:java -XX:+PrintFlagsFinal -version|grep Use|grep GC

理论上输出有GC算法开启状态为true。我们这个没有。

方法三,GarbageCollectorMXBean

 public static void main(String[] args) throws InstanceNotFoundException, MalformedObjectNameException, ReflectionException, MBeanException, NullPointerException{Object flags = ManagementFactory.getPlatformMBeanServer().invoke(ObjectName.getInstance("com.sun.management:type=DiagnosticCommand"),"vmFlags", new Object[] { null }, new String[] { "[Ljava.lang.String;" });for(String f: ((String)flags).split("\\s+"))if(f.contains("GC")) System.out.println(f);for(GarbageCollectorMXBean gc: ManagementFactory.getGarbageCollectorMXBeans())System.out.printf("%-20s%s%n", gc.getName(), Arrays.toString(gc.getMemoryPoolNames()));}

我们用上面java代码编写一个FindGC.java类,编译成FindGC.class,执行:java FindGC

我们的1.8.0版本OpenJDK的会输出:

    Copy                [Eden Space, Survivor Space]MarkSweepCompact    [Eden Space, Survivor Space, Tenured Gen]

我们加上-XX:+UseSerialGC参数,执行:java -XX:+UseSerialGC FindGC

会输出:

    -XX:+UseSerialGCCopy                [Eden Space, Survivor Space]MarkSweepCompact    [Eden Space, Survivor Space, Tenured Gen]

综上,我们基本可以确定1.8.0版本OpenJDK默认采用的GC算法是SerialGC。

方法四,jmap

jmap -heap PID(PID是某个java进程)会输出Java进程的堆信息,里面有些描述可以辅助推断GC算法。

-XX:+UseSerialGC,输出信息有“Mark Sweep Compact GC”,老年代标识是“tenured generation”。

-XX:+UseConcMarkSweepGC,输出信息有“Concurrent Mark-Sweep GC”,老年代标识是“concurrent mark-sweep generation”。

-XX:+UseParallelGC,输出信息有“Parallel GC with X thread(s)”(X是并发线程数),老年代标识是“PS Old Generation”。

-XX:+UseG1GC,输出信息有“Garbage-First (G1) GC with X thread(s)”(X是并发线程数),老年代标识是“G1 Old Generation”。

我们的1.8.0版本OpenJDK运行jmap -heap PID会输出“Mark Sweep Compact GC”且老年代标识是“tenured generation”,与SerialGC一样,

也基本可以确定默认GC算法是SerialGC。

总结

JDK开发者并没有提供直接的工具查看默认GC算法,我们只能通过一些辅助手段来确定。

参考

Is there a way to tell which GC algorithm the JVM is currently using

How to determine which GC I use?

Java 8最快的垃圾收集器是什么?

JDK默认GC算法是个谜相关推荐

  1. jdk7默认gc算法_JDK 7的算法和数据结构

    jdk7默认gc算法 在定期检查JDK中是否存在一种或另一种标准算法时,我决定进行这种索引. 有趣的是,为什么其中包含一些著名的数据结构或算法,而其他却没有? 此调查的格式仅涉及JDK的算法和数据结构 ...

  2. Jvm 系列(三):GC 算法 垃圾收集器

    这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...

  3. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  4. 深入理解JVM(2)——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  5. JVM(3):Java GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  6. 34.对象 GC,GC属性,影响GC的因素,GC步骤,GC算法,安全区/安全区域,新生代,老年代等介绍

    34.对象 GC,GC属性,影响GC的因素,GC步骤,GC算法,安全区/安全区域,新生代,老年代等介绍 34.1.GC属性 34.2.影响GC的因素 34.3.GC步骤 34.3.1.Mark 34. ...

  7. Java内存组成GC算法

    Java内存组成&GC算法 @(JAVA)[java] Java内存组成GC算法 一内存组成 一Java程序的内存组成 1Java堆 2方法区含常量池永久代 3栈 1Java虚拟机栈 2本地方 ...

  8. jvm系列(三):GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  9. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

最新文章

  1. VScode配置ROS环境
  2. 中国最大的python社区-一个将会是国内最高品质的 Python 社区,大家一起来见证...
  3. 深度学习材料:从感知机到深度网络A Deep Learning Tutorial: From Perceptrons to Deep Networks
  4. SQLi-LABS(11~20关详解)
  5. FindBugs和JSR-305
  6. 跨平台桌面应用开发工具Electron v11.0.4
  7. Android笔记 意图传值demo
  8. Git Windows下安装配置
  9. 一路去**ddss第4天
  10. 中文编码--中国程序员之”银弹“?
  11. 将ListT转化成 DataTable--调整可空类型的转化错误
  12. 转:互联网协议入门(一)
  13. linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
  14. 智能优化算法(超全)
  15. 关于腾讯云短信sms接口自定义API写法 PHPdemo
  16. diskgenius克隆硬盘无法启动_克隆硬盘
  17. STM32 之 HAL库
  18. python画散点图<plt.scatter() 和sns.scatterplot()>
  19. python安装包报错解决方案
  20. 微信小程序踩坑记录 ------- canvas 生成带小程序码的微信朋友圈分享图

热门文章

  1. 颜色名、颜色16进制值、颜色rgb值对应表
  2. 基于DarkNet和 OpenCV的 YOLOv3 训练雪人检测模型
  3. JointPoint的基本知识及常用方法
  4. float转int型
  5. Java float转int
  6. 07 | Raft算法(一):如何选举领导者
  7. B站路飞学城学习笔记-Python爬虫-爬取电影分类排名-
  8. dcat-admin 高德导航坐标逆向地址
  9. Delphi之东进数字语音卡(SS1)可复用源码 1
  10. 为什么越来越多年轻人选择“躺平”?