天天看點

java gc日志詳解_深入了解JAVA虛拟機-GC日志詳解 - Java 技術驿站-Java 技術驿站

1.編寫JAVA代碼

import java.util.ArrayList;

import java.util.List;

public class HeapOutOfMemoryExample {

public static void main(String[] args) {

List list = new ArrayList();

while(true) {

list.add(new Object());

}

}

}

2.設定JVM參數

-verbose:gc -Xms30M -Xmx30M -Xmn10M -XX:PermSize=200M -XX:MaxPermSize=200M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:SurvivorRatio=8

java gc日志詳解_深入了解JAVA虛拟機-GC日志詳解 - Java 技術驿站-Java 技術驿站

JVM參數說明

Xms=30M //最小堆記憶體

Xmx=30M //最大堆記憶體

Xmn=10M //年輕代所占記憶體

PermSize=200M //永久代所占最小記憶體

MaxPermSize=200M //永久代所占最大記憶體

SurvivorRatio=8 //年輕代中Eden區和Survivor區的比值

PrintGCDetails //列印出垃圾回收日志

PrintGCDateStamps //列印出垃圾回收的時間

3.執行類HeapOutOfMemoryExample

列印出GC日志

java gc日志詳解_深入了解JAVA虛拟機-GC日志詳解 - Java 技術驿站-Java 技術驿站

2017-11-22T22:36:06.735+0800: [GC [PSYoungGen: 7522K->1001K(9216K)] 7522K->5201K(29696K), 0.0087282 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

2017-11-22T22:36:06.735+0800: [GC [PSYoungGen: 9193K->1024K(9216K)] 13393K->10990K(29696K), 0.0104110 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]

2017-11-22T22:36:06.751+0800: [Full GC [PSYoungGen: 9216K->0K(9216K)] [ParOldGen: 14714K->18607K(20480K)] 23930K->18607K(29696K) [PSPermGen: 2570K->2569K(204800K)], 0.2016436 secs] [Times: user=0.22 sys=0.00, real=0.20 secs]

2017-11-22T22:36:06.953+0800: [Full GC [PSYoungGen: 5655K->4088K(9216K)] [ParOldGen: 18607K->20131K(20480K)] 24262K->24220K(29696K) [PSPermGen: 2569K->2569K(204800K)], 0.2352180 secs] [Times: user=0.33 sys=0.00, real=0.23 secs]

2017-11-22T22:36:07.187+0800: [Full GC [PSYoungGen: 4088K->4088K(9216K)] [ParOldGen: 20131K->20120K(20480K)] 24220K->24209K(29696K) [PSPermGen: 2569K->2569K(204800K)], 0.1325484 secs] [Times: user=0.22 sys=0.00, real=0.14 secs]

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2245)

at java.util.Arrays.copyOf(Arrays.java:2219)

at java.util.ArrayList.grow(ArrayList.java:242)

at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)

at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)

at java.util.ArrayList.add(ArrayList.java:440)

at com.HeapOutOfMemoryExample.main(HeapOutOfMemoryExample.java:15)

Heap

PSYoungGen total 9216K, used 4382K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)

eden space 8192K, 53% used [0x00000000ff600000,0x00000000ffa478e0,0x00000000ffe00000)

from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

ParOldGen total 20480K, used 20120K [0x00000000fe200000, 0x00000000ff600000, 0x00000000ff600000)

object space 20480K, 98% used [0x00000000fe200000,0x00000000ff5a6150,0x00000000ff600000)

PSPermGen total 204800K, used 2601K [0x00000000f1a00000, 0x00000000fe200000, 0x00000000fe200000)

object space 204800K, 1% used [0x00000000f1a00000,0x00000000f1c8a418,0x00000000fe200000)

4.GC日志詳解

2017-11-22T22:36:06.735+0800:[GC [PSYoungGen: 9193K->1024K(9216K)] 13393K->10990K(29696K), 0.0104110secs] [Times: user=0.05 sys=0.00, real=0.02 secs]

2017-11-22T22:36:06.735+0800 //垃圾回收時的時間

GC //垃圾回收的類型,GC是隻回收新生代;Full GC會回收新生代、年老代、永久代,會停止所有使用者線程。

PSYoungGen //年輕代的垃圾回收使用的是Parallel Scanvenge垃圾收集器,簡稱PS,年輕代就是PSYoungGen。

9193K->1024K(9216K)//年輕代劃分成Eden區、From Survivor區和To Survivor區,整個年輕代可以用來使用的就是Eden區加上其中一個Survivor區,也就是8M+1M=9M=9216K,9193K是指Eden區+其中一個Survivor區在垃圾回收之前占用的記憶體,1024K是指Eden區+其中一個Survivor區在垃圾回收之後還在占用的記憶體

