查看所有参数的默认初始值:-XX:PrintFlagsInitial
查看所有参数的最终值:-XX:+PrintFlagsFinal
堆初始大小: -Xms
堆最大大小: -Xmx 或 -XX:MaxHeapSize=size
新生代大小: -Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size )
配置新生代与老年代在堆结构的占比:-XX:NewRatio
设置新生代中Eden和s0/s1空间的比列:-XX:SurvivorRatio
设置新生代垃圾的最大年龄:-XX:MaxTenuringThreshould
幸存区比例 -XX:SurvivorRatio=ratio
晋升阈值 -XX:MaxTenuringThreshold=threshold
晋升详情 -XX:+PrintTenuringDistribution
输出详细的GC处理日志: -XX:+PrintGCDetails
- 打印简要信息:1 :-XX:+PrintGC 2:verbose:gc
FullGC 前 MinorGC -XX:+ScavengeBeforeFullGC
当堆空间溢出时在当前项目目录下面生成一个heapdump快照文件:-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
演示内存的分配策略
/**
* 演示内存的分配策略
*/
public class Demo2_1 {
private static final int _512KB = 512 * 1024;
private static final int _1MB = 1024 * 1024;
private static final int _6MB = 6 * 1024 * 1024;
private static final int _7MB = 7 * 1024 * 1024;
private static final int _8MB = 8 * 1024 * 1024;
// -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:-ScavengeBeforeFullGC
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
ArrayList<byte[]> list = new ArrayList<>();
list.add(new byte[_8MB]);
list.add(new byte[_6MB]);
}).start();
System.out.println("sleep....");
Thread.sleep(1000L);
}
}
当占用内存超过eden区内存大小时会触发一次GC,经过多次回收后还存活的对象会转移到老年代去,如果对象很大,eden区都装不下,GC都不用触发,直接转移到老年代