-Xms 初始堆内存大小,默认物理内存64/1
-Xms = -XX:InitialHeapSize
-Xmx 最大堆内存,默认物理内存4/1
-Xmx = -XX:MaxHeapSize
-Xss 栈内存大小
设置单个线程栈大小,一般默认512~1024kb。
单个线程栈大小跟操作系统和JDK版本都有关系
-Xss = -XX:ThreadStackSize
-Xmn 年轻代大小
-XX:MetaspaceSize 元空间大小
元空间本质跟永久代类似,都是对JVM规范中方法区的实现。
不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存。
因此,元空间大小仅受本地内存限制。
-XX:+PrintGCDetails 打印GC详细日志信息
-XX:SurvivorRatio 幸存者比例设置
-XX:NewRatio 新生代比例设置
-XX:MaxTenuringThreshold 进入老年代阈值设置
(1)打印GC详细日志信息
(2)模拟YoungGC和Full GC
【1】配置初始堆内存和最大堆内存
【2】模拟创建大对象
public class PrintGCDetailsDemo {
public static void main(String[] args) {
System.out.println("Hello PrintGCDetails!");
// 模拟创建大对象,出发YoungGC和Full GC
byte[] byteArray = new byte[10 * 1024 * 1024];
}
}
【3】运行PrintGCDetailsDemo程序
GC = Minor GC年轻代垃圾回收
Full GC = Minor GC + Old GC年轻代垃圾回收 + 老年代垃圾回收
Java.lang.OutOfMemoryError: Java heap Space堆空间不足OOM
【4】年轻代和年老代垃圾回收分析
GC = Minor GC分解图:
Full GC = Minor GC + Old GC分解图:
Hello PrintGCDetails!
[GC (Allocation Failure) [PSYoungGen: 2048K->496K(2560K)] 2048K->713K(9728K),
0.0016013 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
分解:
[GC (Allocation Failure)
GC表示YoungGC年轻代垃圾回收;
(Allocation Failure)表示内存分配失败;
[PSYoungGen: 2048K->496K(2560K)]
2048K表示年轻代垃圾回收前内存占用大小;
496K表示年轻代垃圾回收后内存占用大小;
(2560K)表示年轻代总大小;
2048K->713K(9728K)
2048K表示堆内存垃圾回收前内存占用大小;
713K表示堆内存垃圾回收后内存占用大小;
(9728K)表示堆内存总大小;
0.0016013 secs]
0.0016013 secs表示YoungGC耗时
[Times: user=0.02 sys=0.00, real=0.00 secs]
user=0.02表示用户耗时
sys=0.00表示系统耗时
real=0.00表示真实耗时
secs表示时间单位秒
[GC (Allocation Failure) [PSYoungGen: 496K->480K(2560K)] 713K->729K(9728K), 0.0022742 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
同上可得
[Full GC (Allocation Failure) [PSYoungGen: 480K->0K(2560K)] [ParOldGen: 249K->680K(7168K)] 729K->680K(9728K), [Metaspace: 3259K->3259K(1056768K)], 0.0076754 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
分解:
[Full GC (Allocation Failure)
Full GC表示YoungGC+OldGC(年轻代垃圾回收+年老代垃圾回收);
(Allocation Failure)表示内存分配失败;
[PSYoungGen: 480K->0K(2560K)]
480K表示年轻代垃圾回收前内存占用大小;
0K表示年轻代垃圾回收后内存占用大小;
(2560K)表示年轻代总大小;
[ParOldGen: 249K->680K(7168K)]
249K表示老年代垃圾回收前内存占用大小;
680K表示老年代垃圾回收后内存占用大小;
(7168K)表示老年代总大小;
729K->680K(9728K)
729K表示堆内存回收前内存占用大小;
680K表示堆内存回收后内存占用大小;
(9728K)表示堆内存总大小;
[Metaspace: 3259K->3259K(1056768K)]
Metaspace表示元空间;
3259K表示元空间垃圾回收前占用大小;
3259K表示元空间垃圾回收后占用大小;
(1056768K)表示元空间总大小
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 680K->680K(9728K), 0.0003449 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
同上可得
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 680K->664K(7168K)] 680K->664K(9728K), [Metaspace: 3259K->3259K(1056768K)], 0.0069613 secs] [Times: user=0.08 sys=0.00, real=0.01 secs]
同上可得
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.wwl.jvm.PrintGCDetailsDemo.main(PrintGCDetailsDemo.java:7)
OOM