【问题标题】:Java process use more memory than VisualVM showsJava 进程使用的内存比 VisualVM 显示的多
【发布时间】:2021-09-20 21:28:05
【问题描述】:

我的 Java 应用程序工作了 ~1 天, (我使用不同的库来处理照片,如 ffmpeg、javacv、javacpp) 然后我看到我的应用使用 9.5Gb RAM。

system monitoring tools

我不明白为什么我的应用会占用这么多内存。

我设置了-Xmx6G

在 VisualVM 中,我看到堆空间大小为 188M

heap space in visualVM

元空间使用141M

metaspace in visualVM

这可能有帮助

allocated bytes in visualVM

我读过一些文章说 Java 使用的 RAM 比堆空间多,因为有 JIT、堆空间、元空间、代码、ant 等。但 9.5Gb 是我的主要想法

已编辑:

  • 是的,我的应用有时会出现异常 java.lang.OutOfMemoryError: Java heap space

【问题讨论】:

  • 尝试在visualvm中玩垃圾收集,看看能释放多少。如果随着时间的推移缓慢增长,请使用 visualvm 中的分析器进行调查。
  • 请确保您使用的是最新版本,JavaCV 1.5.5。
  • 是的,我使用所有最新版本的库
  • 确保您在任何具有此类方法的对象上调用close()。如果没有足够快地释放任何内容,则可能会导致 Windows 上出现足够大的延迟,从而导致 OutOfMemoryError。

标签: java memory ffmpeg ram visualvm


【解决方案1】:

我部分解决了这个问题,部分感谢 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();

【讨论】:

猜你喜欢
  • 2018-01-24
  • 2014-04-13
  • 2014-02-18
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多