【問題現(xiàn)象】:
自動化用例跑了約三個多小時后,界面響應(yīng)時間長,界面出現(xiàn)500錯誤。之后再點擊時,頁面重定向至首頁。查看jboss下的server.log文件發(fā)現(xiàn)內(nèi)存溢出的OutOfMemory異常。
【出現(xiàn)的問題日志】:
java.lang.OutOfMemoryError
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:203)
at java.util.jar.JarFile.<init>(JarFile.java:132)
at java.util.jar.JarFile.<init>(JarFile.java:97)
2010-11-24 15:32:48,377 ERROR [STDERR] Exception in thread "Thread-5271"
2010-11-24 15:32:48,377 ERROR [STDERR] java.lang.OutOfMemoryError: unable to create new native thread
【問題定位】:
對于一般的內(nèi)存泄漏導(dǎo)致的堆棧溢出,通常的錯誤信息主要有以下幾種。
1. java.lang.OutOfMemoryError: Java heap space
2. java.lang.OutOfMemoryError: PermGen space
3. java.lang.OutOfMemoryError: Requested array size exceeds VM limit
4. java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)
而在出現(xiàn)內(nèi)存泄露的機器上,其日志顯示是無法創(chuàng)建本地線程的原因所引起的。這里的異常信息是:java.lang.OutOfMemoryError: unable to create new native thread,對應(yīng)上述內(nèi)存溢出的第4種場景。盡管可以初步懷疑是虛擬機參數(shù)的設(shè)置導(dǎo)致的問題,但實際上還是需要確認(rèn)系統(tǒng)在自動化場景下有沒有其他內(nèi)存泄露問題。
重新跑自動化,并中間使用“jstat –gcutil 進程ID 1000 3 >>jstat.txt”命令,每隔3秒查看一下虛擬機堆空間的回收情況。在運行了三個多小時后,發(fā)行server.log種已經(jīng)出現(xiàn)了該OutOfMemory的異常信息。此時查看了jstat.txt文件,發(fā)現(xiàn)從自動化開始運行一直到堆棧溢出,內(nèi)存回收都很正常。全部垃圾回收時間花費了5秒左右,且未有full gc,全為young gc的時間。持久區(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è)務(wù)邏輯相關(guān)的類導(dǎo)致的泄露問題。系統(tǒng)中創(chuàng)建最多的就是與Sting相關(guān)的char數(shù)組對象。這個也是正常情況,排除程序級別的內(nèi)存泄漏問題。也就是說堆棧溢出不是1和2的兩種情況。
此時再分析server.log種的日志信息,得知是無法創(chuàng)建本地線程所致的問題。也就是說在壓力環(huán)境下?lián)碛写罅康木€程,或者本地內(nèi)存耗盡時,企圖創(chuàng)建新的線程時拋出。而系統(tǒng)能創(chuàng)建的線程數(shù)的計算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一個進程的最大內(nèi)存
JVMMemory JVM內(nèi)存
ReservedOsMemory 保留的操作系統(tǒng)內(nèi)存
ThreadStackSize 線程棧的大小
【解決方法】:
針對無法創(chuàng)建更多本地線程的情況,調(diào)整線程棧的大小,添加-Xss選項,設(shè)置為256k后再跑自動化,發(fā)現(xiàn)問題解決。
JAVA_OPTS="-Xms2048M -Xmx2048M -Xmn512M -Xss256k -XX:PermSize=512M….”
(###)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。