问题描述
我的 Java 应用程序可以运行约 1 天, (我使用不同的库来处理照片,如 ffmpeg、javacv、javacpp) 然后我看到我的应用使用了 9.5Gb RAM。
我不明白为什么我的应用使用这么多内存。
我设置了 -Xmx6G
在 VisualVM 中我看到堆空间大小为 188M
元空间使用 141M
可能会有所帮助
我读过一些文章说 Java 使用的 RAM 多于堆空间,因为有 JIT、堆空间、元空间、代码、ant 等。但我想到了很多 9.5Gb
已编辑:
- 是的,我的应用有时会出现异常 java.lang.OutOfMemoryError: Java heap space
解决方法
我部分解决了这个问题,部分感谢 Samuel Audet 的评论。 (但无论堆空间使用稳定的 125M,元空间 100M 但 java 进程使用 1,4Gb)
所以问题出在我从视频中获取帧的代码中。
我的旧代码:
FFmpegFrameGrabber g = new FFmpegFrameGrabber(file);
Java2DFrameConverter bimConverter = new Java2DFrameConverter();
g.start();
Frame grab = g.grab();
BufferedImage imageFrame = bimConverter.convert(grab);
g.stop();
直到我检查了所有潜在的类,FFmpegFrameGrabber、Java2DFrameConverter、Frame 是可自动关闭的,并且我们需要在实例时每次调用 close() 时,我才想到。
并且在某些代码中没有关闭 InputStream ?
好的代码:
FFmpegFrameGrabber g = new FFmpegFrameGrabber(file);
Java2DFrameConverter bimConverter = new Java2DFrameConverter();
g.start();
Frame grab = g.grab();
BufferedImage imageFrame = bimConverter.convert(grab);
g.stop();
g.close();
bimConverter.close();
grab.close();