GC常用相关参数和分析

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

常用vm相关参数(G1收集器)

参数 意义 jdk9 之后
-Xms 堆初始大小
-Xmx / -XX:MaxHeapSize=size 堆最大大小
-Xmn 同时指定新生代初始和最大大小
-XX:NewSize=size+ 指定新生代初始大小
-XX:MaxNewSize=size 指定新生代最大大小
-XX:InitialSurvivorRation=ration 幸存区比例(动态调整幸存区与Eden比例)
-XX:SurvivorRation=ratio 幸存区比例(默认值是8)
-XX:MaxTenuringThreshold=threshold 晋升老年代阈值
-XX:+PrintTenuringDistribution 晋升详情
-XX:+PrintGCDetails -verbose:gc 查看gc详情 -Xlog:gc*
-XX:ScavengeBeforeFullGC 在FullGC前进行MinorGC
-XX:+PrintHeapAtGC 查看GC前后的堆、方法区可用容量变化 -Xlog:gc+heap=debug
-XX:+PrintGCApplicationConcurrentTime 查看GC过程中用户线程并发时间、停顿的时间 -Xlog:safepoint
-XX:+PrintTenuring-Distribution 查看收集后剩余对象的年龄分布信息 -Xlog:gc+age=trace
  • 幸存区比例 -XX:SurvivorRation=ratio 默认是8,假如新生代分配了10M的内存空间,那么8M会划分到Eden下,幸存区from幸存区to1M
  • 晋升详情 -XX:+PrintTenuringDistribution ,打印出对象的晋升信息
  • -XX:ScavengeBeforeFullGC 在FullGC前进行MinorGC,减少一些不必要的对象加速FullGC的进度,一般是默认是打开的。
  • 查看GC详情信息,在JDK 9之前使用-XX:+PrintGCDetails,在JDK 9之后可以使用-X-log:gc*,通配符 * 将GC下所有的细分过程都打印出来,如果调低日志级别还可以获得更多的GC信息。

VM的参数还有很多很多就不一一列举了,这些常用的VM参数可以满足很大部分的需求了

垃圾回收过程

以下这个案例主要演示垃圾回收的过程和读垃圾回收的信息

建立一个类叫DemoTest,添加main方法,然后启动该方法

image.png 在idea上对DemoTest配置

image.png

在jvm中添加:-Xms20M -Xmx20M -Xmn10M -XX:+UserSerialGC -xx:+PrintGCDetails -verbose:gc
参数意义: 设置最大堆空间为20M,新生代设置10M,设置垃圾回收器为:+UserSerialGC ,最后一个参数就是打印GC的详情

image.png

启动DemoTest方法,会出现以下信息,这个信息是程序运行完之后堆的情况,大致信息:

def new generation 新生代为9M,是因为我们给新生代分配了10M,Eden默认为8M,幸存区From和幸存区To各位1M,但是JVM会让幸存区To始终空着,所以这里只显示有9M左右。右侧信息说是已经使用的大小为3M,最后就是内存地址了。注意:就算再简单的JAVA程序也会加载一些类、创建一些对象,所以Eden就被占用了一部分空间。

tenured generation 老年代,空间大小10M,没有被使用,占用空间0K。

Metaspace 元空间,虽然元空间不属于堆这部分,但是**-xx:+PrintGCDetails -verbose:gc`** 把空间的信息打印出来。

image.png

Guess you like

Origin juejin.im/post/7032677751069147167