Java 堆被无法访问的对象淹没

2024-04-18

我们的 Java EE 应用程序开始出现一些严重问题。具体来说,应用程序在启动后几分钟内就运行了高达 99% 的老年代堆。不会抛出 OOM,但实际上 JVM 没有响应。 jstat 显示老年代的大小根本没有减少,没有垃圾收集正在进行,并且kill -3 说:

Heap
 PSYoungGen      total 682688K, used 506415K [0xc1840000, 0xf3840000, 0xf3840000)
  eden space 546176K, 92% used [0xc1840000,0xe06cd020,0xe2da0000)
  from space 136512K, 0% used [0xe2da0000,0xe2da0000,0xeb2f0000)
  to   space 136512K, 0% used [0xeb2f0000,0xeb2f0000,0xf3840000)
 PSOldGen        total 1536000K, used 1535999K [0x63c40000, 0xc1840000, 0xc1840000)
  object space 1536000K, 99% used [0x63c40000,0xc183fff8,0xc1840000)

虚拟机选项有:

-Xmx2300m -Xms2300m -XX:NewSize=800m -XX:MaxNewSize=800m -XX:SurvivorRatio=4 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=4 

(我将其从 2300m 堆/1800m 新一代更改为尝试解决问题)

一旦 JVM 进入“内存不足”状态(持续很长时间),我就对 JVM 进行堆转储,并在其上运行 Eclipse Memory Analyzer。

结果很有趣。大约 200Mb 被各种对象占用(有些对象比其他对象拥有更多),但其余的 1.9Gb 都是无法访问的(可能值得注意的是,大部分被 GSON 对象占用,但我不认为这是任何事情的指示,只是说我们在服务器操作期间搅动了大量 GSON 对象)。

有什么解释可以解释为什么虚拟机有这么多无法访问的对象,并且根本无法收集它们吗?

JVM:

$ /0/bin/java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
Java HotSpot(TM) Server VM (build 20.12-b01, mixed mode)

当系统到达这个停顿状态时,以下是详细 GC 不断打印的内容:

922.485: [GC [1 CMS-initial-mark: 511999K(512000K)] 1952308K(2048000K), 3.9069700 secs] [Times: user=3.91 sys=0.00, real=3.91 secs] 
926.392: [CMS-concurrent-mark-start]
927.401: [Full GC 927.401: [CMS927.779: [CMS-concurrent-mark: 1.215/1.386 secs] [Times: user=5.84 sys=0.13, real=1.38 secs] (concurrent mode failure): 511999K->511999K(512000K), 9.4827600 secs] 2047999K->1957315K(2048000K), [CMS Perm : 115315K->115301K(262144K)], 9.4829860 secs] [Times: user=9.78 sys=0.01, real=9.49 secs] 
937.746: [Full GC 937.746: [CMS: 512000K->511999K(512000K), 8.8891390 secs] 2047999K->1962252K(2048000K), [CMS Perm : 115302K->115302K(262144K)], 8.8893810 secs] [Times: user=8.89 sys=0.01, real=8.89 secs] 

SOLVED

正如 Paul Bellora 所言,这是由于在太短的时间内在 JVM 中创建的对象数量过多造成的。此时调试变得相当乏味。我最终所做的是,使用自定义 JVM 代理来检测类。该检测将对方法和构造函数调用进行计数。然后检查计数。我发现一个不起眼的单个操作会创建大约 200 万个对象,并触发某些单独的方法大约 150 万次(不,没有循环)。与其他操作相比,该操作本身的速度较慢。您也可以使用任何热点分析器(例如 VisualVM),但我在这些方面遇到了各种麻烦,所以最终编写了自己的热点分析器。

我仍然认为 JVM 的行为是一个谜。看起来垃圾收集器陷入停滞,并且不会再清理任何内存,但内存分配器希望它这样做(因此不会抛出 OOM)。相反,我希望它能够清除所有无法访问的内存。但应用程序的行为也不会好多少,因为无论如何大部分时间都会花在垃圾收集上。

我用来寻求帮助的代理可以在这里找到:https://github.com/veselov/MethodCountAgent https://github.com/veselov/MethodCountAgent。它距离一个完美的软件还很远。


有什么解释可以解释为什么虚拟机有这么多无法访问的对象,并且根本无法收集它们吗?

(根据我们在评论中的交流)听起来这不是传统的内存泄漏,而是一些不断向新对象发送垃圾邮件的逻辑,使得 GC 在当前架构下难以跟上。

例如,罪魁祸首可能是某个多次发出的 API 请求,或者“卡在”某种错误状态,如我描述的无限分页场景。这两种情况归结为数百万个响应 gson 对象(指向Strings(指向char[]s)) 被实例化,然后有资格进行 GC。

正如我所说,您应该尝试隔离问题请求,然后进行调试并进行测量,以确定这是否是您的应用程序或其库之一的错误或可扩展性问题。

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

Java 堆被无法访问的对象淹没 的相关文章

  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

    我最近需要使用GC 添加内存压力 http msdn microsoft com en us library system gc addmemorypressure aspx令我感到奇怪的是 它不接受添加内存压力的对象作为参数 我认为因为它
  • 将 emoji 替换为适当的 java 代码

    我正在开发一个简单的java程序 它可以接受这样的字符串 停止 你违反了 法律 但是现在 你 并将每个表情符号替换为适当的 java 字符 我不知道该怎么称呼他们 这是一个例子 汽车表情符号 将替换为 uD83D uDE97 这允许我有一个
  • Java - 同步方法导致程序大幅减慢

    我正在尝试了解线程和同步 我做了这个测试程序 public class Test static List
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • WebSocketStompClient 将无法连接到 SockJS 端点

    我正在尝试新的 从版本 4 2 开始 java STOMP 客户端支持 我的出发点是入门指南 使用 WebSocket 构建交互式 Web 应用程序 http spring io guides gs messaging stomp webs
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ

