我正在運行java web應用程序(Play Framework)的多個實例。 Web應用程序運行的時間越長,重新啓動Web應用程序之前可用的內存就越少。有時我會遇到OutOfMemory異常。 我試圖找到問題,但我得到了很多矛盾的信息,所以我無法找到源代碼。Java內存使用情況,許多矛盾的數字
這是相關信息:
- 的Ubuntu 14.04.5 LTS與GB的12 RAM
- OpenJDK的運行時環境(建立1.8.0_111-8u111-B14-3〜14.04.1-B14)
- OpenJDK的64位服務器VM(建立25.111-B14,混合模式)
編輯: 這裏是JVM設置:
- -Xms64m
- -Xmx128m
- -server
- (我不是100%肯定,因爲我使用的/etc/init.d腳本
start-stop-daemon
這將啓動,如果這些參數正確地傳遞給JVM該劇劇本的框架,這將啓動JVM)
這是,我如何使用它:
start() {
echo -n "Starting MyApp"
sudo start-stop-daemon --background --start \
--pidfile ${APPLICATION_PATH}/RUNNING_PID \
--chdir ${APPLICATION_PATH} \
--exec ${APPLICATION_PATH}/bin/myapp \
-- \
-Dinstance.name=${NAME} \
-Ddatabase.name=${DATABASE} \
-Dfile.encoding=utf-8 \
-Dsun.jnu.encoding=utf-8 \
-Duser.country=DE \
-Duser.language=de \
-Dhttp.port=${PORT} \
-J-Xms64M \
-J-Xmx128m \
-J-server \
-J-XX:+HeapDumpOnOutOfMemoryError \
>> \
$LOGFILE 2>&1
我撿在網絡應用的實例中:
htop
顯示4615M的VIRT
和338M的RES
。
當我使用jmap -dump:live,format=b,file=mydump.dump <mypid>
創建堆轉儲時,該文件只有大約50MB。
當我在Eclipse MAT中打開它時,總覽顯示已使用內存「20.1MB」(將「Keep unreachable objects」選項設置爲ON)。
那麼在Eclipse MAT中,如何將htop中顯示的338MB縮小到20.1MB?
我不認爲這是與GC有關的,因爲無論等待多久都無所謂,htop總是顯示這個數量的內存,它永遠不會下降。
事實上,我會假設我的簡單應用程序不超過20MB,mabye 30MB。
我比較堆與年齡差異與Eclipse MAT 4小時的堆轉儲,我沒有看到對象的任何顯着增加。注:我添加了-XX:+HeapDumpOnOutOfMemoryError
選項,但我必須等待5-7天,直到它再次發生。我希望在你幫助我解釋我的電話號碼時儘早找到問題。
謝謝 schube
將JVM的參數添加到問題中。堆棧內存分配(-Xss),初始堆大小(-Xms),最大堆大小(-Xmx)等。請記住,Java進程的總內存不僅僅是其堆大小。此外,您不必等待幾天JVM就會在OutOfMemoryError上崩潰 - 只需減小堆大小,並且它應該發生得更快。然後查看堆棧跟蹤,因爲它可能會提供有關代碼中分配失敗的線索。 – vempo
您是否嘗試使用像JVisualVM這樣的工具來觀看實時更改?虛擬機內部的哪部分內存不斷增加? – cyberbrain
謝謝!我添加了JVM參數。是的,我可以在之前引發OutOfMemory錯誤,你是對的。但如果可能的話,我想在發生問題之前找到問題。由於這是一臺遠程機器,因此我無法使用JVisualVM。感謝所有的投入!! – schube