问题标签 [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 - 如何查找 Java 内存泄漏
如何在 Java 中找到内存泄漏(例如,使用 JHat)?我试图在 JHat 中加载堆转储以进行基本查看。但是,我不明白我应该如何找到根引用(ref)或任何它被称为的东西。基本上,我可以说有几百兆字节的哈希表条目([java.util.HashMap$Entry 或类似的东西),但地图到处都在使用......有什么方法可以搜索大地图,或者也许找到大对象树的一般根?
[编辑] 好的,到目前为止我已经阅读了答案,但我只是说我是一个便宜的混蛋(这意味着我对学习如何使用 JHat 比为 JProfiler 付费更感兴趣)。此外,JHat 始终可用,因为它是 JDK 的一部分。当然,除非 JHat 除了蛮力之外别无他法,但我不敢相信会是这样。
此外,我认为我无法实际修改(添加所有地图大小的日志记录)并运行它足够长的时间让我注意到泄漏。
java - 为什么 jhat 的 -baseline 选项不起作用?
为什么每个对象似乎都被标记为新对象,而不仅仅是第二个快照中的对象,而不是我的基线快照中的对象?在网上环顾四周,我看到一些建议我需要使用 hprof 而不是 jmap 来进行内存转储,但似乎 hprof 以完全相同的格式生成转储。
这是 JDK 1.6.0_14;我在 Windows 和 UNIX 上都试过了。
java - 类class[B在Java中代表什么?
我在这里尝试了一个工具 jhat 来测试我的 java 内存使用情况。它读入一个堆转储文件并将信息打印为 html。但是,表格显示如下:
那些 [B [C 等类是什么?
java - 仅在堆转储中查找新对象的 OQL?
有谁知道仅在堆输出中查找新对象的 OQL 语法?我找不到关于 OQL 选项的好的文档,sun 甚至有一个仅新输出的示例,没有生成它的查询的示例语法。我所做的是
- 使用 jhat 创建了一组堆
- 使用 jmap -baseline 为它们提供服务,它将不在两个堆中的对象标记为“新”。
- 浏览 jhat
- 抓头
java - 将大型 hprof 加载到 jhat
我有一个 64 位 JVM 使用该-XX:-HeapDumpOnOutOfMemoryError
选项转储的 6.5GB Hprof 文件。我把它放在一台 16GB 的 64 位机器上,并试图将它放入 jhat,但它总是内存不足。我曾尝试传入 jvm args 以获得最小设置,但它拒绝任何最小值,并且似乎在达到最大值之前内存不足。
内存不足的 jvm 会转储一个如此大的堆,以至于无法将其加载到具有两倍内存的盒子上,这似乎有点愚蠢。有没有办法让这个运行,或者可能摊销分析?
java - OQL 查询以查找从会话中引用的给定类的所有实例和子实例
我正在尝试使用 jhat/OQL 来跟踪我们的 Tomcat 容器中的内存泄漏。我想问的问题是:
“向我展示可从 javax.servlet.http.HttpSession 访问的 foo.bar.Cacheable 类的所有实例(和子实例)”
我设法想出了以下内容,但这没有显示foo.bar.Cacheable的子类(这很重要,因为这实际上是一个接口)。
我尝试了以下概念的各种排列,但不断收到错误(未定义“foo”)。
谁能帮我解决我在通过 OQL 提出这个问题时做错了什么?
java - 如何使用 jhat 分析堆转储
我在堆转储上运行了 jhat,它生成了报告。我如何使用报告来分析堆。除了实例计数之外,我无法完全理解。有没有这方面的参考资料或案例研究。简而言之,我需要继续前进,我该怎么做?
还有什么是对象查询语言。
memory-management - 是否有任何用于生产应用的基本 gc 生成大小和比率
年轻代的初始大小应该是多少?-XX:+NewRatio 应该是多少?-XX:+生存率?perm 和 old generation 的比例应该是多少?
java - 识别未收集垃圾的对象的更好方法?
简而言之
我有一个程序随着时间的推移逐渐使用越来越多的内存。我正在使用 jmap 和 jhat 来尝试诊断它,但还没有完全到位。
背景
该程序是一个长期运行的服务器,由一个 hbase 数据存储支持,为一堆其他东西提供节俭服务。但是,运行几天后,它最终会达到分配的堆限制,并且几乎所有时间都花在垃圾收集上。似乎引用在某处保留了很多数据
到目前为止我所做的
在摆弄了一些 jstat 和 jconsole 之后,我最终使用正在运行的进程的 jmap 进行 heapdumps,并通过 jhat 运行它,并且简单的数字加起来不会接近内存利用率
jmap -F -dump:live,format=b,file=heap.dump 12765
jmap -F -dump:format=b,file=heap.all 12765
直方图顶部的一些东西
虽然这里的总数没有加起来,但在进行堆转储时,该进程使用了超过 1gb 的内存。
直接明显的罪魁祸首似乎是我将 HBase Result 和 KeyValue 条目留在了整个地方。试图追踪参考资料,我最终击中了
需要帮助:
似乎没有引用这个最终的 HBaseCLient$Call 对象(或任何其他类似的对象,每个对象都包含一千个左右的键值及其所有内部数据)。它不应该得到GCed吗?我是否只是误解了 gc 的工作原理或 jhat 将在多大程度上验证引用?如果是这样,我还能做些什么来追踪我的“丢失”记忆?我可以采取哪些其他步骤来追踪这一点?
java - JHAT 无法分析内存转储
我有一个内存转储文件,JHAT 给出以下消息,我无法分析任何内容(因为没有显示数据。
这是否意味着 hprof 文件不完整或损坏?
我
-XX:+HeapDumpOnOutOfMemoryError"
在我的 tomcat 中使用选项。