我的java应用程序工作约1天,(我使用不同的库来处理照片,如ffmpeg、javacv、javacpp(然后我发现我的应用程序使用了9.5 GB的RAM。
系统监控工具
我不明白为什么我的应用程序占用这么多内存。
我设置-Xmx6G
在VisualVM中,我看到堆空间大小为188M
visualVM 中的堆空间
元空间使用141M
visualVM 中的元空间
这可能有助于
visualVM 中分配的字节
我读过一些文章,Java使用的RAM比堆空间多,因为有JIT、堆空间、元空间、代码、蚂蚁等。但9.5Gb是我脑海中的很多
编辑:
- 是的,我的应用程序有时会出现异常java.lang.OutOfMemoryError:java堆空间
我部分解决了这个问题,部分感谢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();