2012-02-03 158 views
2

我發現如果我的應用程序有很多可用內存,它會使用比需要更多的內存。我聽說這種行爲在所有Java應用程序中都很常見,但對我來說這是不可接受的。Java降低內存使用率

所以問題是我如何強制Java使用更少的內存?

我知道,我可以叫System.gc()每隔幾秒鐘手動,但它是正常的這樣做,還有沒有其他的方法呢?

P.S.我的應用程序在生產服務器上定期更新,我需要監視某些泄漏的內存使用情況等等(通常沒有泄漏,但是如果有人出現,我應該儘可能快地看到它),還需要預測時間當我應該升級我的硬件。如果jvm不可預測地改變記憶飢餓,所有這些事情都很難做到。所以我想的唯一一件事就是迫使JVM是在內存使用量預測的(如果用戶數量增加一倍的內存應該雙打太)

+1

現在可能是時候重新思考它爲什麼不可接受了。你能給出一個技術上的理由,還是這會讓你感到不舒服? – 2012-02-03 11:02:21

+0

也許你不應該在生產服務器上進行測試?只有當你知道沒有泄漏時才進行部署? – 2012-02-03 11:13:34

+0

這不是一個測試,當然我也有測試服務器,但它運行的負載不同 – tsds 2012-02-03 11:16:00

回答

3

聽說這種行爲是很常見的所有Java應用程序,但它不能接受我。

你是對的。 Java使用的內存比普通的行爲要少,它理論上可以避免。 「更糟糕的是,大多數JVM不會將內存送回操作系統......即使該內存已被GC釋放。

如果這對您不可接受,您不應該使用垃圾收集語言。使用C或C++。 (但是請注意,C/C++內存分配器能夠將內存提供給操作系統是不常見的,即使實現允許它也是如此。)


這樣做的好處是Java(實際上任何GC'ed語言)實際上運行得更好,如果你給它充足的內存。現代GC的工作效率更高,垃圾和非垃圾的比例增加,而更大的垃圾堆使這種情況發生。 (當然,你可以去太遠,特別是如果應用程序與其他的東西真正的內存競爭。)


(正如其他的答案說,呼籲System.gc()於事無補。它不會造成任何回憶內存,並且當垃圾級別對於高效操作而言太低時,您很可能會運行GC。)

7

你可以告訴它通過調用Java與-Xmx參數即使用更少的內存:

java -Xmx128M xxx 

將搭配128MB的運行最大值(by default in Java 6這是設置爲「物理內存或1GB的1/4的小」)

不要叫System.gc()所有的時間......這是你的時間你會浪費;-)

另外,你爲什麼要擔心這個?當Java的快要到它允許的最大內存,它會做一個GC掃反正

+0

不,我不能限制我的應用程序在內存中,因爲它幾個星期後會停止工作(這是一個服務器端應用程序和用戶數量增長,所以我需要儘可能多的內存,因爲我的服務器可以提供) – tsds 2012-02-03 11:02:42

+2

Don'不用擔心,那麼......它崩潰了嗎?如果是這樣,它可能是你的一部分內存泄漏,並沒有'System.gc()'的數量將修復... – 2012-02-03 11:06:29

+0

請看看我的問題的更新 – tsds 2012-02-03 11:12:42

3

首先你的可用內存將如何幫助,如果你調用System.gc()?並且調用System.gc()甚至不是一個好的選擇。如果你想要一個更積極的垃圾收集器,那就有相應的策略。 你應該做的,而不是與內存更少-Xmx

2

啓動它不,不行了。如果/當垃圾收集器將啓動時System.gc()不保證。更多的是,System.gc()可能會調用垃圾收集器來經常導致比運行應用程序花費更多的時間來進行垃圾收集。

的解決方案是確定的存儲器的最大量應用程序的需要(覆蓋區域)以及具有比足跡稍多存儲器啓動虛擬機。我在這裏假設你的應用程序沒有內存泄漏。