问题标签 [jhat]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - jhat 抛出无法识别的幻数
我正在尝试分析从遇到内存问题的 java 进程中提取的堆转储。转储是使用 jmap 进行的。我在转储文件上使用 jhat - 我得到
java.io.IOException: Unrecognized magic number: 169897589
at com.sun.tools.hat.internal.parser.Reader.readFile(Reader.java:94)
at com.sun.tools.hat.Main.main(Main.java:159)
jdk 1.6 和 1.7 都给出相同的错误。我在我的 Windows 机器上本地运行 jhat(在复制转储文件之后)并且转储文件是在 Linux 服务器上获取的。
任何想法我做错了什么?
java - 从 Java 堆转储中导出(或序列化)对象
我有一个(以前)正在运行的 Java 进程的堆转储。在进行转储时,进程挂起与另一台服务器通信。我希望能够重建我的应用程序提出的确切请求。
尽管我的客户端与 SOAP Web 服务通信,但模型对象恰好是Serializable
,所以我想做的是导出请求对象(Serializable
如果可能,使用它的形式),然后我可以轻松地重新导入该对象(只需反序列化它) 进入测试应用程序。
我的问题是我找不到从堆转储中导出对象的方法。我可以使用 找到有问题的对象,OQL
所以我知道它就在那里——我只是找不到任何工具可以提供任何方式从堆转储中获取对象。
由于我的课恰好是Serializable
我认为这将是最简单的。但是,如果我能以任何其他可解析的格式将其取出,我就可以通过编程方式重建该对象。
想法?
java - 如何在堆转储中查看程序变量名称和值?
我在执行 Java 程序时使用 JMAP 创建 JVM 的堆转储。然后使用 JHAT 我在浏览器中打开转储详细信息。
现在,我可以看到内存转储的许多细节,但我不知道如何简单地查看程序变量值及其值。你能在这里指导我吗?我只需要使用命令行来显示变量名称和值。
提前致谢!
java - 如何将 jmap/jhat 输出追溯到我的代码中导致 PermGen OutOfMemory 错误的行?
我正在使用 JBoss 7.1.3、JDK 1.6 和 Mac 10.9.1。在使用 Maven Jboss AS 插件对我的 WAR 文件进行多次部署/取消部署后,我的服务器因以下错误而死机……
但是当我访问结果页面http://locohost.mymachine.com:7000/(除了它说“localhost”而不是“locohost.mymachine.com”)时,输出完全难以辨认。例如,有很多行引用了我们编写的类
但是我如何将其追溯到导致这些 PermGen 错误的部分代码?
eclipse - Mat 打不开转储文件
我的jmap
命令是sudo -u flume /usr/java/jdk1.8.0_60/bin/jmap -F -dump:format=b,file=heap.hprof pid
,但是 eclips mat 无法打开转储文件,并抛出异常。
这是我的环境。
但是 jhat 可以正确分析它。
java - 即使提供 70 GB 的堆大小,JHAT 也无法分析 40 GB 的转储文件
我需要分析由应用程序创建的 40 GB 堆转储。我正在使用 jhat,我已经为 JHAT 分配了 70 GB 的内存来分析它,但它仍然抛出java.lang.OutOfMemoryError: Java heap space
任何人都可以提出解决办法吗?
java - 有什么方法可以分析截断的 Java 堆转储(hprof 文件)?
在我的工作中,我们遇到了一个难以重现的 OOM 问题。或者,更准确地说,它很容易在一个系统上重现,使该系统无法使用,但在给定相同输入的情况下很难在其他任何地方重现。
该应用程序正在使用服务包装器作为服务运行。我们确实设法更改了配置以通过在 OOM 上输出堆转储文件的选项来启动它,但不幸的是,它们被截断了,很可能是由于服务包装器在写入文件时超时并终止了进程。这很明显,因为最大内存设置为 1GB,而 hprof 文件小到 700MB,这对于 OOM 上的整个堆来说太小了。
额外配置包装器以使 java 进程有更长的时间来写出堆需要大量的跳跃,但我们正在使用以下两个选项来实现这一点:
问题是,我可以对截断的 hprof 文件做些什么有用的东西吗?Eclipse MAT 让他们窒息。Jhat 似乎加载了它们,但随后只显示了 3 个大小为 0 的 Java.Object 实例,没有别的。我试过YourKit,它不能写它的oids文件。
在我看来,这些文件中应该包含一些有用的、可访问的信息。有什么工具可以读取那里的内容吗?
感谢您的时间!
java - 从 jhat 中的 OQL 查询返回的对象与查询不匹配
Long
我们的团队有一个 Java 进程正在运行(在 64 位服务器 OpenJDK 1.8.0_171-b10 上),其中发生了一些关于(装箱)对象值的无法解释的事情。我们创建了一个堆转储来分析,jhat
这里发生了一些非常奇怪的事情。
jhat
运行后,我们发出以下 OQL 查询之一:
select l from java.lang.Long l where l.value.toString().equals("20180919141719600")
select l from java.lang.Long l where l.value == 20180919141719600
两者都会返回相同的三个对象。但是,当我们检查对象时,所有三个都有不同的值 invalue
并且它们都不等于20180919141719600
。
这本身就困扰着我们,也是我们问题的核心。
此外,我们可以使情况变得更有趣。似乎正在运行的 Java 代码使用实际值(正如我们在对象字段中看到jhat
的value
那样Long
),但在 JSON 序列化中除外,因为 REST 端点返回 value 20180919141719600
。这表明不知何故这两个值实际上都在内存中(和堆转储),并且不知何故 JSON 序列化(使用 Jackson)做了一些不同的事情,与jhat
运行 OQL 查询时所做的一致。
分析这种情况的下一步是什么?
java - 如何在我的 Java 应用程序中查找内存泄漏
这是我之前的问题HERE的后续问题。我目睹了我的 Java 应用程序中的内存泄漏。最初,我认为泄漏来自我的应用程序的服务器组件。但是按照别人的建议,没有。
我使用了一个工具来转储堆内存并使用JProfiler
. 显然是由于我的怀疑HashMaps
。但我不确定,因为我不熟悉如何解释转储。
这是我的应用程序结构的简短片段(它每 15 分钟缓存一些文本数据,以便快速检索服务器线程)。
导致泄漏问题的原因是什么?以及如何从下面的转储中识别它?显然我这样做的方式new Object()
并且HashMap.put()
有一些泄漏问题?!
第一个入门课程/主要课程。在这里,我启动了 7 个 main HashMaps
,每个将一个键(现在只有一个 - 最终将有 16 个键)映射到NavigableMap
大约 4000 个单行JSON
字符串的时间序列。
然后在 中Aggregation()
,我从 HTTP 资源中获取一些文本,将它们转换为 JSON 字符串,并将它们缓存在一些临时NavigableMaps
的 中,然后将它们放在 main 中HashMap
(因此刷新不会对服务器造成太大影响)。
java - jhat -baseline 功能不适用于 HeapDumpOnOutOfMemoryError 和 jcmd GC.heap_dump 生成的基线
我有一个突然的内存泄漏,它发生在相当瞬间,所以我必须使用 HeapDumpOnOutOfMemoryError 捕获转储。但是要查看真正导致这种巨大内存峰值的原因,我需要先获取一个基线,然后我会使用jcmd $pid GC.heap_dump baseline.hprof
它。当创建崩溃堆转储时,我说jhat -baseline baseline.hprof java_pid1234.hprof
我没有正确减去基线,是否添加 -baseline 选项没有区别。输出说它做了减法:
但这没有区别!这是为什么?在此处报告的 10 年前的问题中 为什么 jhat 的 -baseline 选项不起作用?它说有关使用 jmap 生成的堆转储的内容不兼容,但我没有使用 jmap。
有什么方法可以调用与此 HeapDumpOnOutOfMemoryError 用于创建基线的代码完全相同的代码吗?
我想我会尝试触发这个内存转储两次。但这很不方便,而且 [更新] 这甚至不起作用!此内存转储仅创建一次。我创建了这个函数:
当我运行它时,它会这样做:
但我第二次称它为:
所以这让我卡住了!
PS:请不要告诉我有关 Eclipse 或其他 IDE 的信息,我基本上是在无头运行。
更新:我仍然想知道为什么会这样,因为它很烦人。但我给自己写了一个解决方法:
这是有效的,因为它使用 OutOfMemory 也使用的相同 dumpHeap 函数。
另一个更新:这似乎有效,但出于我的目的,它仍然不起作用。Windows 上的 Oracle Java 1.8。这非常令人沮丧。所有这些工作我一无所获。我仍然在 jhat 直方图中看到所有基线数据。