Java事后内存分析

标签 java

我很好奇有没有办法分析java程序的内存使用情况。我的代码因 OutOfMemoryError 而崩溃,所以我想看看到底是什么用完了它。如果有帮助,我正在使用 Intellij IDEA,但我无法真正调试它,因为我正在使用的测试用例来自 txt 文件,而且我不认为 IDEA 有办法在您时重新路由标准输入正在其中运行一个程序。

最佳答案

有几种方法。

Heapdump(内存):

jmap -dump:format=b,file=<heap_dump_filename> <pid>

线程转储:

kill -3 

这些是手动调用的,您可以按需生成文件。当您想查看应用程序随时间的变化情况时很有用。

在您的 Java 进程中,您可以设置这些变量以使其在检测到 OoO 错误时自动执行:

+HeapDumpOnOutOfMemoryError

更多信息:https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html

现在,所有这些文件都可以被 MAT 之类的东西读取: https://www.eclipse.org/mat/

您还可以使用 SDK 附带的 Java VisualVM 读取线程转储:https://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/index.html

HeapDumps 将帮助您分析内存泄漏、堆问题和垃圾收集器问题。通过线程转储,您可以查看是否有线程阻塞或大量 IO 操作使服务器停滞。 (通常很多日志调用)。

最后,MAT 在读取 4 GB 或更大的大堆时可能会遇到一些问题。我也时常使用 IBM 堆分析器:https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544bafe-c7a2-455f-9d43-eb866ea60091

我通常乐于分析这些类型的问题。 祝你好运!

关于Java事后内存分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124471/

相关文章:

java - 如何在对象的 JSON 属性中排除(在输出类内部)?

java - 如何使用 Xpath java 解析带有命名空间的 xml

java - 消除接受不同功能接口(interface)的重载方法的歧义

java - Grails Spring 安全认证提供程序和自定义过滤器

java - 如何在运行时捕获方法类型(泛型类型)

java - java中随机数的生成

java - 错误 :Execution failed for task : java. util.zip.ZipException : duplicate entry: android/support/v4/graphics/BitmapCompat. 类

java - Java 中不分配返回值的非 void 方法调用

java - setter/getter 无法正常工作

java - 为什么随机不起作用?