我有一个非常奇怪的问题.我正在开发一个基于Eclipse Equinox的OSGi应用程序; 它是使用OSGi Log Service(Equinox实现)开发的,现在我正在使用Apache Felix OSGi Log Service实现进行测试.
在API /代码方面,一切正常:OSGi日志服务是标准的,所以我可以毫无问题地从Equinox交换到Felix.
但是,我观察到了这种奇怪的行为:我启动了应用程序作为控制台程序,在控制台上查看日志输出,并将其附加到JVisualVM以分析内存使用情况; JVisualVM图显示了一个80 MB的已用堆.
13个小时后,平均堆大小达到220 MB,所以我决定分析堆转储,并按下"堆转储"按钮:在此操作之后,JVisualVM图显示使用的堆为20(分钟)-35 (最大)MB(?!?!),这个值是常数.
"堆转储"操作可以释放近200 mbs吗?如果是,为什么?
我从未在Equinox OSGi Log Service实现中看到这种行为,所以我怀疑Felix Log涉及这个问题......
谢谢
全部,我的应用程序在websphere app server 7.0上运行.我得到了一些核心转储和跟踪文件,如
core.20110909.164930.3828.0001.dmp
和
Snap.20110909.164930.3828.0003.trc.
我的问题是,就像WAS生成的线程转储可以由IBM-Thread Dump Analyzer工具打开和分析一样
是否有工具可以由IBM或任何其他人打开上述文件?
谢谢,阿尤斯曼
我想编写一个程序(最好用java)来解析和分析java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经可以这样做(jhat、eclipse 的 MAT 等),但我想从我的应用程序的特定角度来分析堆。
在哪里可以阅读有关堆转储文件的结构、如何读取它的示例等等?搜索了一下没有发现什么有用的东西...
非常感谢。
使用 Oracle 的 Hotspot JVM,它看起来jmap -dump:file=/tmp/dump.txt <pid>
可以用来进行堆转储。
但是,Eclipse OpenJ9 不包含该jmap
工具 - 如果您尝试将常规jmap
与 OpenJ9 的 jvm 一起使用,则会出现异常:
Exception in thread "main" java.lang.ClassCastException: com.ibm.tools.attach.attacher.OpenJ9VirtualMachine incompatible with sun.tools.attach.HotSpotVirtualMachine
at java.lang.ClassCastException.<init>(java.base@10.0.2-adoptopenjdk/ClassCastException.java:71)
at sun.tools.jmap.JMap.executeCommandForPid(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:128)
at sun.tools.jmap.JMap.dump(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:192)
at sun.tools.jmap.JMap.main(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:110)
Run Code Online (Sandbox Code Playgroud)
那么,如何使用 OpenJ9 进行堆转储呢?
我遇到过这样一种情况,突然发生很长的 GC 暂停,我需要找出突然内存分配的根源是什么。长时间的 GC 暂停(大约 30 秒)会导致 pod 连续多次 K8s 健康检查失败,并且 pod 会重新启动,而实际上并没有发生 OOM。我想在 K8s 实际重新启动 pod 之前创建堆转储。我意识到应该对某些外部持久安装进行转储。
我对如何导致堆转储发生的唯一想法是使用 preStop 挂钩。问题是,pod因健康检查失败而重启时,preStop钩子是否会被触发?
也许有一个更优雅的解决方案?
当 java 进程出现 OOM 且 pod 重新启动时,我需要保留堆转储。
我在 jvm 参数中添加了以下内容
-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dumps
Run Code Online (Sandbox Code Playgroud)
...并且emptydir安装在同一路径上。
但问题是,如果 Pod 重新启动并且它被安排在不同的节点上,那么我们就会丢失堆转储。即使 pod 被安排到不同的节点,如何保留堆转储?
我们正在使用 AWS EKS,并且我们有超过 1 个 Pod 副本。
有人可以帮忙解决这个问题吗?
amazon-web-services heap-dump kubernetes persistent-volumes amazon-eks
如果只能为 JVM 分配 1.5GB,是否有分析大型 Java 堆转储 (2GB) 的工具?我不敢相信转储必须完全加载到内存中才能进行分析...
Eclipse MemoryAnalyzer 失败,IBM 工具也失败。
我现在需要在这里使用命令行工具吗?
当触发未捕获的异常时,我尝试生成堆转储。我尝试使用 jmap,但是因为发生异常时该过程已完成,所以这是不可能的。
使用 UncaughtExceptionHandler 也不行,因为我只有执行的程序的二进制文件。
谁能帮我?
编辑:重要的是该技术可通过命令行或类似方式使用,因为我需要自动化。不能使用 GUI
我希望能够从命令行触发Android堆转储.那是否有命令?
具体来说,从命令行,而不是通过Montior或DDMS GUI
也许就像使用ddms或adb,例如ddms -head-dump
或adb shell heapdump
?AFAICT监视器和ddms始终以GUI模式启动,而adb没有堆转储命令.
更新:我试过这个,看起来很有希望,但它不起作用:
adb jdwp
adb forward tcp:8000 jdwp:1234
(1234的替换输出1)jmap -dump:format=b,file=heapdump.hprof localhost:8000
但即使堆摘要失败:
jmap -heap localhost:8000
Attaching to remote server localhost:8000, please wait...
Error attaching to remote server: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketTimeoutException: Read timed out
Run Code Online (Sandbox Code Playgroud) 我有一个应用服务器堆转储 (hprof) 的实例。如何使用 visualvm 或任何其他工具检查泄漏的文件描述符?
我确实通过运行检查了正在使用的文件描述符
sudo lsof | grep java | wc -l
Run Code Online (Sandbox Code Playgroud)
当我运行以下 OOQL 时,我会得到一个 FileDescriptors 列表
select x from java.io.FileDescriptor x
Run Code Online (Sandbox Code Playgroud)
但是如何使用堆转储分析来查找滥用类?
heap-dump ×10
java ×8
jvm ×3
kubernetes ×2
amazon-eks ×1
analyzer ×1
android ×1
coredump ×1
hprof ×1
jvisualvm ×1
memory ×1
openj9 ×1
websphere-7 ×1