隔夜运行Java应用程序时出现一些java.lang.OutOfMemoryError: GC overhead limit exceeded
错误:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid6376.hprof ...
Heap dump file created [512149941 bytes in 23.586 secs]
23:34:52,163 WARN [HDScanner] Scan failed
java.lang.OutOfMemoryError: Java heap space
23:34:52,298 ERROR [ContainerBase] Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
23:34:52,321 ERROR [JIoEndpoint] Socket accept failed
java.lang.OutOfMemoryError: Java heap space
at java.net.ServerSocket.accept(Unknown Source)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
如果打开jvisualvm,则可以看到我确实没有堆空间:
我想对其进行分析,以试图找出正在发生的事情-是否存在内存泄漏?等等.但是,我根本无法让jvisualvm事件探查器执行任何操作. Profiler选项卡显示有关已启用类共享的警告:
…即使我已将-Xshare:off
flag添加到我的VM参数中:
所以,
>关于如何进行分析工作的任何想法?
>是否值得与G1GC
而不是…我当前使用的任何GC一起玩?
解决方法:
在我看来,您在32位JVM上运行VisualVM,而您的JBoss在64位JVM上运行.在这种情况下,分析器和其他诸如线程和CPU监视之类的工具在Windows上无法立即使用.使用事件探查器,您会遇到错误#273,其中错误地启用了事件探查器.您应该执行以下操作:
>下载最新的64位JDK(当前为JDK 6u23).它还包含Java VisualVM的最新版本
>在VisualVM中使用内存采样器(它的开销比分析要低得多)以查看是否可以发现问题.
>如果这样做没有帮助,请查看堆转储并尝试找出正在发生的情况.
>对您的JBoss服务器进行内存分析.有关VisualVM中探查器的更多信息,请参见Profiling With VisualVM, Part 1和Profiling With VisualVM, Part 2.