随机推荐

  • Android 上的 Pyzbar 不读取 QR 码,但读取条形码

    我一直在使用 pyzbar 开发一个 kivy 应用程序 在需要读取条形码和 QR 码的 Android 上运行 该应用程序可以读取我电脑上运行的条形码和 QR 码 但在使用使用 buildozer 构建的 apk 时无法读取 QR 码 但
  • 使用 PDF 框旋转 pdf 内容而不旋转页面或 PDF

    我正在使用 PDFBOX 1 8 目前 如果 PDF 处于横向模式 则将其旋转为纵向模式 如下所示 public static byte rotatePDF byte inputPdf throws Exception PDDocument
  • 如何获取当年的总周数?

    我在 stackoverflow 上得到了下面的代码 它返回当年的总周数 但它是硬编码的 在 2014 年和 2016 年不起作用 我如何动态获取当年的总周数 Calendar cal Calendar getInstance cal se
  • Javascript Google Maps API 和非被动事件处理程序

    最近 Chrome 开始发出以下警告 违规 向滚动阻塞 touchmove 事件添加了非被动事件侦听器 考虑将事件处理程序标记为 被动 以使页面响应更快 看https www chromestatus com feature 5745543
  • 当应用程序在 Firebase 后台运行时如何处理通知

    这是我的清单
  • has_many 与总活跃记录

    class Product lt ActiveRecord Base belongs to category has many order items dependent destroy end class OrderItem lt Act
  • 以编程方式嵌入 Java h2 数据库

    目前我们使用HSQLDB http www hsqldb org 作为嵌入式数据库 但随着数据量的增长 我们会寻找内存占用更少的数据库 德比 JavaDB http developers sun com javadb 目前不是一个选项 因为
  • 如何从年、月、日获取日期对象?

    当我使用以下代码时 Date对象错误 Date date new Date day getYear day getMonth day getDay 谁能告诉我如何从年 月 日的值中获取日期对象 您可以使用Calendar类来实现这一点 pu
  • 宏 $(VCTargetsPath) 到底在哪里定义的?

    我们之前有过讨论 https social msdn microsoft com Forums vstudio en US e04e7791 c0c4 4598 b900 310878f5af45 how can i locate and
  • 我们可以更新 Amazon S3 中特定文件的内容吗?

    我正在使用AWS PHP SDK 我将 JSON 文件上传到 S3 存储桶 现在我想获取文件内容 上传到S3存储桶 向抓取的文件内容添加一些附加文本并通过 S3 存储桶更新该文件 我想要的是这样的 文件名 userlist json 使用
  • wagtail 中的嵌套类别/InlinePanel

    我很难实现 嵌套类别 之类的东西 PageA Cat1 SubCat1 SubCat2 Cat2 SubCat1 所有类别和子类别都应可由编辑排序和编辑 我的猜测是这样的 class CategoryTestPage Page conten
  • lucene:如何添加不重复的文档

    就我而言 插入 lucene 索引的每个文档都有其唯一的 ID 当向lucene索引添加新文档时 如果该文档已经存在于索引中 则不应将该文档插入到索引中 如何实施这一战略 我想我应该先用docId搜索文档 如果lucene找不到该文档 那么
  • 如何在 Android 上对 XML 进行编码?

    我需要将 XML 文档编码为一种格式 该格式将作为字符串 即条带标签 通过 XML 解析器 然后我需要再次解码它 并且我需要在 Android 上执行此操作 我正在寻找的 Android API 中的库 类是什么 Thanks XmlSer
  • 运行我的应用程序时,Java 运行时环境检测到致命错误

    我在运行程序时遇到以下错误 并且无法弄清楚解决方案是什么我还查看了具有类似错误的所有主题 但无法解决我的问题 这里的错误 我的应用程序是基于 Groovy 和 Grails 版本 2 0 4 构建的 A fatal error has be
  • 使用 bash 通过 ssh 启动进程,然后在 sigint 上终止它

    我想使用 ssh 在不同的机器上启动几个作业 如果用户随后中断主脚本 我想优雅地关闭所有作业 这是我正在尝试做的事情的一个简短示例 bin bash trap aborted SIGINT SIGTERM aborted kill SIGT
  • 每个键的填充数据帧和累积度量 Pandas

    我有以下数据框 import pandas as pd before padding pd DataFrame data user id 1 1 1 1 2 2 3 days past 1 2 3 4 2 3 2 pay 11 12 13
  • tesseract (v3.03) 输出为 PDF [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么会返回这个错误呢 root amd 3700 2gb ocr test tesseract l dan pdf png out pd
  • 无法加载动态库'C:\php\ext\php_pthreads.dll'

    我试图在我的 php 代码中添加线程 但我无法理解pthreads库 每次运行程序时都会遇到此错误 Warning PHP Startup Unable to load dynamic library C php ext php pthre
  • 通过多种方法进行 Spring JPA 事务

    我在 Tomcat 7 中运行的 Web 应用程序中使用带有 JPA 和 Hibernate 4 的 Spring 3 2 该应用程序分为控制器 服务和 DAO 类 服务类在类和方法级别具有带注释的事务配置 DAO 是普通的 JPA 带有通
  • Java 堆被无法访问的对象淹没

    我们的 Java EE 应用程序开始出现一些严重问题 具体来说 应用程序在启动后几分钟内就运行了高达 99 的老年代堆 不会抛出 OOM 但实际上 JVM 没有响应 jstat 显示老年代的大小根本没有减少 没有垃圾收集正在进行 并且kil