2010-01-07 127 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应用程序崩溃(由于内存不足),控制器和其他应用程序仍在运行。

(这一点,如果应用程序和控制器完全解耦只会工作 - 否则,只增加堆大小,并尽快处理所有媒体,你不需要它了从内存泄漏,防止)