JVM底层原理之PrintGCDetails回收前后对比--待补充

一、JVM常用参数

-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        进入老年代阈值设置

二、配置-XX:+PrintGCDetails参数


(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
 

你可能感兴趣的:(PrintGCDetails,Minor,GC分解图,工具使用,java)