2011-02-04 114 views
8

我們有一個web應用程序部署在tomcat服務器上。我們運行了一些預定的工作,然後堆內存達到峯值並穩定下來,一切似乎都很好。 但是系統管理員抱怨說,內存使用量(Linux上的「最高」)持續增加,計劃的作業越多。 堆內存和CPU的內存之間的關係是什麼?它可以通過任何JVM設置進行控制嗎?我使用JConsole來監控系統。
我強制通過JConsole進行垃圾回收,並且堆使用率降低,但Linux上的內存使用率仍然很高,並且從未降低。進程內存vs堆 - JVM

任何想法或建議將有很大的幫助?

+0

該服務器顯然是一個64位服務器。 – user546352 2011-02-04 00:02:28

+0

您是否知道服務器正在運行的JVM以及強制垃圾回收後的堆內存使用情況和實際內存使用情況之間的區別? – 2011-02-04 00:06:56

+0

>>但是Linux上的內存使用率仍然很高,並且從未減少。 <<哪個是「內存使用情況」?GC通常不喜歡將內存返回給系統。 – bestsss 2011-02-04 00:43:08

回答

4

可能觀察到的是虛擬大小而不是Java進程的駐留集大小?如果您的目標是佔用空間很小,則可能需要而不是包括-Xms或JVM堆參數上的任何最小大小,並將70%-XX:MaxHeapFreeRatio=調整爲較小的數量以允許更積極的堆收縮。

同時,提供關於Linux內存永不減少的評論的更多細節?什麼指標?

0

您可以使用-Xmx和-Xms設置來調整堆的大小。使用tomcat,你可以在開始之前設置一個環境變量:

export JAVA_OPTS=」-Xms256m -Xmx512m」 

這最初創建一個256MB的堆,最大大小爲512MB。

更多的細節: http://confluence.atlassian.com/display/CONF25/Fix+ +誤差+「+內存已滿] +」以+增加+提供+記憶

8

由JVM進程分配的內存是不一樣的堆大小。所使用的堆大小可能會下降,而不會實際減少JVM分配的空間。 JVM必須收到一個觸發器,指示它應該縮小堆大小。正如@Xepoch提到的,這由-XX:MaxHeapFreeRatio控制。

但是,系統管理員抱怨說,內存使用率(Linux上的'最高')持續增加,計劃的作業越多[運行]。

這是因爲你很可能有某種內存泄漏。當系統管理員看到進程緩慢咀嚼越來越多的空間時,往往會抱怨。

任何想法或建議會有很大的幫助嗎?

你看過線程數?你的應用程序是否創建了自己的線程並將它們發送到死鎖並永遠等待? 您是否正在與可能正在使用JNI的任何第三方API進行集成?