項目中碰到Websphere內存溢出的情況。原因可能:出現過多內存泄漏,或者分配過多大內存等。解決方法:
1、進入was管理控制台,選擇 應用程序服務器 > server1 > 進程定義 > Java 虛擬機,將"最大堆大小"改為768或1024以上(跟機器內存相關,你的機器最好有較大內存)。保存。
2、優化你的程序,減少要求分配較大內存的設計,優化數據連接池。
3、給was打補丁。ibm網站上有相關補丁下載,不過最好升級到同系列的最新版本
4、修改啟動文件,使之不產生這些文件,設置如下:
export IBM_HEAP_DUMP=false
export IBM_HEAPDUMP=false
export IBM_HEAPDUMP_OUTOFMEMORY=false
export IBM_JAVACORE_OUTOFMEMORY=false
分析以上4中方法,只有方法2才是根本解決之道。
針對4,IBM網站上有詳細闡述,特附如下:
http://www-1.ibm.com/support/docview.wss?uid=swg21140641
用於故障診斷的工具:
http://www.ibm.com/developerworks/cn/websphere/techjournal/0702_supauth/0702_supauth.html
在您對 WebSphere Application Server 進行故障診斷時,日志記錄工具很可能是您使用的第一項問題確定功能。這一工具集向用戶和 IBM Support 提供深入了解運行時的能力,這種能力在確定基本問題時是必需的。
WebSphere Application Server 日志記錄基礎結構是基於標准 Java 的日志記錄基礎結構(即java.util.logging)建立的。在一個典型的 WebSphere Application Server 配置中,日志記錄被設置為將普通和嚴重的日志消息分別寫入兩個文件,即SystemOut.log 和 SystemErr.log。
其他日志
WebSphere Application Server 中還有其他兩個日志文件:JVM native_stdout 和 native_stderr 文件。與 SystemOut.log 和 SystemErr.log 不同,這兩個文件實際上是由 JVM 本身處理的,只包含與該 JVM 的操作有關的消息,而不包含來自 WebSphere Application Server 運行時的消息。
假設在native_stderr.log里有這么一段日志:
<AF[3160]: Allocation Failure. need 2621456 bytes, 195 ms since last AF>
<AF[3160]: managing allocation failure, action=2 (5049520/1073740288)>
<GC(3538): GC cycle started Wed Jul 30 17:41:02 2008
<GC(3538): freed 4619080 bytes, 0% free (9668600/1073740288), in 6135 ms>
<GC(3538): mark: 992 ms, sweep: 28 ms, compact: 5115 ms>
<GC(3538): refs: soft 0 (age >= 32), weak 0, final 7, phantom 3>
<GC(3538): moved 6184798 objects, 298397088 bytes, reason=1, used 101520 more bytes>
<AF[3160]: managing allocation failure, action=3 (9668600/1073740288)>
<AF[3160]: managing allocation failure, action=4 (9668600/1073740288)>
<AF[3160]: managing allocation failure, action=6 (9668600/1073740288)>
JVMDG217: Dump Handler is Processing OutOfMemory - Please Wait.
JVMDG315: JVM Requesting Heap dump file
JVMDG318: Heap dump file written to C:\Program Files\IBM\WebSphere\AppServer\profiles\default\heapdump.20080730.174102.3784.phd
JVMDG303: JVM Requesting Java core file
JVMDG304: Java core file written to C:\Program Files\IBM\WebSphere\AppServer\profiles\default\javacore.20080730.174149.3784.txt
JVMDG274: Dump Handler has Processed OutOfMemory.
<AF[3160]: Insufficient space in Javaheap to satisfy allocation request>
<AF[3160]: completed in 92673 ms>
第一行是說需要2621456 bytes內存,分配失敗;
然后第二行告知可用內存只有5049520 bytes;
第三行GC開始回收內存;
第四行回收了4619080 bytes,總的可用內存變為9668600bytes。0% free是指當前可用/總內存大小,9668600/1073740288=0.0090,被約等於0了。
第五行開始不知道在干什么,猜測是移動數據以獲取連續空間?
第十一行終於報內存不足了,然后會記錄兩個日志文件,heapdump、javacore.log。
根據這兩個日志的時間,可以到sysetemOut.log中查看當時在做什么操作。
再看一段:
<AF[2]: Allocation Failure. need 524 bytes, 383 ms since last AF>
<AF[2]: managing allocation failure, action=0 (528723272/536869376)>
<GC(2): GC cycle started Sat Apr 05 21:40:31 2008
<GC(2): freed 3529224 bytes, 99% free (532252496/536869376), in 10 ms>
<GC(2): mark: 7 ms, sweep: 3 ms, compact: 0 ms>
<GC(2): refs: soft 0 (age >= 32), weak 0, final 7, phantom 0>
<AF[2]: completed in 11 ms>
這段應該說明,可用內存很大,但申請連續內存時可能還是不足。這段日志記錄的是gc回收后就正好夠了,所以沒有了上一段日志中的move。
嗯,僅僅是猜測。