13393K->10990K(29696K) //29696K指堆的可用大小,包含Eden區+其中一個Survivor區+年老代,8M+1M+20M=29M=29696K,13393K指執行垃圾回收前這三個區域所占的記憶體,10990K指執行垃圾回收之後這三個區域所占的記憶體。

Times:user=0.05 sys=0.00, real=0.02 secs //user=0.05是指CPU運作的總時長,如果有多核,則累加;sys=0.00,是指核心态消耗的CPU事時間;real=0.02是指操作從開始到結束所經過的牆鐘時間,牆鐘時間包括各種非運算的等待耗時,例如等待磁盤I/O,等待線程阻塞,而CPU時間不包括這些耗時。

2017-11-22T22:36:06.751+0800:[Full GC [PSYoungGen: 9216K->0K(9216K)] [ParOldGen:14714K->18607K(20480K)] 23930K->18607K(29696K) [PSPermGen:2570K->2569K(204800K)], 0.2016436 secs] [Times: user=0.22 sys=0.00,real=0.20 secs]

Full GC //垃圾回收的類型,GC是隻回收新生代;Full GC會回收新生代、年老代、永久代,會停止所有使用者線程。

ParOldGen //年老代的垃圾回收采用的是ParNew收集器

14714K->18607K(20480K) //20480K指年老代最大可以配置設定的記憶體20M=20480K;14714K指執行垃圾回收前永久代占用的記憶體;18607K指年老代執行垃圾回收後所占的記憶體,由于年輕代經過垃圾回收後年輕代或Survivor中的部分對象被移動到年老代,是以導緻年老代執行垃圾回收後占用的記憶體超過垃圾回收之前所占的記憶體。

PSPermGen //永久代的垃圾回收采用的是Parallel Scanvenge垃圾收集器

2570K->2569K(204800K) //永久代最大可以配置設定的記憶體200M=204800K,2570K指永久代執行垃圾回收前所占記憶體,2569指永久代執行垃圾回收之後所占記憶體

Heap PSYoungGen     total9216K,used4382K[0x00000000ff600000,0x0000000100000000,0x0000000100000000) edenspace8192K,53%used[0x00000000ff600000,0x00000000ffa478e0,0x00000000ffe00000) fromspace1024K,0%used[0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to  space1024K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen      total20480K,used20120K[0x00000000fe200000,0x00000000ff600000,0x00000000ff600000) objectspace20480K,98%used[0x00000000fe200000,0x00000000ff5a6150,0x00000000ff600000) PSPermGen      total204800K,used2601K[0x00000000f1a00000,0x00000000fe200000,0x00000000fe200000) objectspace204800K,1%used[0x00000000f1a00000,0x00000000f1c8a418,0x00000000fe200000)

Heap PSYoungGen     total9216K,used4382K[0x00000000ff600000,0x0000000100000000,0x0000000100000000) edenspace8192K,53%used[0x00000000ff600000,0x00000000ffa478e0,0x00000000ffe00000) fromspace1024K,0%used[0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to  space1024K,0%used[0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen      total20480K,used20120K[0x00000000fe200000,0x00000000ff600000,0x00000000ff600000) objectspace20480K,98%used[0x00000000fe200000,0x00000000ff5a6150,0x00000000ff600000) PSPermGen      total204800K,used2601K[0x00000000f1a00000,0x00000000fe200000,0x00000000fe200000) objectspace204800K,1%used[0x00000000f1a00000,0x00000000f1c8a418,0x00000000fe200000)

這是堆記憶體溢出時虛拟機列印出來的日志

PSYoungGen total 9216K, used 4382K //指出現堆記憶體溢出時,Eden區+Survivor區可配置設定的記憶體總和是9216K,已經配置設定的記憶體是4382K

eden space8192K, 53% used //指Eden區可配置設定的記憶體總和8192K,已配置設定的記憶體占53%

from space1024K, 0% used //指from survivor區可配置設定的記憶體總和1024K,已配置設定的記憶體占0%

to space1024K, 0% used //指from survivor區可配置設定的記憶體總和1024K,已配置設定的記憶體占0%

ParOldGen total 20480K, used 20120K //指年老代可配置設定的記憶體總和20480K,已配置設定的記憶體是20120K

objectspace 20480K, 98% used //指年老代中對象空間20480K,其中98%已用

PSPermGen total 204800K, used 2601K //指永久代可配置設定的記憶體總和204800K,已配置設定的記憶體是2601K

object space 204800K, 1% used //指永久代中對象空間20480K,其中98%已用