Java进程使用的内存比VisualVM显示的要多



我的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();

最新更新