通过gc日志,详细观察java内存分配与回收策略
具体参数说明:
-verbose:gc 在发生内存回收时在输出设备显示信息
-Xms20M 初始堆大小20M
-Xmx20M 最大堆大小20M
-Xmn10M 年轻代大小
-XX:+PrintGCDetails 打印GC详细信息
-XX:SurvivorRatio=8 设置年轻代中Eden区与Survivor区的比值。系统默认是8
-XX:+UseSerialGC 使用串行回收器进行回收,这个参数会使新生代和老年代都使用串行回收器,新生代使用复制算法,老年代使用标记-整理算法。
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如:2020-06-14T15:15:24.806-0800)
测试代码
public class LookGC {
public Object instance = null;
private static final int _1MB = 1024 * 1024;
private byte[] bigSize = new byte[2 * _1MB];
public static void main(String[] args) {
LookGC objA = new LookGC();
LookGC objB = new LookGC();
objA.instance = objB;
objB.instance = objA;
System.gc();
}
idea 编辑配置,选择要触发gc的类main class,配置JVM参数(详见上述参数列表打印GC信息),结果如下所示
JDK版本:1.8
GC表示Young GC。括号中代表gc原因:调用了system.gc()
Full GC代表老年代垃圾回收。
将代码system.gc()注释掉,将数组大小修改大,16M
会看到发生了young GC。原因是Allocation Failure:分配失败。
待研究