问题标签 [jmap]
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 - 如何解释“jmap -permstat”的输出?
我正在尝试解决 permgen 泄漏问题,并想就如何解释 jmap -permstat 的输出向你们征求意见。
假设我有一个 jmap -permstat 报告,如下所示:
以下是我对上述输出的解释——请纠正我在此过程中所犯的任何错误。
“类型”列中的值不是唯一的。我们看到一些对象出现了 3 次。但是,class_loader 的值在所有三个中都是唯一的;因此,它们中的每一个都是一个独特的对象,占据着永久空间。在本例中,每个占用 100 个字节;因此,300 字节的 permgen 空间被 SomeClassLoader 类型的对象占用。
如果 classes 值非零,则此对象必须是某种类加载器,这指的是它引用的类的数量。(注意:在实际文件中,这三个对象在字节列中都有零;我为这个例子添加了值。在实际实践中,我猜测如果类列中有 0,则没有办法bytes 值可以是除零以外的任何值。)
如果存活值为“dead”,则意味着对象已准备好进行垃圾回收,但 JVM 并未这样做。关于为什么会出现这种情况的原因需要单独讨论。
如果 parent_loader 列中有值,那么这是一个被另一个类加载器引用的对象,并且在该对象被垃圾回收之前不能被垃圾回收。
最后:1)如果我在报告中看到 500 行都列出了相同的类型,2)但它们列出了不同的 class_loader 值,3)那么我可以将字节列 4)中的值相加,这将准确地表示多少permgen 空间被该类型的对象占用。
它是否正确?谢谢!
java - 为什么 GC 不收集我的对象?
我有一个 java 程序,它不断调用java.util.zip
压缩/解压缩数据。它会在几秒钟内耗尽内存。我有一个内存转储,jmap
我正在查看它jhat
。
终结器摘要显示Total instances pending finalization: 0
。如果我理解正确,我没有任何对象 (1) 具有 finalize() 方法,(2) 已被 GC 标记并且 (3) 正在等待最终确定。这似乎很好。
当我查看特定对象时,对该对象的唯一引用是java.lang.ref.Finalizer
. Finalizer 对象是为每个具有 finalize() 方法的对象创建的,无论该对象是否被 GC 处理。所以看起来没有什么能阻止这个Deflater
对象被 GC 处理。
0x7f4aeb7a35d0 处的对象
java.util.zip.Deflater@0x7f4aeb7a35d0 的实例(51 字节)
对该对象的引用:
java.lang.ref.Finalizer@0x7f4aeb8607c8 (64 bytes) : 字段引用
程序在运行中被 暂停System.in.read()
。一段时间后内存使用量不会下降。
更新:
我应该说清楚。内存转储显示许多对象没有经过 GC,但没有其他对象(终结器对象除外)引用它们。我试图找出为什么他们没有被 GC'ed。
java - 无法将 coredump 转换为 hprof
我有一个 core.31690 文件,我想将其转换为 hprof。我试过了:jmap -dump:format=b,file=mydump.hprof /usr/bin/java core.31690
但我得到了以下信息:
我尝试在网上查找,但找不到任何东西。任何指针?
java - JMapFrame 和 GUI [Java]
好的,大家好,首先我将展示我所拥有的:
我有这个代码:
好吧,我的目标是这样的,同一个组织:
但我不知道该怎么办,这对我来说有点混乱,问题是图层,我不能把它放在地图的左边......希望你能帮助我把它放在更好的地方我的代码。
java - JMAP 转储大小为 4.5 GB。Eclipse MAT 显示总堆为 415 MB,我如何分析剩余的转储?
我正在使用 Tomcat 6 运行 Web 应用程序。我们使用的是开放式 JDK 6。我们的是 AMD 64 位 Ubuntu 11.04 服务器。
此命令进行内存转储
内存转储为 4.5 GB。当我们使用 eclipse MAT 分析它时,强可达对象为 80 MB,不可达对象为 335 MB..如何分析转储的其余部分..
此过程在我的服务器上占用的内存也是 4.5 GB。现在这个内存永远不会下降到 1 GB 的正常水平。然后这个内存慢慢增加到8-9 GB,然后我们的tomcat停止响应(实际上没有内存不足的错误)。
我的tomcat配置是
java - blazesds消耗大量内存
BlazeDS 4 用于与 Flex4.6 通信。当 flex 客户端在 blazeds 服务器上调用远程调用时,服务器返回一个包含 POJO 的 arrayList。假设每个 POJO 内存大小为 12 个字节,我期望 arrayList 大小为 12*元素数。然而,我发现在某处闪耀,它被复合了多次。假设我将 200000 个 POJO 添加到数组列表中,我预计它的大小约为 2MB。但是,我可以通过分析器看到,JVM 的大小是原始大小的 N 倍,并且同样的 N 倍 mem 也被传输到 flex 浏览器应用程序。下面列出的是演示问题的示例代码,带有 jmap 探查器捕获。如果需要,我也很乐意提供弹性代码。
而SampleClass类定义如下
内存在 jmap.exe 中进行了分析,它位于 jdk 路径中。在收到客户端请求之前,JVM 中的 intitail 内存约为 50MB。jmap 在客户端请求之前的输出。
num #instances #bytes 类名
1 63135 8497488 constMethodKlass
2 65671 7858440 [C
3 91344 5217976 symbolKlass
。
.
total 658429 50097416 //JVM中的初始内存
处理请求后 jmap 的输出。
num #instances #bytes 类名
1 11402 20225512 [B
2 200000 1948809 SampleClass //预期为 ~2MB
3 62734 8451040 constMethodKlass
。
.
total 1175132 93938272 //在 JVM 中消耗了未被垃圾回收的内存。
奇怪的是,当我反复尝试从 Flex 调用相同的方法时,JVM 内存并没有相应增加。这只是 JVM 中第一次出现多倍增长。但是,每次调用时,flex 客户端应用程序内存都会不断增加。
我什至尝试在 YourKit 分析器上运行相同的程序,并尝试多次调用 GC 都是徒劳的。
有人可以让我了解 blazeds 中发生了什么。
java - 老年代对象的统计?
是否有任何工具可以查看不同代 JVM 堆的对象统计信息?我正在调查潜在的内存泄漏,需要不同代的一些数据。我的用例是在老年代的对象上拍摄快照,等待,然后再拍摄另一个快照进行比较。
JVisualVM 提供了有关已创建对象的统计信息,但这对我没有多大帮助,因为我看不到特定对象的提升或使用速度是否比应有的更快。
Jmap 提供不同代的统计信息,但不是基于对象。在那个工具中我只能看到老一代正在增长......
java - jmap中显示的“From Space”和“To Space”是什么意思?
我了解 new gen / old gen / perm gen 之间的区别,但我不知道“To Space”和“From Space”是什么。我看到我的“From Space”使用率达到 99.8%,而“To Space”似乎总是保持在 0% 的使用率。
java - 如何在java中使用jmap分析堆转储
我正在使用以下命令创建堆转储:
我已经打开了生成的文件 -DumpFile.txt
但它不是可读格式。所以请让我知道如何分析生成文件中的数据。
java - Java 内存泄漏总是会出现在老一代的消费中吗?
我一直在调试我被告知的“内存泄漏”,但是比较坏构建和好构建的旧 gen 图,它们看起来几乎相同。将其称为不是内存泄漏是否安全,还是我可能会遗漏其他东西?