求助>java.lang.OutOfMemoryError: Compressed class space>
4回复
1月前

java.lang.OutOfMemoryError: Compressed class space



线上一台机器从java7升级到java8之后,运行一天后出现了Compressed class space的OOM。线上没有设置Metaspace区的大小。
现象:cpu占用高,查看gc发现基本隔一秒会触发一次fullgc,进程失去响应。
疑问:图一的Metaspace下面的class space是Compressed class space吗?这个OOM是发生在Metaspace区吗,如果是的话,为什么没有触发Metaspace区的自动扩容。线上机器内存8g,堆设置:-Xms4096m -Xmx4096m。
image.png
image.png
image.png

1356 阅读
请先登录,再评论

回复列表

你假笨1月前

首先,你可以看下这篇文章介绍metaspace组成的,JVM源码分析之Metaspace解密

这个OOM还是有些夸张的,因为默认就有1G,这么大都被用完了,难道是模拟的程序?

其次可以看下这篇文章,看是否和你的情况一致谨防JDK8重复类定义造成的内存泄漏

逃离1月前
回复 你假笨:

谢谢,我本地尝试复现一下

回复
你假笨1月前
回复 逃离:

因为类信息都是存储在metaspace里的,同时有(Max)MetaspaceSize参数来控制触发gc的阈值,如果触发gc之后还是不能分配就会抛出OOM,metaspace会分klass区域和noklass区域分别存储类不同的内容,可以看上面提到的那篇文章,哪块不足就发生哪个oom

回复
逃离1月前
回复 你假笨:

谢谢你假笨老师,我下午也查到了您的这篇文章,看了一下项目依赖,确实有低于2.2.2版本的jaxb-impl依赖,很大可能是这个问题。当时看线上日志,抛出的异常都是java.lang.OutOfMemoryError: Compressed class space。想请教一下,jvm什么会抛出Metaspace的OOM,什么时候会抛出CCS的OOM呢?这个异常信息对我排查问题干扰还是挺大的,当时搜索基本都是用这个关键词来搜的。

回复