摘要:如下文字顯示了典型的堆內(nèi)存溢出一旦發(fā)生這類問題,系統(tǒng)就會被迫退出。有關(guān)等工具的使用,可以參閱實戰(zhàn)虛擬機故障診斷與性能優(yōu)化第章。除了在發(fā)生時可以導出堆信息外,虛擬機還允許在發(fā)生錯誤時執(zhí)行一個腳本文件。
從今天開始,我會發(fā)5個關(guān)于java虛擬機的小系列:
實戰(zhàn)Java虛擬機之一“堆溢出處理”
[實戰(zhàn)Java虛擬機之二“虛擬機的工作模式”][2]
[實戰(zhàn)Java虛擬機之三“G1的新生代GC”][3]
實戰(zhàn)Java虛擬機之四“禁用System.gc()”
實戰(zhàn)Java虛擬機之五“開啟JIT編譯”
下面說說【實戰(zhàn)Java虛擬機之一“堆溢出處理”】
在Java程序的運行過程中,如果堆空間不足,則有可能拋出內(nèi)存溢出錯誤(Out Of Memory),簡稱為OOM。如下文字顯示了典型的堆內(nèi)存溢出:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:20)
一旦發(fā)生這類問題,系統(tǒng)就會被迫退出。如果發(fā)生在生產(chǎn)環(huán)境,可能會引起嚴重的業(yè)務中斷。為了能夠不斷改善系統(tǒng),避免或減少這類錯誤的發(fā)生,需要在發(fā)生錯誤時,獲得盡可能多的現(xiàn)場信息,以幫助研發(fā)人員排查現(xiàn)場問題。Java虛擬機提供了參數(shù)-XX:+HeapDumpOnOutOfMemoryError,使用該參數(shù),可以在內(nèi)存溢出時導出整個堆信息。和它配合使用的還有-XX:HeapDumpPath,可以指定導出堆的存放路徑。
【示例3-4】以下代碼合計分配了25M內(nèi)存空間。
public class DumpOOM { public static void main(String[] args) { Vector v=new Vector(); for(int i=0;i<25;i++) v.add(new byte[1*1024*1024]); } }
使用如下參數(shù)執(zhí)行上述代碼:
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
顯然20M堆空間不足以容納25M內(nèi)存,系統(tǒng)比如發(fā)生內(nèi)存溢出,在發(fā)生錯誤后,控制臺輸出如下:
java.lang.OutOfMemoryError: Java heap space Dumping heap to d:/a.dump … Heap dump file created [23067302 bytes in 0.160 secs] Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at geym.zbase.ch3.heap.DumpOOM.main(DumpOOM.java:19)
可以看到,虛擬機將當前的堆導出,并保存到D:/a.dump文件下。使用MAT等工具打開該文件進行分析,如圖所示,可以很容易地找到這些byte數(shù)組和保存它們的Vector對象實例。有關(guān)MAT等工具的使用,可以參閱《實戰(zhàn)Java虛擬機-jvm故障診斷與性能優(yōu)化》第7章。
除了在發(fā)生OOM時可以導出堆信息外,虛擬機還允許在發(fā)生錯誤時執(zhí)行一個腳本文件。該文件可以用于奔潰程序的自救、報警或者通知,也可以幫助開發(fā)人員獲得更多的系統(tǒng)信息,如完整的線程轉(zhuǎn)存(即Thread Dump或者Core Dump)文件。
這里給出一個在發(fā)生OOM時導出線程轉(zhuǎn)存的例子。準備printstack.bat腳本如下:
D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt
以上腳本將會導出給定Java虛擬機進程的線程信息,并保存在D:/a.txt文件中。
使用如下參數(shù)執(zhí)行上述代碼:
-Xmx20m -Xms5m “-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p” -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
在程序異常退出時,系統(tǒng)D盤下會生成新文件a.txt,里面保存著線程轉(zhuǎn)存信息。本例中,文件路徑“D:/tools/jdk1.7_40”為筆者的JDK按照目錄,讀者可以替換成自己的JAVA_HOME目錄,進行嘗試。
節(jié)選自
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64314.html
摘要:今天開始實戰(zhàn)虛擬機之三的新生代。一旦區(qū)被占滿,新生代就會啟動。新生代收集前后的堆數(shù)據(jù)如圖所示,其中表示區(qū),表示區(qū),表示老年代。當然我們最為關(guān)心的依然是的停頓時間以及回收情況。節(jié)選自實戰(zhàn)虛擬機一書交流群 今天開始實戰(zhàn)Java虛擬機之三:G1的新生代GC。 總計有5個系列實戰(zhàn)Java虛擬機之一堆溢出處理實戰(zhàn)Java虛擬機之二虛擬機的工作模式實戰(zhàn)Java虛擬機之三G1的新生代GC實戰(zhàn)Java...
摘要:今天開始實戰(zhàn)虛擬機之二虛擬機的工作模式??傆嬘袀€系列實戰(zhàn)虛擬機之一堆溢出處理實戰(zhàn)虛擬機之二虛擬機的工作模式實戰(zhàn)虛擬機之三的新生代實戰(zhàn)虛擬機之四禁用實戰(zhàn)虛擬機之五開啟編譯目前的虛擬機支持和兩種運行模式。 今天開始實戰(zhàn)Java虛擬機之二:虛擬機的工作模式。 總計有5個系列實戰(zhàn)Java虛擬機之一堆溢出處理實戰(zhàn)Java虛擬機之二虛擬機的工作模式實戰(zhàn)Java虛擬機之三G1的新生代GC實戰(zhàn)Jav...
摘要:實戰(zhàn)高并發(fā)程序設(shè)計這本書是目前點評推薦比較多的書,其特色是案例小,好實踐代碼有場景,實用。想要學習多線程的朋友,這本書是我大力推薦的,我的個人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進行提煉和總結(jié)而寫出來的。 學習的最好途徑就是看書,這是我自己學習并且小有了一定的積累之后的第一體會。個人認為看書有兩點好處:showImg(/img/bVr5S5); 1.能出版出...
摘要:實戰(zhàn)高并發(fā)程序設(shè)計推薦豆瓣評分書的質(zhì)量沒的說,推薦大家好好看一下。推薦,豆瓣評分,人評價本書介紹了在編程中條極具實用價值的經(jīng)驗規(guī)則,這些經(jīng)驗規(guī)則涵蓋了大多數(shù)開發(fā)人員每天所面臨的問題的解決方案。 很早就想把JavaGuide的書單更新一下了,昨晚加今天早上花了幾個時間對之前的書單進行了分類和補充完善。雖是終極版,但一定還有很多不錯的 Java 書籍我沒有添加進去,會繼續(xù)完善下去。希望這篇...
閱讀 2461·2021-11-22 15:35
閱讀 3756·2021-11-04 16:14
閱讀 2685·2021-10-20 13:47
閱讀 2487·2021-10-13 09:49
閱讀 2064·2019-08-30 14:09
閱讀 2359·2019-08-26 13:49
閱讀 879·2019-08-26 10:45
閱讀 2762·2019-08-23 17:54