Java 堆转储 : How to find the objects/class that is taking memory by 1. io.netty.buffer.ByteBufUtil 2. byte[] 数组

标签 java spring-boot out-of-memory heap-dump java-heap

我发现我的一个spring boot项目的内存(RAM消耗)一天天增加。当我将 jar 文件上传到 AWS 服务器时,它占用了 582 MB 的 RAM(最大分配的 RAM 为 1500 MB),但每天,RAM 增加了 50MB 到 100 MB,而今天 5 天后,它占用了 835 MB .目前该项目有 100-150 个用户,并且正常使用 Rest API。
由于 RAM 的增加,有几次应用程序出现以下错误(从日志中发现的错误):

Exception in thread "http-nio-3384-ClientPoller" java.lang.OutOfMemoryError: Java heap space
所以为了解决这个问题,我发现通过使用 JAVA Heap Dump,我可以找到占用内存的对象/类。所以通过使用 Jmap在命令行中,我创建了一个堆转储并将其上传到 Heap HeroEclipse Memory Analyzer Tool .在他们两个中,我发现了以下内容:
1. 总浪费内存是:64.69MB (73%)(检查下面的截图)
enter image description here
2 .其中,34.06MB 被 Byte [] array 占用。和 LinkedHashmap[] (检查下面的截图),我从未在我的整个项目中使用过。我在我的项目中搜索了它,但没有找到。
enter image description here
3 .以下 2 个大对象分别占用 32 MB 和 20 MB。
1. Java Static io.netty.buffer.ByteBufUtil.DEFAULT_ALLOCATOR

2. Java Static com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.connectionFinalizerPhantomRefs` 
enter image description here
所以我试图找到这个netty.buffer。在我的项目中,但我没有找到任何与 netty 或缓冲区匹配的内容。
现在我的问题是 我怎样才能减少这种内存泄漏 如何找到确切的内存消耗对象/类/变量 这样我就可以减少堆大小。
我知道很少有专家会要求提供源代码或任何类似的东西,但我相信从堆转储中我们可以查找内存泄漏或内存中可用的 Activity 对象 .我正在寻找那个选项或任何减少这个堆转储的东西!
过去 3 周我一直在研究这个问题。任何帮助,将不胜感激。
谢谢!

最佳答案

从启用 JVM native memory tracker 开始通过添加标志 -XX:NativeMemoryTracking=summary 来了解内存的哪一部分正在增加.根据文档 (5-10%) 有一些性能开销,但如果这不是问题,我建议即使在生产中也启用此标志来运行 JVM。
然后您可以使用 jcmd <PID> VM.native_memory 检查值(这个答案中有一篇很好的文章:Java native memory usage)
如果确实分配了大量 native 内存,则很可能是由 Netty 分配的。
您如何在 AWS 中运行您的应用程序?如果它在 Docker 镜像中运行,您可能会偶然发现这个问题:What would cause a java process to greatly exceed the Xmx or Xss limit?
如果是这种情况,您可能需要设置环境变量 MALLOC_ARENA_MAX如果您的应用程序使用 native 内存(Netty 这样做)并在具有大量内核的服务器上运行。 JVM 完全有可能为 Netty 分配此内存,但没有看到任何释放它的理由,因此它似乎只会继续增长。
如果要控制 Netty 可以分配多少 native 内存,可以使用 JVM 标志 -XX:MaxDirectMemorySize为此(我相信默认值与 Xmx 相同)并降低它,以防您的应用程序不需要那么多内存。
JVM 内存调整是一个复杂的过程,当涉及到 native 内存时,它会变得更加复杂 - 正如链接的答案所示,它并不像简单地设置 Xms 那样简单。和 Xmx标志并期望不再使用内存。

关于Java 堆转储 : How to find the objects/class that is taking memory by 1. io.netty.buffer.ByteBufUtil 2. byte[] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68681786/

相关文章:

java - 启动 openday light netconf testtool 模拟器时出错

Java如何在窗口或JFrame的边框/周围放置一个按钮

java - 有人可以举一些关于 TypeIdentifier 的例子吗?

java - 原生堆android OOM硬件加速

c++ - 内存分配失败

java - Gradle项目中的IntelliJ IDEA编码问题

java - Spring MVC : how to intercept 404 before returning error page/response?

java - 在 ubuntu 服务器上启动 spring boot jar 的问题。启动 ApplicationContext 时出错

Java : Cannot send POST request to backend with Angular 5

安卓 ||位图图像的旋转