"java.lang.OutOfMemoryError: Compressed class space"
直到我找到触发器之前,我尝试使用
-XX:-UseCompressedClassPointers
禁用压缩类指针,但仍然出现了这个错误。这怎么可能呢?谢谢!
"java.lang.OutOfMemoryError: Compressed class space"
-XX:-UseCompressedClassPointers
禁用压缩类指针,但仍然出现了这个错误。这怎么可能呢?这个异常在“理解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。
压缩类空间是元空间的一部分。
看起来您需要增加最大元空间大小,或者您可能存在一个有漏洞的类加载器。
通常情况下,当Java堆中没有足够的空间来分配对象时,会抛出此错误。在这种情况下,垃圾收集器无法提供可用的空间以容纳新对象,并且堆无法进一步扩展。此外,当没有足够的本机内存支持加载Java类时,也可能抛出此错误。在极少数情况下,当花费过多时间进行垃圾回收并且几乎没有释放内存时,可能会抛出java.lang.OutOfMemoryError。