2012-05-25 145 views
1

我有一個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

回答

1

你嘗試使用JConsole的分析的應用程序http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html 否則,你也可以使用JProfiler的審判版本來描述應用程序 http://www.ej-technologies.com/products/jprofiler/overview.html?gclid=CKbk1p-Ym7ACFQ176wodgzy4YA

但是,檢查高內存使用情況的第一步應該是檢查您是否是我們在你的應用程序中收集對象,如數組,地圖,集合,列表等等。如果是,那麼檢查它們是否保留對象的引用(即使沒有使用)?

+0

我做了分析,正如我寫的,我不能發現任何問題。 –

+0

將建議嘗試調整這些標誌:-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio。在http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html的「性能選項」 – Saurabh

4

Java的內存包括

  • 的堆空間。
  • 燙髮區空間
  • 線程堆棧區。
  • 共享庫,包括JVM的共享庫(將被共享)
  • 的直接內存大小。
  • 存儲器映射文件大小(將被共享)

有可能是其他其是供內部使用。

鑑於37 MB的PC內存價值約20美分,我不會擔心它太多。 ;)

+0

中查看更多詳細信息如果每次我的計算機需要更多內存時我可以折騰20美分,我會是一個可憐的人...;) – brimborium

+0

我明白你的觀點,我擔心的一點是,運行這個應用程序的服務器有512 Mb的RAM,如果我運行這個應用程序,機器開始交換。因此,這37 MB的重要性在於,如果我能夠減少它,它會對我有所幫助。 –

+0

增加內存需要多少成本?那也能幫助你。 –