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

标签 java memory ffmpeg ram visualvm

我的 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
  • 最佳答案

    我部分解决了这个问题,部分感谢 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 是 Autoclosable 的所有潜在类,并且我们在实例时每次调用 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();
    

    关于Java 进程使用的内存比 VisualVM 显示的多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68335074/

    相关文章:

    ffmpeg - 如何更高效地使用 FFMPEG 对 50 个 H264 流进行转码?

    unix - 添加/叠加两个wav文件

    java - 应用程序需要很长时间才能终止

    java - 快速排序 Q : Finitely many distinct keys

    c - 函数中分配的内存会发生什么情况?

    c - mex 函数执行时间的巨大差异取决于内存分配的位置

    audio - FFmpeg - 连接音频 - 视频?

    java - 在 Android 中更改 Switch 的颜色

    java - sbt汇编上的Java OutOfMemoryError

    c++ - 堆上整数 vector 和释放内存