内存溢出错误:压缩类空间

5
我收到了这个错误信息:

 "java.lang.OutOfMemoryError: Compressed class space"

直到我找到触发器之前,我尝试使用 -XX:-UseCompressedClassPointers 禁用压缩类指针,但仍然出现了这个错误。这怎么可能呢?
谢谢!
2个回答

6

这个异常在“理解OutOfMemoryError异常”中有解释:

原因:在64位平台上,类元数据的指针可以用32位偏移量表示(使用UseCompressedOops)。这由命令行标志UseCompressedClassPointers(默认打开)控制。如果使用了UseCompressedClassPointers,则可用于类元数据的空间量固定为CompressedClassSpaceSize。如果UseCompressedClassPointers所需的空间超过了CompressedClassSpaceSize,就会抛出一个带有详细信息压缩类空间java.lang.OutOfMemoryError异常。

操作:增加CompressedClassSpaceSize或关闭UseCompressedClassPointers。注意:对CompressedClassSpaceSize的可接受大小有限制。例如,-XX:CompressedClassSpaceSize=4g超过了可接受的范围,将导致消息,如CompressedClassSpaceSize of 4294967296 is invalid; must be between 1048576 and 3221225472


你真的是想说,“将CompressedClassSpaceSize增加以关闭UseCompressedClassPointers”,还是你想说或者关闭?从你评论中的其余部分来看,似乎是这样。只是想为未来的读者确认一下。 - charlie arehart

4

压缩类空间是元空间的一部分。

看起来您需要增加最大元空间大小,或者您可能存在一个有漏洞的类加载器。

通常情况下,当Java堆中没有足够的空间来分配对象时,会抛出此错误。在这种情况下,垃圾收集器无法提供可用的空间以容纳新对象,并且堆无法进一步扩展。此外,当没有足够的本机内存支持加载Java类时,也可能抛出此错误。在极少数情况下,当花费过多时间进行垃圾回收并且几乎没有释放内存时,可能会抛出java.lang.OutOfMemoryError。


2
一些具体的细节会有所帮助,例如展示增加最大元空间大小的选项。 - Derek Hulley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接