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】模拟创建大对象
[code]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
- JVM垃圾回收GC原理
- JVM底层原理
- jvm垃圾回收原理
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
- JVM垃圾回收(GC)原理
- jvm垃圾回收原理(转)
- JVM原理及底层探索
- JVM的垃圾回收算法工作原理详解
- JVM垃圾回收(GC)原理
- JVM的内存分配、运行原理、回收算法机制
- JVM原理三-----GC模块,垃圾回收
- JVM的底层实现原理
- JVM垃圾回收机制原理
- JVM原理、架构—垃圾回收机制
- JVM 垃圾回收原理概要
- 【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出
- jvm垃圾回收原理
- 深入JVM 原理(九)JVM垃圾回收策略参数配置
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
- jvm垃圾回收算法及实现原理