我有一个主类包含5个按钮,每个按钮链接到一个程序/包。每个包运行一个jmf程序,从网络摄像头捕获图像,它还从文件加载约15个图像。
要加载的第一个程序(无论我按哪个按钮)始终正确运行。但是当我在第一个程序结束后运行程序时,会出现 java.lang.OutOfMemoryError:java heap space 。
我不确定java是否无法处理我们的所有图像,或者它是否与jmf图像捕获有关。
答案 0 :(得分:3)
也许你应该为你的JVM提供更多内存(命令行上的-Xmx512m可能是一个好的开始),
然后,如果它解决了问题,请调查你的程序消耗这么多内存的原因。
使用jvisualvm等阳光诊断工具可能会有所帮助。
答案 1 :(得分:2)
增加Java最大内存并重新运行。如果你仍然看到OOM,你可能会有泄漏。要增加最大内存,请将-Xmx<new heap size>m
附加到命令行。
示例:
java -Xmx1024m Foo
答案 2 :(得分:1)
您为JVM提供了多少内存?您可以使用以下内容进行更多操作:-Xmx1024m
(1GB,根据需要进行调整)
这假设您的程序中没有内存泄漏。我对JMF一无所知,这只是Out of Memory错误的一般建议。
答案 3 :(得分:0)
JVM以可用的有限数量的最大内存运行。这有点违反直觉,让很多人吵闹(我想不出很多类似的环境)。
您可以通过指定
来增加JVM所需的最大内存java -Xmx128m ...
或类似的。如果您事先知道要消耗这么多内存,请使用
java -Xms128m ...
指定JVM在启动时分配的内存。请注意-Xms
vs -Xmx
!
答案 4 :(得分:0)
尝试检查一下,如果你还有一些参考文件可以防止第一个软件包/程序被垃圾收集。
当启动程序检测到第一个程序已经结束时,将对第一个程序的所有引用和从它检索到的对象设置为NULL,以允许JVM再次回收内存并准备好第二次启动。
答案 5 :(得分:0)
默认情况下,Java使用64 MB的堆空间。替代其他建议(将堆空间增加到512M或1024M)是为控制器和5个应用程序启动单独的JVM。然后,如果您的某个JMF应用程序崩溃(由于内存不足),控制器和其他应用程序仍在运行。
(这只有在应用程序和控制器完全解耦时才有效 - 否则,只需增加堆大小并在不再需要时立即处理所有介质以防止内存泄漏)