当前位置: 首页 > 知识库问答 >
问题:

jmap live堆转储如何包含无法访问的对象?

阴宏爽
2023-03-14

我使用jmap使用CMS GC转储应用程序的实时堆:

jmap -dump:live,format=b,file=heap.hprof <pid>

我用YourKit打开了这个转储,它发现8Gb堆的61%是不可访问的,特别是

Objects unreachable from GC roots, but not yet collected 126963949 5149290840 5149290840

我以为使用-dump:live意味着它只包含可访问的对象?

总司令。应用程序的日志文件可疑地缺少由我调用jmap引起的任何完整GC,而是在我进行转储的两侧显示以下行:

2019-07-17T09:32:59.808+0200: 33177.365: [GC (GCLocker Initiated GC) 2019-07-17T09:32:59.808+0200: 33177.365: [ParNew: 233127K->230550K(3397376K), 0.0265604 secs] 8029404K->8026859K(18496896K), 0.0267558 secs] [Times: user=0.92 sys=0.03, real=0.03 secs] 
2019-07-17T09:34:43.807+0200: 33281.363: [CMS-concurrent-preclean: 3.165/105.760 secs] [Times: user=143.74 sys=12.71, real=105.76 secs] 

在堆转储完成后第一次CMS重置后的第一个ParNew集合中,我看到堆的大小大致与堆转储中的大小相同(大约3-4Gb):

2019-07-17T09:34:55.850+0200: 33293.407: [GC (GCLocker Initiated GC) 2019-07-17T09:34:55.850+0200: 33293.407: [ParNew: 3264332K->260834K(3397376K), 0.0435628 secs] 6814726K->3811241K(18496896K), 0.0438372 secs] [Times: user=1.45 sys=0.04, real=0.05 secs] 

所以也许在这种情况下,jmap没有触发完整的气相色谱?这可能/可配置吗?

共有2个答案

顾超
2023-03-14

2015年有一份bug报告称,年轻一代并没有被-dump:live收集。我想这种行为没有改变。

鲁英卫
2023-03-14

这看起来确实出乎意料。

您可以尝试使用jcmd

这是新推荐的堆转储方法,默认情况下将强制执行完整的GC。请参阅oracle文档:

GC.heap_dump[备选案文][论点]

生成Java堆的HPROF格式转储。

影响:高-取决于堆大小和内容Java。除非指定了-all选项,否则请求完整的GC。

 类似资料:
  • 问题内容: 如何Foo从Java访问包对象中包含的对象? 问题答案: 也许从Scala 2.8.1开始,这已经发生了变化,但是该提议不起作用。您必须使用。 对于对象,方法等,它有所不同。考虑到scala类: 您可以访问foo,bar而baz在Java中,如: 当我试图弄清楚这一点时,我以为我们遇到了麻烦,因为Scala生成了一个名为的类,当然您不能在Java中导入该类。幸运的是,我们只需要pack

  • 问题内容: 我们的Java EE应用程序已开始遇到一些严重问题。具体来说,应用程序在启动后的几分钟内最多可运行99%的旧堆栈。没有抛出OOM,但实际上JVM没有响应。jstat显示老一代的大小根本没有减小,没有垃圾收集正在进行,并且kill -3表示: VM选项包括: (为了解决此问题,我将其从拥有2300m堆/ 1800m新一代设备中更改了) 一旦JVM进入“内存不足”状态(永久保存),就对它进

  • 问题内容: 我有一个JavaScript对象,看起来像这样: 我可以访问轻松使用或其他属性。但是,我无法正确访问的语法。我没有运气就尝试了以下方法: 问题答案: 使用ECMAscripts的“括号表示法”: 您可以以任何一种方式使用该表示法,即进行阅读和书写。

  • 问题内容: 我有一个 DOM元素: 有两个ID 和的字段..。我可以访问,没有任何问题,但是由于名称中包含句点,导致语法错误而失败。 如何访问这些属性? 问题答案: 使用方括号表示法: 这适用于任何对象,对于非标识符安全的字符以及访问你可能提前都不知道的键特别有用。

  • 问题内容: 我想遍历数组中包含的对象并更改每个对象的属性。如果我这样做: 控制台应该调出数组中的每个对象,对吗?但实际上,它仅显示第一个对象。如果我在循环外控制台记录阵列,则所有对象都会出现,因此肯定还有更多对象。 无论如何,这是下一个问题。如何使用循环访问数组中的Object1.x? 这将返回“未定义”。循环外的控制台日志再次告诉我,所有对象都具有“ x”的值。如何在循环中访问这些属性? 建议我

  • 我正在尝试使用java堆转储来帮助调查内存泄漏。每当我使用它时: 堆转储文件到达大约16,048 kb并停止增长,jmap将永远运行并且不会停止,除非我杀死它。或者我尝试使用它: 但由于我是从根目录执行它的,并且该过程是从另一个用户运行的,因此我得到了以下结果: 所以我想我的问题是我做错了什么,在尝试获得这个堆转储时,最好的方法是什么?