这是我参与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和幸存区to各1M
- 晋升详情 -XX:+PrintTenuringDistribution ,打印出对象的晋升信息
- -XX:ScavengeBeforeFullGC 在FullGC前进行MinorGC,减少一些不必要的对象加速FullGC的进度,一般是默认是打开的。
- 查看GC详情信息,在JDK 9之前使用-XX:+PrintGCDetails,在JDK 9之后可以使用-X-log:gc*,通配符 * 将GC下所有的细分过程都打印出来,如果调低日志级别还可以获得更多的GC信息。
VM的参数还有很多很多就不一一列举了,这些常用的VM参数可以满足很大部分的需求了
垃圾回收过程
以下这个案例主要演示垃圾回收的过程和读垃圾回收的信息
建立一个类叫DemoTest,添加main方法,然后启动该方法
在idea上对DemoTest配置
在jvm中添加:-Xms20M -Xmx20M -Xmn10M -XX:+UserSerialGC -xx:+PrintGCDetails -verbose:gc
参数意义: 设置最大堆空间为20M,新生代设置10M,设置垃圾回收器为:+UserSerialGC ,最后一个参数就是打印GC的详情
启动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`** 把空间的信息打印出来。