2010-01-07 122 views
1

我有一個主類包含5個按鈕,每個鏈接到一個程序/包。每個軟件包運行一個jmf程序,從網絡攝像頭捕獲圖像,並且還從文件加載大約15個圖像。OutOfMemoryError

加載的第一個程序(不管我按哪個按鈕)始終正常運行。但是當我在第一個程序結束後運行程序時,java.lang.OutOfMemoryError:java堆空間發生。

我不知道如果java不能處理我們所有的圖像,或者如果它與jmf圖像捕獲有關。

回答

1

你給你的JVM有多少內存?您可以使用以下方法給它更多:-Xmx1024m(對於1GB,根據需要進行調整)

這假定您的程序中沒有內存泄漏。我對JMF一無所知,這只是針對Out of Memory錯誤的一般建議。

3

也許你應該對你的JVM提供更多的內存(-Xmx512m在命令行上可能是一個良好的開端),

那麼,如果解決了這個問題,調查爲什麼你的程序會消耗這麼多的內存。

使用太陽診斷工具如jvisualvm可能會有幫助。

2

增加Java最大內存並重新運行。如果你仍然看到OOM,你可能會泄漏。要增加最大內存,請在命令行中追加-Xmx<new heap size>m

實施例:

java -Xmx1024m Foo 
0

的JVM用提供給他們一個有限的量的最大存儲器中運行。這有點違反常理,會讓很多人出門(我想不出許多類似的環境)。

您可以通過指定

java -Xmx128m ... 

或類似的增加最大內存JVM需要。如果你事先知道你要消耗的內存量,使用

java -Xms128m ... 

以指定JVM將在啓動分配內存。請注意0​​與-Xmx

0

嘗試檢查,如果您仍然有一些引用可以阻止第一個程序包/程序被垃圾收集。

當啓動程序檢測到第一個程序已結束時,將所有對第一個程序的引用以及可能從其中檢索到的對象設置爲NULL,以允許JVM再次回收內存並準備好第二次啓動。

0

默認情況下,Java使用64 MB的堆空間。其他建議(將堆空間增加到512M或1024M)的替代方法是爲控制器和5個應用程序啓動單獨的JVM。然後,如果您的一個JMF應用程序崩潰(由於內存不足),控制器和其他應用程序仍在運行。

(這一點,如果應用程序和控制器完全解耦只會工作 - 否則,只增加堆大小,並儘快處理所有媒體,你不需要它了從內存泄漏,防止)