我有一个JVM进程的Windows内存转储(DMP)文件。IsthereanywayIcanuseJavatoolingtodoaheapanalysisofthis?TheSDKtools(jhatetc.)don'tseemtohelp-theyallseemtoexpectaJavaheapdump.(我有很多Windbg经验,但在Java调试方面我是一个完全无知的人)这个类似的问题:DumpfileanalysisofJavaprocess?对此没有答案。 最佳答案 参见myotheranswer恰好涵盖了如何从Window
我有一个在AmazonEC2上运行的应用程序(使用S3、DynamoDB等多种AWS产品)并且存在内存泄漏。我收集了一些堆转储并通过Eclipse的内存分析器工具运行它们,该工具将数百个sun.security.ssl.SSLSocketImpl实例(占用数十MB内存)确定为可能的泄漏。但我无法弄清楚为什么这些SSLSocketImpl对象没有被处理掉。转储中SSLSocketImpl的大多数实例都有两个引用,一个来自java.lang.ref.Finalizer,一个来自com.amazonaws.internal。SdkSSLSocket。我的堆转储中的终结器线程被报告为空闲,没有
JVM线程转储显示等待锁定监视器的线程,但监视器没有相应的锁定线程的原因可能是什么?Windows2003上的Java1.5_14 最佳答案 您的代码经过任何更改后是否使用了任何JNI?(即,您是否正在运行从Java启动的任何native代码?)。我们已经看到了类似的行为,但是JDK1.6.0_05。应用程序似乎死锁,但Jstack显示线程正在等待没有其他线程持有的锁。我们有一些JNI代码,所以我们可能正在破坏某些东西。我们还没有找到解决方案,这个问题只能在一台机器上重现。 关于java
在java中有多种生成线程转储的方法。我想使用JVMTI(CAPI)来生成它,以评估它对正在运行的JVM的性能影响。(我知道jstack和JMX;这个问题通常不是关于获取线程转储,而是关于使用JVMTIAPI)。我的代码基于thisblogpost.在那里,java代理附加到SIGQUIT信号。我想避免这种情况,因为这与JVM用于将线程转储写入标准输出的信号相同。我想避免这种口是心非。换句话说,我想附加到不同的信号,或者找到一种方法让代理定期生成线程转储。 最佳答案 Inthere,thejavaagentattachestothe
我有一个基本的Java服务器应用程序,它有100个工作线程,可以对URL执行简单的HEAD请求。我为此使用HttpClient4.x。运行几分钟后,我的程序就卡住了几分钟,我不明白为什么。查看visualvmmonitor报告的屏幕截图。你可以看到它是扁平的。在此期间,我无法获得良好的线程转储,而可视化虚拟机只是卡住,直到它被解锁。有没有人知道我可以做些什么来尝试开始调试这个人?可视化虚拟机:http://tinypic.com/view.php?pic=2i915bs&s=7这是我在卡住时尝试获取jstack转储时的输出:jstack-F4325AttachingtoprocessI
我使用EclipseMAT来分析hprof文件。这非常好,但如果您有2Gb的堆转储,那么您需要运行具有2Gb+堆大小的MAT才能加载完整的堆转储。我想知道是否有人知道可以分析2Gbhprof文件的工具,而无需本身使用那么多内存(例如,它不会加载完整的文件,但会以某种方式遍历它)?如果在客户服务器上生成hprof文件,这将很有用,因为我可以在服务器上运行一些分析,而不是尝试通过VPN复制2Gb文件。 最佳答案 hprof文件的格式如果不完全加载然后应用一些交叉引用就不能很好地工作。但是,您可以使用jmap跳过hprof转储以从正在运行
我正在编写一个将敏感数据(密码和私钥)存储在内存中的Java程序。它将自由部署到任何操作系统。我知道用户几乎可以在任何系统上手动创建内存转储,但我担心操作系统或JVM实现创建的转储(包括但不限于JVM本身的某些段错误)会损害隐私敏感数据。是否可以采取任何措施来降低这些风险?Thisquestion是POSIX特定的,但给了我这些平台的答案。我有一个非平台特定的想法,包括将UncaughtExceptionHandler(likethis)设置为一个将覆盖敏感数据的类。但是如果内存被换出怎么办?如果JVM因JVM/JNI错误而崩溃(例如段错误)怎么办?我知道Linux可以阻止数据交换到磁
我是JProfiling我的应用程序分析高CPU使用率。用户登录时CPU使用率为100%(在服务器)。所以开始分析我的应用程序。我在堆转储中找到的以下查询字符串。不仅这4个查询,转储中还有数百个这样的查询。java.lang.String(0x3262b1)["/*loadcom.v4common.shared.beans.transaction.ControlTransaction*/selectcontroltra0_.idasid47_48_,controltra0_.form_transaction_idasform2_47_48_,controltra0_.string_va
是否可以查询转储在堆转储中的集合?我显然可以使用EclipseMAT之类的东西浏览该集合,但我真的很想能够实际调用集合对象上的getter。这显然比通过ConcurrentHashMap中的段试图找到我需要的映射要清晰得多。我想我正在寻找的是某种方法来“补充”命名集合的转储状态,以便随后可以使用标准API对其进行操作。有没有人知道任何此类实用程序,或者,如果不知道,有人可以提供一些示例代码或有关如何实现此目的的指示吗? 最佳答案 您应该能够在jhat中使用对象查询语言(OQL)查询所有集合或单个集合。.您不一定能调用任意方法,但您可
有时我不得不查看来自Tomcat服务器的线程转储。但是,这是一个非常缓慢的过程,因为我的应用程序使用具有几百个线程的线程池。我查看的大多数线程转储都包含许多线程的相同堆栈跟踪,因为它们处于空闲状态等待工作。是否有任何工具可以解析线程转储并仅向我显示唯一的堆栈跟踪以及每个状态中线程数的计数?这将使我能够快速忽略在公共(public)位置等待工作的数十或数百个线程。我试过ThreadDumpAnalyzer但这不会对常见堆栈跟踪进行任何总结。 最佳答案 我已经编写了一个工具来完成我想做的事情。JavaThreadDumpAnalysis