3

我在java.lang.OutOfMemoryError: GC overhead limit exceeded一夜之间运行我的 Java 应用程序时遇到了一些错误:

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标志添加到我的 VM 参数中:

概述

所以,

  • 关于如何让分析工作的任何想法?
  • 是否值得玩G1GC而不是......我目前使用的任何GC?
4

1 回答 1

4

在我看来,您正在 32 位 JVM 上运行 VisualVM,而您的 JBoss 正在 64 位 JVM 上运行。在这种情况下,探查器和其他诸如线程和 CPU 监控之类的东西在 Windows 上无法开箱即用。使用探查器时,您会遇到错误#273,其中探查器未正确启用。您应该执行以下操作:

  1. 下载最新的 64 位 JDK(当前为 JDK 6u23)。它还包含最新版本的 Java VisualVM
  2. 在 VisualVM 中使用内存采样器(它的开销比分析低得多)来查看是否可以发现问题。
  3. 如果这没有帮助,请查看堆转储并尝试找出发生了什么。
  4. 对 JBoss 服务器进行内存分析。有关 VisualVM中的分析器的更多信息,请参阅使用 VisualVM 进行分析,第 1 部分使用 VisualVM 进行分析,第 2 部分。
于 2011-01-21T10:04:23.137 回答