我有一个Java应用程序,我从控制台运行,然后控制台执行另一个Java进程.我想获得该子进程的线程/堆转储.
在Unix上,我可以做一个kill -3 <pid>但是在Windows AFAIK上获取线程转储的唯一方法是在控制台中使用Ctrl-Break.但这只会让我转移父进程,而不是孩子.
有没有另一种方法来获得堆转储?
我已经从我的java应用程序生成了一个堆转储,它已经使用该jmap工具运行了几天- >这导致了一个大的二进制堆转储文件.
如何在IntellIJ IDEA中对此堆转储执行内存分析?
我知道有Eclipse和Netbeans的工具,但如果可能的话我宁愿使用IDEA.
分析的基本结果将告诉我每个类在内存中每个对象的实例数,以便我能够开始调试内存泄漏.
我需要检查我的应用程序是否有内存泄漏,我还需要查看我的应用程序的内存分配.我下载并安装了eclipse内存分析器,看起来第一步是打开堆转储.但什么是堆转储,我如何创建堆转储.我将如何使用这个软件,我做了一些谷歌搜索,但我找不到任何有用的信息谢谢
在尝试从正在运行的Java进程中获取堆转储时,我得到了这个Stacktrace.导致这种情况的原因以及如何进行正确的堆转储?
Dumping heap to dump.bin ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: java.lang.InternalError: Metadata does not appear to be polymorphic
at sun.jvm.hotspot.types.basic.BasicTypeDataBase.findDynamicTypeForAddress(BasicTypeDataBase.java:278)
at sun.jvm.hotspot.runtime.VirtualBaseConstructor.instantiateWrapperFor(VirtualBaseConstructor.java:102)
at sun.jvm.hotspot.oops.Metadata.instantiateWrapperFor(Metadata.java:68)
at sun.jvm.hotspot.memory.DictionaryEntry.klass(DictionaryEntry.java:71)
at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:66)
at sun.jvm.hotspot.memory.SystemDictionary.classesDo(SystemDictionary.java:190)
at sun.jvm.hotspot.memory.SystemDictionary.allClassesDo(SystemDictionary.java:183)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClasses(HeapHprofBinWriter.java:942)
at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:427)
at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:62)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:83)
... 6 more
Run Code Online (Sandbox Code Playgroud)
环境:CentOS 64位,Java OpenJDK运行时环境(内置1.8.0_31-b13)OpenJDK 64位服务器VM(内置25.31-b07,混合模式)
Usign ps看到所使用的Java版本:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/jre/bin/java
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/bin/jmap -dump:format=b,file=dump.bin 14984
Run Code Online (Sandbox Code Playgroud)
这让我:
14984: Unable …Run Code Online (Sandbox Code Playgroud) 是否有任何工具允许.hprof文件的离线分析(包括摘要/排序/筛选)?或者你可以在批处理模式下运行VisualVM,hat等吗?
我对可以输入.hprof文件,处理它并生成报告的内容感兴趣.
我假设您需要传递一系列选项来配置报告,所以如果您知道任何有用的提示,请称重.
最好是可编写脚本的,这样我就可以一次运行一堆.
我有java堆内存的一个问题.我在java中开发了一个客户端服务器应用程序,它作为Windows服务运行,需要超过512MB的内存.我有2GB的RAM,但是当我运行我的应用程序时,它会引发异常
内存不足错误:java堆空间
但我已经在java控制面板中设置了堆大小(最大512MB),我仍然得到相同的错误.我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,所以如何增加默认堆大小?
每个人都知道可以从正在运行的JVM获取堆转储.另一种可能吗?我们可以使用堆转储启动JVM吗?
我很长一段时间都在考虑这个问题.如果这是可能的话,它将解决大量时间并使支持工程师的思维变得容易.如果我们必须重新创建客户面临的一些罕见问题,它可以帮助您节省大量时间.[想象一下底层硬件和Java运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置].
补充说明:执行此操作的意图不是在OOM发生时,而是在JVM启动后的任何给定点.
我有几个Java进程,我正在尝试管理发生OOM错误时创建的堆转储.当我说管理我的意思
使用时将堆转储到OOM上
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
Run Code Online (Sandbox Code Playgroud)
JVM在指定的/ tmp文件夹中创建一个名为java_pidXXXX.hprof的文件(其中XXXX是进程的PID).无论如何要指定一种不同的格式,其中PID和DATE用于创建文件名?谷歌搜索了一个小时后,我尝试了myPrefix_ $,{pid},'date'等.唯一有效的两件事是
如果\ tmp文件夹不存在,则不会创建它,也不会创建堆转储.
可以使用的一个想法是在OOM错误上添加命令
-XX:OnOutOfMemoryError="doSomething.sh %p"
Run Code Online (Sandbox Code Playgroud)
但我试图避免它,因为我需要部署"doSomething.sh"
我试图分析一直让我疯狂数周的内存泄漏,我发现了eclipse MAT工具可以帮助你弄清楚什么是错的,问题是我发现的每一个教程都说我需要转换格式从dalvik到HPROF格式的文件 ,但是我找不到一个单独的教程解释了如何实际做到这一点,而是我得到了这样模糊的东西
现在您将获得的文件不符合"标准"Sun .hprof格式,但是以Dalvik自己的格式编写,您需要将其转换为:
hprof-conv heap-dump-tm-pid.hprof 4mat.hprof
这究竟意味着什么?我点击什么?我要去哪?我完全迷失和沮丧,任何帮助都会走很长的路,谢谢.