JDK默认GC算法是个谜
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算法是个谜相关推荐
- jdk7默认gc算法_JDK 7的算法和数据结构
jdk7默认gc算法 在定期检查JDK中是否存在一种或另一种标准算法时,我决定进行这种索引. 有趣的是,为什么其中包含一些著名的数据结构或算法,而其他却没有? 此调查的格式仅涉及JDK的算法和数据结构 ...
- Jvm 系列(三):GC 算法 垃圾收集器
这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...
- 《深入理解java虚拟机》笔记2——GC算法与内存分配策略
说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...
- 深入理解JVM(2)——GC算法与内存分配策略
说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...
- JVM(3):Java GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...
- 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. ...
- Java内存组成GC算法
Java内存组成&GC算法 @(JAVA)[java] Java内存组成GC算法 一内存组成 一Java程序的内存组成 1Java堆 2方法区含常量池永久代 3栈 1Java虚拟机栈 2本地方 ...
- jvm系列(三):GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
转载自 JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...
最新文章
- VScode配置ROS环境
- 中国最大的python社区-一个将会是国内最高品质的 Python 社区,大家一起来见证...
- 深度学习材料:从感知机到深度网络A Deep Learning Tutorial: From Perceptrons to Deep Networks
- SQLi-LABS(11~20关详解)
- FindBugs和JSR-305
- 跨平台桌面应用开发工具Electron v11.0.4
- Android笔记 意图传值demo
- Git Windows下安装配置
- 一路去**ddss第4天
- 中文编码--中国程序员之”银弹“?
- 将ListT转化成 DataTable--调整可空类型的转化错误
- 转:互联网协议入门(一)
- linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
- 智能优化算法(超全)
- 关于腾讯云短信sms接口自定义API写法 PHPdemo
- diskgenius克隆硬盘无法启动_克隆硬盘
- STM32 之 HAL库
- python画散点图<plt.scatter() 和sns.scatterplot()>
- python安装包报错解决方案
- 微信小程序踩坑记录 ------- canvas 生成带小程序码的微信朋友圈分享图