我有一個Java應用程序的問題。昨天,當我部署它進行測試時,我們注意到我們的機器開始交換,即使這不是一個真正的怪物應用程序,如果你知道我的意思。 無論如何,我檢查了頂部的結果,並看到它吃了大約100MB的內存(RES在頂部)我試圖分析內存,並檢查是否有內存泄漏,但我找不到一個。有一個未完成的PreparedStatement,我修正了,但沒有多大意義。 我試着設置最小和最大堆大小(有人說最小堆大小不是必需的),它沒有任何區別。Java高內存使用率
這是怎樣我現在運行它:
#!/bin/sh
$JAVA_HOME/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9025 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:MaxPermSize=40m -Xmx32M -cp ./jarName.jar uk.co.app.App app.properties
這裏是頂部結果:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16703 root 20 0 316m 109m 6048 S 0.0 20.8 0:14.80 java
我不明白,我最大配置和PermSize最大堆事情大小,總和達72mb。這就足夠了,應用程序運行良好。爲什麼它仍然在吃109mb的記憶和吃什麼?這是一個37mb的差異,這是相當高的比例。 (34%)。 我不認爲這是內存泄漏,因爲最大堆大小已設置,並且沒有內存不足錯誤或任何內容。
一個intertesting的事情可能是,我用VisualVM做了堆轉儲,然後用EclipseMAT檢查它,它表示在類加載器中可能存在泄漏。 這就是它說:
的類加載器/組件 「sun.misc.Launcher $ AppClassLoader @ 0x87efa40」 佔地9807664(64.90%)字節。內存是 積累的「短[] []」通過「」。關鍵詞sun.misc.Launcher $ AppClassLoader加載@ 0x87efa40
一個實例,我不能讓太多的這一點,但可能是有用的。
感謝您的幫助提前。
編輯
我發現這一個,也許有什麼我可以做... Tomcat memory consumption is more than heap + permgen space
我做了分析,正如我寫的,我不能發現任何問題。 –
將建議嘗試調整這些標誌:-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio。在http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html的「性能選項」 – Saurabh