資源描述:
《javalangoutofmemoryerrorunabletocreatenewnativethread內(nèi)存泄漏分析》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、【問題現(xiàn)象】:自動化用例跑了約三個多小時后,界面響應吋間長,界面出現(xiàn)500錯誤。之后再點擊時,頁面重定向至首頁。查看jboss下的server,log文件發(fā)現(xiàn)內(nèi)存溢出的OutOfMemory異常?!境霈F(xiàn)的問題H志】:java.lang.OutOfMemoryRrroratjava.util.zip.ZipFilc.open(NativeMethod)atjava.util.zip.ZipEile.(ZipEile.java:203)atjava.util.jar.JarFile.(JarFile.j
2、ava:132)atjava.util.jar.JarFile.(JarFile.java:97)2010-11-2415:32:48,377ERROR[STDERR]Exceptioninthread"Thread-5271"2010-11-2415:32:48,377ERROR[STDERR]java.lang.OutOfMemoryError:unabletocreatenewnativethread【問題定位】:對于一般的N存泄漏導致的堆棧溢出,通常的錯誤信息主要有以下幾種。1.java.lang.Ou
3、tOfMemoryError:Javaheapspace2.java.lang.OutOfMemoryError:PermGenspace3.java.lang.OutOfMemoryError:RequestedarraysizeexceedsVMlimit4.java.lang.OutOfMemoryRrror:〈reason〉〈stacktrace〉(Nativemethod)回復次數(shù):1樓得分:回復于:2010-12-2716:06:51而在出現(xiàn)內(nèi)存泄露的機器上,其日志顯示是無法創(chuàng)建本地線程的原因所引起的。這里的異
4、常信息是:luozhangwen(我不懶一押寶黨實習生)等級:java.lang.OutOfMemoryError:unabletocreatenewnativethread,對應上述內(nèi)存溢出的第4種場景。盡管可以初步懷疑是虛擬機參數(shù)的設置導致的問題,但實際上還是需要確汄系統(tǒng)在自動化場澩下有沒有其他內(nèi)存泄露問題。重新跑自動化,并中間使川“jstat-gcutil進程ID10003>>jstat.txt”命令,每隔3秒查看一下虛擬機堆空間的回收情況。在運行了三個多小時后,發(fā)行server,log種己經(jīng)出現(xiàn)了該OutOfMem
5、ory的異常信息。此時查看了jstat.txt文件,發(fā)現(xiàn)從自動化斤始運行一直到堆棧溢出,內(nèi)存回收都很正常。全部垃圾回收時間花費Z5秒左右,且未有fullgc,全為younggc的時間。持久區(qū)(Perm)、年老區(qū)(Old),分別占用了25%、19%左右的空間。且使用“top”命令監(jiān)測中間CPU和內(nèi)存占用都比較穩(wěn)定,沒有激增的現(xiàn)象。使用“jmap-hito進程ID”查看內(nèi)存對象統(tǒng)計,發(fā)現(xiàn)沒有業(yè)務邏輯相關的類異致的泄露問題。系統(tǒng)屮創(chuàng)建最多的就是與Sting相關的char數(shù)組對象。這個也是正常情況,排除程序級別的內(nèi)存泄漏問題。也就
6、是說堆棧溢出不是1和2的兩種情況。此時再分析server,log種的日志信息,得知是無法創(chuàng)建本地線程所致的問題。也就是說在壓力環(huán)境丁擁有大量的線程,或者本地內(nèi)存耗盡吋,企圖創(chuàng)建新的線程吋拋出。而系統(tǒng)能創(chuàng)建的線程數(shù)的計算公式如下:(MaxProcessMemory-JVMMemory-ReservedOsMemory)/(ThreadStackSizc)=NumberofthreadsMaxProcessMemory指的是一個進程的最大內(nèi)存JVMMemoryJVM內(nèi)存ReservedOsMemory保留的操作系統(tǒng)內(nèi)存Thre
7、adStackSize線程棧的大小【解決方法】:針對無法創(chuàng)建更多本地線程的情況,調(diào)整線程桟的大小,添加-Xss選項,設置為256k后再跑自動化,發(fā)現(xiàn)問題解決。JAVA_0PTS=〃-Xms2048M-Xmx2048M-Xmn512M-Xss256k-XX:PermSize=512M“*.”星期一早上到了公司,據(jù)稱產(chǎn)品環(huán)境拋出了最可愛的異常一OutOfMemory,它是這樣來描述他自己的:java.Iang.OutOfMemoryError:unabletocreatenewnativethread而_氏這位仁兄竟然還堂而皇
8、之地同時出現(xiàn)在丫3個application里面,所有應用全部遭殃。那可愛的00M是如何產(chǎn)生的呢?直接原因是創(chuàng)建的線程太多Y,根本原因是某個地方的內(nèi)存限制了。搜羅了一下在網(wǎng)上找到丫一個計算公式:(MaxProcessMemory?JVMMemory-ReservedOsMemory)/(ThreadSta