基于JavaCore文件的深入分析
產(chǎn)生時(shí)間
Java程序運(yùn)行時(shí),有時(shí)會產(chǎn)生JavaCore及HeapDump文件,它一般發(fā)生于Java程序遇到致命問題的情況下。
有時(shí)致命問題發(fā)生后,Java應(yīng)用不會死掉,還能繼續(xù)運(yùn)行;
但有時(shí)致命問題發(fā)生,Java進(jìn)程會死掉;
為了能夠保留Java應(yīng)用發(fā)生致命錯(cuò)誤前的運(yùn)行狀態(tài),JVM在死掉前產(chǎn)生兩個(gè)文件,分別為JavaCore及HeapDump文件。
有何區(qū)別
JavaCore是關(guān)于CPU的,而HeapDump文件是關(guān)于內(nèi)存的。
JavaCore文件主要保存的是Java應(yīng)用各線程在某一時(shí)刻的運(yùn)行的位置,即JVM執(zhí)行到哪一個(gè)類、哪一個(gè)方法、哪一個(gè)行上。它是一個(gè)文本文件,打開后可以看到每一個(gè)線程的執(zhí)行棧,以stack trace的顯示。通過對JavaCore文件的分析可以得到應(yīng)用是否“卡”在某一點(diǎn)上,即在某一點(diǎn)運(yùn)行的時(shí)間太長,例如數(shù)據(jù)庫查詢,長期得不到響應(yīng),最終導(dǎo)致系統(tǒng)崩潰等情況。
HeapDump文件是一個(gè)二進(jìn)制文件,它保存了某一時(shí)刻JVM堆中對象使用情況,這種文件需要相應(yīng)的工具進(jìn)行分析,如IBM Heap Analyzer這類工具。這類文件最重要的作用就是分析系統(tǒng)中是否存在內(nèi)存溢出的情況。
怎么生成
這兩個(gè)文件可以用手工的方式生成,當(dāng)我們會遇到系統(tǒng)變慢或無響應(yīng)的情況,這時(shí)就以采用手工的方式生成JavaCore及HeapDump文件。
在Unix/Linux上,產(chǎn)生這兩個(gè)文件的方法如下:
# ps -ef | grep java
user 4616 4582 0 17:30 pts/0 00:00:00 grep java
root 5580 1 0 Oct27 ? 00:02:27 /usr/bin/java -server -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat8090/conf/logging.properties -Djava.endorsed.dirs=/usr/local/tomcat8090/endorsed -classpath :/usr/local/tomcat8090/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat8090 -Dcatalina.home=/usr/local/tomcat8090 -Djava.io.tmpdir=/usr/local/tomcat8090/temp org.apache.catalina.startup.Bootstrap start
# kill -3 5580
首先,找出Java進(jìn)程id ,然后再執(zhí)行‘kill -3 進(jìn)程號'的操作,等文件生成后再做一次同樣的操作,再產(chǎn)生一組文件。
如何分析
JavaCore文件
兩組文件在分析JavaCore時(shí)特別有效,因?yàn)樗梢钥闯鲈谙群髢蓚€(gè)時(shí)間點(diǎn)上,線程執(zhí)行的位置,如果發(fā)現(xiàn)先后兩組數(shù)據(jù)中同一線程都執(zhí)行在同一位置,則說明此處可能有問題,因?yàn)槌绦蜻\(yùn)行是極快的,如果兩次均在某一點(diǎn)上,說明這一點(diǎn)耗時(shí)是很大的,通過對這兩個(gè)文件進(jìn)行分析,查出原因,進(jìn)而解決問題。
JavaCore文件的頭部有一個(gè)“Current Thread Details”標(biāo)記,它記錄了JavaCore產(chǎn)生時(shí)系統(tǒng)運(yùn)行的線程id,使用線程id在文件中查找線程的詳細(xì)信息,該信息中記載了線程運(yùn)行哪個(gè)類的時(shí)候造成的JavaCore。
NULL ------------------------------------------------------------------------
0SECTION TITLE subcomponent dump routine
NULL ===============================
1TISIGINFOOUTOFMEMORY received
1TIDATETIME Date: 2011/12/07 at 15:59:42
1TIFILENAME Javacore filename:/usr/WebSphere/AppServer/profiles/WCSProdNode2/javacore19202086.1323298782.txt
NULL ------------------------------------------------------------------------
0SECTION XHPI subcomponent dump routine
NULL ==============================
1XHTIME Wed Dec 7 15:59:42 2011
1XHSIGRECV Unexpected signal -1 received at 0x0 in <unknown>. Processing terminated.
1XHFULLVERSION J2RE 1.4.2 IBM AIX build ca142ifx-20090918 (SR13 FP2)
NULL
1XHCURRENTTHD Current Thread Details
NULL ----------------------
2XHCURRSYSTHD "WebContainer : 5" sys_thread_t:0x45FB5328
3XHNATIVESTACK Native Stack
NULL ------------
3XHSTACKLINEERR unavailable - stack address not valid
:::
:::
0SECTION XM subcomponent dump routine
NULL ============================
NULL
1XMCURTHDINFO Current Thread Details
NULL ----------------------
3XMTHREADINFO "WebContainer : 5" (TID:0x70A8E260, sys_thread_t:0x45FB5328, state:R, native ID:0x5CC0) prio=5
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport$ImportResponseWrapper.getString(Unknown Source)
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(Unknown Source)
4XESTACKTRACE at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(Unknown Source)
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_import_3(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_otherwise_3(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspx_meth_c_choose_4(_part.java(Compiled Code))
4XESTACKTRACE at com.ibm._jsp._part._jspService(_part.java:3237)
這樣結(jié)合當(dāng)時(shí)的日志文件可以找到問題產(chǎn)生的原因。不過,這種方法只能找到不是內(nèi)存溢出的錯(cuò)誤,對于在core文件頭就有java/lang/outMemoryException的錯(cuò)誤還是不知道是執(zhí)行到哪個(gè)類的時(shí)候出現(xiàn)。
HeapDump文件
HeapDump文件是指定時(shí)刻的Java堆棧的快照,是一種鏡像文件。Heap Analyzer工具通過分析HeapDump文件,哪些對象占用了太多的堆??臻g,來發(fā)現(xiàn)導(dǎo)致內(nèi)存泄露或者可能引起內(nèi)存泄露的對象。
相關(guān)文章
Java?HttpURLConnection使用方法與實(shí)例演示分析
這篇文章主要介紹了Java?HttpURLConnection使用方法與實(shí)例演示,HttpURLConnection一個(gè)抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請求,響應(yīng)等功能,下面我們來深入看看2023-10-10ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解
這篇文章主要為大家介紹了ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Java基礎(chǔ)之創(chuàng)建虛擬機(jī)對象的過程詳細(xì)總結(jié)
本文基于虛擬機(jī)HotSpot和常用的內(nèi)存區(qū)域Java堆深入對象分配、布局和訪問的全過程,文中有非常詳細(xì)的圖文解說,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05ConstraintValidator類如何實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參
這篇文章主要介紹了ConstraintValidator類實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java 梳理總結(jié)關(guān)于static關(guān)鍵字常見問題
static關(guān)鍵字基本概念我們可以一句話來概括:方便在沒有創(chuàng)建對象的情況下來進(jìn)行調(diào)用。也就是說:被static關(guān)鍵字修飾的不需要創(chuàng)建對象去調(diào)用,直接根據(jù)類名就可以去訪問,讓我們來了解一下你可能還不知道情況2022-04-04