java - OutOfMemoryError 堆转储
问题描述
我有一个java.lang.OutOfMemoryError:GC Overhead limit exceeded
. 我的应用程序没有HeapDumpOnOutOfMemoryError
命令行选项。我需要一个堆转储,但是当我尝试使用jmap
或jcmd
工具捕获转储时,它们没有响应:
地图
D:\program>jmap -dump:live,format=b,file=d:\dump4.hprof 8280
Dumping heap to D:\dump4.hprof ...
指令
D:\program>jcmd 8280 GC.heap_dump d:\dump6.hprof
8280:
进程未完成,但已创建转储文件。当我用 VisualVM 打开它们时,它们会无限加载。
如果我捕获了例如 VisualVM 的堆转储,则工具成功完成并创建并打开转储。
你能解释一下为什么jmap
并且jcmd
没有完成吗?以及如何捕获OutOfMemoryError
异常的应用程序转储?应用程序仍在工作,但只有几个活动线程。
解决方案
这不是因为您的预期堆大小超过分配的堆大小。当 JVM 花费太多时间执行垃圾收集并且只能回收很少的堆空间时,会发生此错误。您的应用程序可能最终使用了几乎所有的 RAM,并且垃圾收集器花费了太多时间试图清理它并反复失败。
您的应用程序的性能会相对较慢,这是因为 CPU 正在将其全部容量用于垃圾收集,因此无法执行任何其他任务。
需要解决以下问题:
- 应用程序中占用大部分堆的对象是什么?
- 这些对象被分配在源代码的哪些部分?
您还可以使用自动图形工具,例如 JConsole,它有助于检测代码中的性能问题,包括 java.lang.OutOfMemoryErrors。
推荐阅读
- c# - LINQ C# 一个列表中的项目除外
- java - 使用 MVVM 和 Firestore 获取空对象引用
- python - Django url 路径渲染问题,
- python - 通过 Python Socket 发送许多对象
- c# - 运算符“+”不能应用于“字符串”和“无效”类型的操作数 C# WebMethod
- azure - 将 Pyspark 数据框保存到 Azure 存储
- sql-server - 使用 Codefluent Pivot Runner 升级数据库时出现错误“无法打开与 SQL Server 的连接”
- java - 如何解密使用此代码加密的文本?
- plugins - ckan.plugins.core.PluginNotFoundException: pdf_view 错误
- specflow - 在 Specflow+ 运行器和 SharedAppDomain 线程隔离中使用 Specflow 在每个线程之前和之后执行代码