查看jdk支持的垃圾收集器有哪些?
当前进程使用的垃圾收集器是什么?
查看默认设置
- 查看默认设置命令:
java -XX:+PrintCommandLineFlags -version# -XX:+UseParallelGC
- 查看默认垃圾收集器详细信息命令
通过新生代、老年代名字确定垃圾收集器
java -XX:+PrintGCDetails -version# PSYoungGen
# ParOldGen
- 更加准确的定位使用了哪些垃圾收集器
java -XX:+PrintFlagsFinal -version | grep 'bool Use' | grep 'GC ' | grep -v java
一探究竟
# 应用启动处上代码,直接查看
List<GarbageCollectorMXBean> beans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean bean : beans) {System.out.println(bean.getName());
}
结果不尽人意
- 使用参数-XX:+UseParallelGC
# 结果
PS Scavenge
PS MarkSweep
- 使用参数-XX:+UseParallelOldGC
# 结果
PS Scavenge
PS MarkSweep
- 使用参数 -XX:+UseParallelGC -XX:+UseParallelOldGC
# 结果PS Scavenge
PS MarkSweep
搜寻官方资料得知,UseParallelGC和UseParallelOldGC,在jdk8及之后,开启一个默认启用另一个。
新生代: Parallel Scavenge 复制算法
老年代: Parallel Old 标记清除算法
转而尝试G1
- 使用参数 -XX:+UseG1GC
# 结果
G1 Young Generation
G1 Old Generation
主要参数
-XX:MaxGCPauseMillis:设置期望达到的最大GC停顿时间指标,默认值是 200 毫秒。-XX:G1HeapRegionSize=n:设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。默认是堆内存的1/2000-XX:ParallelGCThreads=n:设置 STW 工作线程数的值。将 n 的值设置为逻辑处理器的数量。n 的值与逻辑处理器的数量相同,最多为 8。-XX:ConcGCThreads=n:设置并行标记的线程数。将 n 设置为并行垃圾回收线程数 (ParallelGCThreads)的 1/4 左右。-XX:InitiatingHeapOccupancyPercent=n:设置触发并发标记周期的 Java 堆占用率阈值。默认值是45,表示占用率是整个 Java 堆的 45%时,将会触发并发标记周期。
参考资料
- https://www.zhihu.com/question/56344485/answer/149543993
- https://betheme.net/yidongkaifa/97000.html