2012-04-26 66 views
0

操作系統正在運行10個虛擬機JVM。事實上,大多數什麼都不做 - 只是不時地做一份工作。 每個進程分配600MB的系統內存。我知道實際上最多可以使用100 MB。每個這些進程剩餘的500 MB是由JVM(OldGen等)管理的內存。不幸的是,我的系統只有2GB的內存,因此大部分內存分配到了交換區。這意味着,當到達其中一臺機器的時候 - 第一個,swap會被讀到系統內存幾十秒。GC運行後是否可以使用Sun JVM將內存釋放到系統?

完成任務後,有什麼辦法強制JVM向操作系統釋放內存嗎?例如,GC每隔1-5分鐘運行一次,結果進程內存已經釋放到系統中。

我使用的是:Linux的x86_64的SMP,Java的熱點(TM)64位服務器VM 1.6.0

+1

我認爲這是一個重複: http://stackoverflow.com/questions/324499/java-still-uses-system-memory-after-deallocation-of-objects-and-garbage-collecti – 2012-04-26 13:41:36

+0

作爲精密:我從來沒有找到有關這個主題的具體規範,但我已經看到(在Linux上)由進程釋放的內存(但不是很多)。 – 2012-04-26 13:43:13

+0

爲什麼你需要單獨的JVM來完成這些任務 - 爲什麼你不能僅僅使用一個短暫的任務被啓動到一個線程池(使用java.util.concurrent的ExecutorService構造)呢? – kittylyst 2012-04-27 03:03:43

回答

0

這意味着,在時機成熟時對機器之一 - 第一,交換是讀到系統內存幾十秒。

內存頁面只有在訪問時才交換。如果您所說的500MB從JVM的角度來看確實是「免費的」,那麼它們不會最終被換入.JVM觸及內存的原因必然存在。一種可能性是它不是真的免費,但包含活的對象。

我會建議:

  1. 使用內存分析器(YourKit或VisualVM的)看到了JVM的實際內存使用情況。
  2. 可能調整堆的大小-Xmx
0

我不是性能問題方面的專家,但讓我試着幫助您解決這個問題。

有一個對System.gc()的垃圾回收系統的調用。如果您參考系統(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html)的官方文檔,它會告訴您這個方法運行垃圾收集。不過,如果你諮詢互聯網(如When does System.gc() do anything),你會看到這個調用可能會調用垃圾收集系統。我的個人經歷與該職位一致。

由於內存管理是自動化的,所以垃圾收集系統將轉到卓越的程度,爲您做好管理內存的工作。管理算法非常高效,試圖智勝他們通常不會給你帶來很好的結果。

你說過大多數機器什麼都不做 - 因此,爲什麼不「殺」它們並在你有工作時開始一個新的?這不會更有效嗎?

+0

哦,是的!這很好,但我忘記說流程有內部觸發器 - 而不是外部觸發器。所以JVM必須運行,因爲沒有其他人知道什麼時候觸發:-) – Max 2012-04-26 13:58:43

相關問題