环境准备
这样一个案例程序:
public class Main {
public static void main(String[] args) {
byte[] array1 = new byte[4 * 1024 * 1024];
array1 = null;
byte[] array2 = new byte[2 * 1024 * 1024];
byte[] array3 = new byte[2 * 1024 * 1024];
byte[] array4 = new byte[2 * 1024 * 1024];
byte[] array5 = new byte[128 * 1024];
byte[] array6 = new byte[2 * 1024 * 1024];
}
}
我们采用如下参数来运行上述程序:
❝-XX:NewSize=10M -XX:MaxNewSize=10M -XX:InitialHeapSize=20M -XX:MaxHeapSize=20M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
❞
参数介绍:
-XX:NewSize:初始年轻代大小
-XX:MaxNewSize:最大年轻代大小
-XX:InitialHeapSize:定义堆的初始化大小,默认值是物理内存的1/64,其实就是:-Xms
-XX:MaxHeapSize:定义最大堆的大小,默认为物理内存的1/4,其实就是:-Xmx
-XX:SurvivorRatio:Eden区与Survivor区的大小比值
-XX:MaxTenuringThreshold:年轻代对象转换为老年代对象最大年龄值
-XX:PretenureSizeThreshold=3M:对象大小超过3M时直接在老年代分配内存
-XX:+UseParNewGC:使用ParNew收集器
-XX:+UseConcMarkSweepGC:使用CMS收集器
-XX:+PrintGCDetails:GC时打印详细信息
-Xloggc:输出GC日志信息到文件中
打印的GC日志情况:
0.118: [GC (Allocation Failure) 0.118: [ParNew (promotion failed): 8143K->8713K(9216K), 0.0043061 secs]0.122: [CMS: 8194K->6675K(10240K), 0.0038347 secs] 12239K->6675K(19456K), [Metaspace: 3042K->3042K(1056768K)], 0.0082981 secs] [Times: user=0.03 sys=0.01, rea