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