Rah*_*thi 16 java out-of-memory
如何在java OutOfMemoryError或stackoverflow生产时识别问题.由于这个原因它即将到来或为什么服务器停机.
例如,我正在开发一个生活在生产和UAT上的应用程序.即时生产java OutOfMemoryError或stackoverflow.
那么我们如何才能跟踪这个问题呢?是否有任何技术可以告诉我这是发生了哪些代码流?
请解释一下.我多次遇到过这个问题.
Nie*_*sen 14
如果你在生产中面对它并且你无法从堆栈跟踪或日志中真正推断它,你需要分析那里的内容.
让VM在OOM上转储
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath="/tmp"
Run Code Online (Sandbox Code Playgroud)
并用它进行分析.内存分析器工具(http://eclipse.org/mat/)是用于此分析的一个很好的独立程序.
在甲骨文的文档: -疑难解答内存泄漏有详细的解释就可以了:
当没有足够的空间在Java堆中或在堆的特定区域中分配对象时,将引发此错误.垃圾收集器无法使任何其他空间可用于容纳新对象,并且无法进一步扩展堆.
.....
诊断OutOfMemoryError的早期步骤是确定错误的含义.是表示Java堆已满,还是表示本机堆已满?为了帮助您回答这个问题,以下小节将介绍一些可能的错误消息,并参考消息的详细信息部分:
线程"main"中的异常:java.lang.OutOfMemoryError:Java堆空间
请参见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 :(本机方法)
请参见3.1.5详细消息:(本机方法).
更新: -
您可以从OpenJDK 下载 HotSpot VM源代码.如果要监视和跟踪Java堆空间的内存占用,即年轻代和旧代空间是从HotSpot VM启用详细GC.您可以在JVM启动参数中添加以下参数:
-verbose:gc –XX:+PrintGCDetails –XX:+PrintGCTimeStamps –Xloggc:<app path>/gc.log
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9880 次 |
| 最近记录: |