当Java OutOfMemoryError时如何识别问题?

2022-09-02 09:45:02

如何在java或生产中时识别问题。由于什么原因它来了,或者为什么服务器关闭了。OutOfMemoryErrorstackoverflow

例如,我正在开发一个以生产和UAT为生的应用程序。立即在生产 java 或 .OutOfMemoryErrorstackoverflow

那么我们如何跟踪这个问题,它发生的原因是什么?有没有什么技术可以告诉我这是通过哪个代码流发生的?

请解释一下。我曾多次遇到这个问题。


答案 1

如果您在生产中遇到它,并且无法从堆栈跟踪或日志中真正推断出来,则需要分析其中的内容。

让 VM 转储到 OOM 上

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath="/tmp"

并将其用于分析。内存分析器工具(http://eclipse.org/mat/)是用于此分析的良好独立程序。


答案 2

Oracle 文档:- 内存泄漏故障排除有详细的说明:

当没有足够的空间来分配 Java 堆中或堆的特定区域中的对象时,将引发此错误。垃圾回收器无法提供任何进一步的可用空间来容纳新对象,并且无法进一步扩展堆。

.....

诊断内存外错误的早期步骤是确定错误的含义。这是否意味着 Java 堆已满,还是意味着本机堆已满?为了帮助您回答此问题,以下小节将参考消息的详细信息部分,介绍一些可能的错误消息:

线程“main”中的异常:java.lang.OutOfMemoryError:Java heap space

请参阅 3.1.1 详细信息消息:Java 堆空间。

线程“main”中的异常:java.lang.OutOfMemoryError:PermGen空间

请参阅 3.1.2 详细信息消息:PermGen 空间。

线程“main”中的异常:java.lang.OutOfMemoryError:请求的数组大小超过 VM 限制

请参阅 3.1.3 详细信息消息:请求的数组大小超过 VM 限制。

线程“main”中的异常:java.lang.OutOfMemoryError:请求字节。交换空间不足?

请参见 3.1.4 详细信息消息:的请求字节。交换空间不足?

线程“main”中的异常:java.lang.OutOfMemoryError:(Native method)

请参阅 3.1.5 详细信息消息:(本机方法)。

更新:-

您可以从 OpenJDK 下载 HotSpot VM 源代码。如果要监视和跟踪 Java 堆空间的内存占用量,即年轻一代和老一代空间是从 HotSpot VM 启用详细 GC。您可以在 JVM 启动参数中添加以下参数:

-verbose:gc –XX:+PrintGCDetails –XX:+PrintGCTimeStamps –Xloggc:<app path>/gc.log

推荐