Java 堆转储:如何通过 1. io.netty.buffer.ByteBuf Util 2. byte[] 数组查找占用内存的对象/类

2023-11-22

我发现我的一个 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在命令行中,我创建了一个堆转储并将其上传到堆英雄 and Eclipse 内存分析器工具。在这两篇文章中我发现了以下内容:

1.总浪费内存为:64.69MB (73%)(查看下面的屏幕截图)

enter image description here

2。其中,34.06MB 被占用Byte [] array and LinkedHashmap[](查看下面的屏幕截图),我在整个项目中从未使用过它。我在我的项目中搜索过但没有找到。

enter image description here 3. Following 2 large objects taking 32 MB and 20 MB respectively.

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 或 buffer 匹配的内容。

现在我的问题是我怎样才能减少这种内存泄漏 or 如何找到确切的内存消耗对象/类/变量这样我就可以减少堆大小。

我知道很少有专家会要求源代码或类似的东西,但我相信从堆转储中我们可以查找内存泄漏或内存中可用的活动对象。我正在寻找该选项或任何可以减少堆转储的选项!

过去三周我一直在研究这个问题。任何帮助,将不胜感激。 谢谢你!


首先启用JVM 本机内存跟踪器通过添加标志来了解内存的哪一部分正在增加-XX:NativeMemoryTracking=summary。根据文档,存在一些性能开销 (5-10%),但如果这不是问题,我建议即使在生产中也启用此标志来运行 JVM。

然后您可以使用检查值jcmd <PID> VM.native_memory(这个答案写得很好:Java 本机内存使用情况)

如果确实分配了一大块本机内存,则很可能是由 Netty 分配的。

您如何在 AWS 中运行您的应用程序?如果它在 Docker 镜像中运行,您可能会偶然发现这个问题:什么会导致 java 进程大大超出 Xmx 或 Xss 限制?如果是这种情况,您可能需要设置环境变量MALLOC_ARENA_MAX如果您的应用程序使用本机内存(Netty 就是这样做的)并在具有大量内核的服务器上运行。 JVM 完全有可能为 Netty 分配了这些内存,但没有任何理由释放它,因此它看起来只会继续增长。

如果你想控制Netty可以分配多少本机内存,可以使用JVM标志-XX:MaxDirectMemorySize为此(我相信默认值与Xmx)并降低它,以防您的应用程序不需要那么多内存。

JVM 内存调整是一个复杂的过程,当涉及本机内存时,它会变得更加复杂 - 正如链接的答案所示,它并不像简单地设置Xms and Xmx标记并期望不再使用内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 堆转储:如何通过 1. io.netty.buffer.ByteBuf Util 2. byte[] 数组查找占用内存的对象/类 的相关文章

