【发布时间】:2015-05-28 15:51:22
【问题描述】:
我们在 java-8-oracle 上运行。
六个月前我们搬到了 java8。
在过去的几天里,我们不时收到 OOME,但我们无法识别或重现问题。
当我们执行对服务器 (tomcat) 的调用时,我们会在堆栈跟踪中收到此错误:
java.lang.OutOfMemoryError: Compressed class space
重启服务器即可解决问题。对其他服务器的相同调用有效,对同一服务器的另一种类型的另一个调用也是如此。
查看 gc.log 时,我们看到:
2015-05-27T16:05:42.991+0000: 98774.440: [Full GC (Last ditch collection) 98774.440: [CMS: 575745K->575330K(3495936K), 0.8687777 secs] 575745K->575330K(4107008K), [Metaspace: 97940K->97940K(1396736K)], 0.8696093 secs] [Times: user=0.95 sys=0.00, real=0.88 secs]
2015-05-27T16:05:55.486+0000: 98786.935: [Full GC (Metadata GC Threshold) 98786.935: [CMS: 573414K->578735K(3495936K), 0.9372859 secs] 925046K->578735K(4107008K), [Metaspace: 99428K->99428K(1396736K)], 0.9386626 secs] [Times: user=1.01 sys=0.00, real=0.94 secs]
jstat -gc 返回:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
87296.0 87296.0 0.0 3151.4 523776.0 148284.4 3495936.0 574868.5 1395640.0 98066.3 1048576.0 11339.1 12165 636.851 223 116.957
753.808
我在 jstat 日志或 gc 日志中都没有看到任何内存问题。
尝试运行jmap -clstats 挂起:
Attaching to process ID 5110, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
finding class loader instances ..
【问题讨论】:
-
您使用哪些 Xms 和 Xmx 开关启动 JVM?我建议您使用 visualvm 或类似工具来更好地查看和了解您的 JVM 大小是如何设置的。或者使用 Eclipse 内存分析器。暂时你可以尝试使用 -XX: CompressedClassSpaceSize 来增加压缩类空间。为了更好地分析问题,您应该将 JVM 设置为 OOME 上的堆转储。
-
您在什么时间段后看到此异常?您是否尝试增加 CompressedClassSpace?例如:-XX: CompressedClassSpaceSize=1g ?如果您再次看到问题,但经过较长时间后,您似乎有某种内存泄漏。
-
@DavidG - 2 天前在其中一个服务器中第一次遇到(我们没有部署新版本)。重新启动服务器,然后在 12 小时后仅在其中一台服务器上再次看到它。压力负载不有助于重现。压缩大小几乎保持不变,并且不接近默认值 1G。
-
这可能是一个 JVM 错误。 hotspot-gc-dev discussion 存在类似症状的问题。尝试tuning 元空间增长-收缩策略。
标签: java garbage-collection jvm out-of-memory java-8