Java虛擬機(jī)GC日志分析
本文研究的主要是Java虛擬機(jī)中g(shù)c日志的理解問題,具體如下。
一、日志分析
理解GC日志是處理Java虛擬機(jī)內(nèi)存問題的基本技能。
通過在java命令種加入?yún)?shù)來指定對應(yīng)的gc類型,打印gc日志信息并輸出至文件等策略。
1、編寫java代碼
public class ReferenceCountingGC {
public Object instance = null;
private static final int ONE_MB = 1024 * 1024;
private byte[] bigSize = new byte[2 * ONE_MB];
public static void main(String[] args) {
testGC();
}
public static void testGC() {
ReferenceCountingGC objA = new ReferenceCountingGC();
ReferenceCountingGC objB = new ReferenceCountingGC();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
System.gc();
}
}
2、編譯java文件
javac ReferenceCountingGC.java
3、執(zhí)行class文件
java -XX:+PrintGCDateStamps -XX:+PrintGCDetails ReferenceCountingGC
對應(yīng)的參數(shù)列表
-XX:+PrintGC 輸出GC日志
-XX:+PrintGCDetails 輸出GC的詳細(xì)日志
-XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)
-XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的輸出路徑
結(jié)果輸出:
2016-03-20T14:34:55.118-0800: [GC [PSYoungGen: 6123K->400K(38912K)] 6123K->400K(125952K), 0.0012070 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2016-03-20T14:34:55.119-0800: [Full GC [PSYoungGen: 400K->0K(38912K)] [ParOldGen: 0K->282K(87040K)] 400K->282K(125952K) [PSPermGen: 2622K->2621K(21504K)], 0.0084640 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 38912K, used 1013K [0x00000007d5500000, 0x00000007d8000000, 0x0000000800000000)
eden space 33792K, 3% used [0x00000007d5500000,0x00000007d55fd7d0,0x00000007d7600000)
from space 5120K, 0% used [0x00000007d7600000,0x00000007d7600000,0x00000007d7b00000)
to space 5120K, 0% used [0x00000007d7b00000,0x00000007d7b00000,0x00000007d8000000)
ParOldGen total 87040K, used 282K [0x0000000780000000, 0x0000000785500000, 0x00000007d5500000)
object space 87040K, 0% used [0x0000000780000000,0x0000000780046bf8,0x0000000785500000)
PSPermGen total 21504K, used 2628K [0x000000077ae00000, 0x000000077c300000, 0x0000000780000000)
object space 21504K, 12% used [0x000000077ae00000,0x000000077b091380,0x000000077c300000)
PSYoungGen表示新生代,這個(gè)名稱由收集器決定,這里的收集器是Parallel Scavenge。老年代為ParOldGen,永久代為PSPermGen
- 如果收集器為ParNew收集器,新生代為ParNew,Parallel New Generation
- 如果收集器是Serial收集器,新生代為DefNew,Default New Generation
可以看到上面有兩種GC類型:GC和Full GC,有Full表示這次GC是發(fā)生了Stop-The-World的。
新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)镴ava對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度非常快。
老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC,經(jīng)常會(huì)伴隨至少一次的Minor GC,Major GC的速度一般會(huì)比Minor GC慢10倍以上。
[GC [PSYoungGen: 6123K->400K(38912K)] 6123K->400K(125952K), 0.0012070 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
上面方括號(hào)內(nèi)部的6123K->400K(38912K),表示GC前該內(nèi)存區(qū)域已使用容量->GC后該內(nèi)存區(qū)域已使用容量,后面圓括號(hào)里面的38912K為該內(nèi)存區(qū)域的總?cè)萘俊?/p>
方括號(hào)外面的6123K->400K(125952K),表示GC前Java堆已使用容量->GC后Java堆已使用容量,后面圓括號(hào)里面的125952K為Java堆總?cè)萘俊?/p>
[Times: user=0.00 sys=0.00, real=0.00 secs]分別表示用戶消耗的CPU時(shí)間,內(nèi)核態(tài)消耗的CPU時(shí)間和操作從開始到結(jié)束所經(jīng)過的墻鐘時(shí)間(Wall Clock Time),CPU時(shí)間和墻鐘時(shí)間的差別是,墻鐘時(shí)間包括各種非運(yùn)算的等待耗時(shí),例如等待磁盤I/O、等待線程阻塞,而CPU時(shí)間不包括這些耗時(shí)。
二、GC日志的離線分析
可以使用一些離線的工具來對GC日志進(jìn)行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/GCViewer ),這些都是開源的工具,用戶可以直接通過版本控制工具下載其源碼,進(jìn)行離線分析。
總結(jié)
以上就是本文關(guān)于Java虛擬機(jī)GC日志分析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
springboot實(shí)現(xiàn)配置本地訪問端口及路徑
這篇文章主要介紹了springboot實(shí)現(xiàn)配置本地訪問端口及路徑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java報(bào)錯(cuò):java.util.concurrent.ExecutionException的解決辦法
在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來管理和協(xié)調(diào)多個(gè)線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時(shí),可能會(huì)遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細(xì)分析這種異常的背景、可能的原因2024-09-09
SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼
@JsonView 是 Jackson 庫中的一個(gè)注解,它允許你定義哪些屬性應(yīng)該被序列化到 JSON 中,基于不同的“視圖”或“配置”,在本文中,通過了解@JsonView,你將能夠更好地掌握如何在Spring Boot應(yīng)用中定制JSON數(shù)據(jù)的輸出,需要的朋友可以參考下2024-05-05
Java?Chassis3應(yīng)用視角的配置管理技術(shù)解密
這篇文章主要為大家介紹了Java?Chassis3應(yīng)用視角的配置管理相關(guān)的機(jī)制和背后故事,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Java優(yōu)化for循環(huán)嵌套的高效率方法
這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下2020-09-09