随机推荐

  • Hive - LIKE 运算符

    我不知道如何处理这个问题 这是我的数据 Table1 Table2 BRAND PRODUCT SOLD Sony Sony ABCD 1233 Apple Sony adv 1233 Google Sony aaaa 1233 IBM A
  • 角度 2 贝宝

    我正在使用 Angular 2 和 Firebase 建立一个新的电子商务项目 我的问题是如何集成贝宝按钮 当客户点击它时 他们将被重定向到贝宝并付款 然后重定向回我的网站 目前 我设法让他们回来 要么按照这个 github 存储库中的指示
  • gnuplot 多条线,X 轴上有时间

    我已经查看了问题 但仍然无法正常工作 我的数据集是这样的 date cpu mem 23 00 39 21 9 2 1 23 00 44 21 8 2 1 23 00 49 21 8 2 1 23 00 54 21 8 2 1 23 00
  • 虚拟函数的Vtable如何工作

    我对虚拟表有一个小疑问 每当编译器遇到类中的虚拟函数时 它都会创建Vtable并将虚拟函数地址放在那里 对于其他继承的类 也会发生类似的情况 它是否在每个类中创建一个指向每个 Vtable 的新指针 如果不是 当创建派生类的新实例并将其分配
  • 我可以使用IdUDPClient发送M-SEARCH请求吗?

    我的网络中几乎没有 uPNP 设备 我正在尝试向网络发送 M SEARCH 请求 并希望收到一些响应 这就是我正在尝试的 var sIP sOut string iPort Word S TStringBuilder begin S TSt
  • 在 Bootstrap 中打开放大图像模式

    我如何open enlarge使用 jquery js 的模式中的图像和不是数据属性 每当用户将图像插入内容编辑器时 我都需要它可单击以使用 js 在模式中展开 因此我不能依赖用户输入他们不知道如何使用的数据属性 我试过 a href my
  • 解析 EDGAR 文件

    我想使用 python2 7 删除 EDGAR 文件中非文档文本的任何内容 可在线获取 txt 文件 这些文件的示例如下 Example EDGAR 从该文件的第 48 页开始提供其文档类型定义 DTD 我的程序的第一部分将 txt 文件从
  • R 中计算 R2(R 平方)的函数

    我有一个包含观察数据和建模数据的数据框 我想计算 R2 值 我期望有一个可以调用的函数 但找不到 我知道我可以自己编写并应用它 但我是否遗漏了一些明显的东西 我想要类似的东西 obs lt 1 5 mod lt c 0 8 2 4 2 3
  • ALSA:防止扬声器欠载的方法

    我正在非交错模式下播放单通道音频 当我将音频数据写入扬声器时 我遇到了问题 ALSA lib pcm c 7339 snd pcm recover underrun occurred 我是这样写的 printf d snd pcm avai
  • 使用存储过程的 Azure documentdb 批量插入

    您好 我正在使用 16 个集合插入大约 3 400 万个 json 对象 每个对象 5 10k 我正在使用存储过程来插入这些文档 我有 22 个容量单位 function bulkImport docs var collection get
  • 平台设备从何处获取名称

    我正在阅读关于围绕总线 设备和驱动程序构建的 Linux 设备模型 我能够了解一些有关设备和驱动程序匹配如何发生的信息 但不清楚总线在这里的作用 总线如何与设备匹配 我对平台设备从何而来还有一个疑问 平台总线只是将每个设备的名称与每个驱动程
  • CompilationRelaxations.NoStringInterning 实际上是如何工作的?

    我在演示 NoStringInterning 时遇到问题 assembly System Runtime CompilerServices CompilationRelaxations System Runtime CompilerServ
  • LINQ 中的*右*外连接

    可以肯定地说 LINQ 中不存在右外连接这样的东西吗 我知道要有效地创建一个 您只需交换左外连接中的表即可 但是您可以将 DefaultIfEmpty 方法应用于等值联接左侧的表以使其成为右外联接吗 经过广泛查找 我找不到任何涉及右外连接的
  • 使用策略模式在 C# 上实现类似多参数 C++ 模板的行为

    我正在尝试使用 C 泛型和基于策略模式的 C 模板来实现这个答案 这是该模式的示例 interface ISomePolicy
  • 我的 C/C++ 应用程序如何确定 root 用户是否正在执行该命令?

    我正在编写一个需要 root 用户权限才能执行的应用程序 如果由非 root 用户执行 它将退出并终止并显示错误消息 例如 pthread getschedparam Operation not permitted 我想让该应用程序更加用户
  • Python 中的切片是如何工作的

    Python 是如何实现的切片表示法工作 那就是 当我写这样的代码时a x y z a a 2 等等 我如何理解哪些元素最终出现在切片中 请在适当的地方添加参考文献 See Why are slice and range upper bou
  • switch 的替代语法

    嘿 PHP 中的 switch 语句有一种替代语法 但此代码不起作用 div div Newspage div div Forum div div 解析错误 语法错误 意外的T INLINE HTML 期待 path to file 行中的
  • mysqli出现问题怎么办?类似 mysqli_fetch_array() 的错误:参数 #1 必须是 mysqli_result 类型等

    在我的本地 开发环境中 MySQLi 查询执行正常 但是 当我将其上传到我的网络主机环境时 出现以下错误 致命错误 在 中的非对象上调用成员函数bind param 这是代码 global mysqli stmt mysqli gt pre
  • Javascript 文件无法在 github 页面上运行 [重复]

    这个问题在这里已经有答案了 我能够在本地计算机上加载我的 javascript 文件 但在 github 页面上 它不起作用 我已将该文件包含在 index html 中 该网站是https abhikulshrestha22 github
  • Java 堆转储:如何通过 1. io.netty.buffer.ByteBuf Util 2. byte[] 数组查找占用内存的对象/类

    我发现我的一个 Spring Boot 项目的内存 RAM 消耗 日益增加 当我将 jar 文件上传到 AWS 服务器时 它占用了 582 MB 的 RAM 最大分配的 RAM 为 1500 MB 但是每天 RAM 都会增加 50MB 到