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[] 数组查找占用内存的对象/类 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • .NET 内存不足故障排除

    在阅读了几篇有关 NET 技术中的内存的启发性文章后 Out of Memory 不是指物理内存 https learn microsoft com en us archive blogs ericlippert out of memory
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 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 到