2009-07-27 43 views
20

我的Java應用程序通過運行「java -jar j.jar」進程運行另一個Java應用程序。已知J.jar根據給定的數據集使用很多內存,並且經常會得到一個OutOfMemoryError堆。所以我想在它上面使用-Xmx,這樣我可以分配儘可能多的內存(或接近)。我正在考慮在系統上獲取全部內存,然後在-Xmx中指定80-90%。Java -Xmx,系統上的最大內存

有沒有解決我的問題?而且,我的解決方案聽起來如何?

編輯:我無法減少內存消耗,因爲正在使用的內存是由Java的內置pack200壓縮,我用它來打包一些JAR文件。

+3

所以你其實是問如何使用Java來確定系統內存量? – 2009-07-27 21:54:54

+0

是的,這將是一個可能的解決方案,如果你知道一種方式,知道,將不勝感激。 – 2009-07-27 21:59:33

+0

你在運行64位jvm嗎?如果你運行的是32位的話,那麼如果你的空閒內存變成7G,你會遇到'80%'的問題,例如 – 2009-07-28 03:15:18

回答

4

根據您的操作系統,這可能爲獲得自由和可用的內存大小工作:

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean; 
long freeMemory = sunmxbean.getFreePhysicalMemorySize(); 
long availableMemory = sunmxbean.getTotalPhysicalMemorySize(); 

從那裏,你可以計算出80-90%,與你想要的最大內存大小啓動您的罐子。

我不知道這適用於所有操作系統(即Windows),但它在我用OSX和Linux進行測試時工作正常。

0

嗯,我可以告訴你的一件事就是不要讓你的應用程序靠近填滿內存。 Java應用程序根本不會優雅地交換。我認爲由於垃圾收集,Java不斷從交換中抽取內存。

我遇到了一個死鎖問題,我認爲系統詢問java的內存會導致GC並將內容從交換文件中提取出來 - 此時系統會一直旋轉,直到我重置爲止。

這是很多內存和很多交換空間(當時)和一個較舊的Java虛擬機,所以你的里程可能會有所不同。

此外,根據您如何啓動其他應用程序,您可能必須爲您的應用程序指定-Xms而不是另一個應用程序。如果你給它一個完整的命令,給它一個-Xms,但如果你只是在jar中調用主類,那麼你的應用需要-Xms。 (哦,你指定了,是的,你需要將它傳遞給你正在調用的「Java」命令。)

0

是否有你使用操作系統在jar中執行程序的原因?如果你不需要它在你的應用程序的一個單獨的進程中執行,你可以直接從你的代碼中調用main方法,然後用你想要的任何-Xmx來啓動你的應用程序。

0

如果您還沒有這樣做的話,你需要通過一個內存分析器來運行程序。您可能會發現某些數據結構不會被丟棄,即使它們不再被使用。

的JProfiler是非常漂亮,但是你可以使用HPROF,這是Java 5中引入得到同樣的信息:http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

還要記住,不同的平臺有不同的最大堆大小,基於架構(32位位與64位),操作系統,甚至JVM。

如果您有很多可重用的值(例如您從XML文件讀取的字符串),則可以通過合併對象來大幅減少內存需求。

13

在32位窗口上,-XmX的限制是-Xmx1500m。共享庫會阻礙更大的堆。 您需要大約2Gb的RAM才能做到這一點。

在非windows操作系統上,你可以做得更大,而64位JVM可以做得更多。

Windows XP不會讓你擁有超過3Gb的RAM(不關心你是否擁有4Gb物理,從XP SP3開始) Vista可能與YMMV不同。

我已經在64位Linux上的64位JVM上試過了-Xmx4000M,這很好。考慮到我擁有6Gb的物理內存,這並不是一個很大的要求。

你80%的想法很有趣,但是我的測試系統運行的百分比要高於沒有不良影響的百分比。 (只要你不嘗試做其他事情)。

另一個評論者是正確的,調出你的JVM的內存映像並不是很快。 後來JVM的是在做這個不太亂七八糟更好的(但他們有更好的垃圾收集器太)

如果不能降低內存消耗 - 我知道這有多難 - 然後有大量的物理內存和分配最的。

相關問題