Java 元空间内存不足,甚至有20-30%或更多的可用空间
使用Java8运行的KeyClope/JBoss服务器被切换到G1GC,并且Java 元空间内存不足,甚至有20-30%或更多的可用空间,java,jboss,g1gc,metaspace,Java,Jboss,G1gc,Metaspace,使用Java8运行的KeyClope/JBoss服务器被切换到G1GC,并且-XX:MaxMetaspaceSize被设置为256MB。它很快停止响应,日志中充满了OutOfMemory:Metaspace错误。未启用GC日志。服务器连接了Dynatrace监控服务,显示了大量可用的metapsace 在一次分配的256MB中使用了191MB。 在第二次出现时分配的256MB中使用了165MB 我知道为了释放元空间,调用了GC,但由于无法释放足够的空间,它在一个接一个地运行GC,因此进程被卡住的
-XX:MaxMetaspaceSize
被设置为256MB。它很快停止响应,日志中充满了OutOfMemory:Metaspace错误。未启用GC日志。服务器连接了Dynatrace监控服务,显示了大量可用的metapsace
在一次分配的256MB中使用了191MB。
在第二次出现时分配的256MB中使用了165MB
我知道为了释放元空间,调用了GC,但由于无法释放足够的空间,它在一个接一个地运行GC,因此进程被卡住的原因是有道理的。然而,我无法理解的是,为什么进程在大量空闲时也会耗尽元空间。没有提供其他JVM参数(XMS/XMX除外)。所有堆内存段都有足够的可用空间。是否有人试图在元空间中分配60MB+的空间?这是唯一可能的原因吗?另一个原因可能是您查看的是平均值,而不是最大值。将元空间度量添加到自定义图表中,并确保选择“最大”聚合。可能此时值更接近最大值。是否启用了
UseCompressedClassesPointers
?如果是这样,那么MaxMetaspaceSize=的提交大小(元空间+压缩类空间)。您可能不会显式设置它,但如果启用了UseCompressedOops
,则默认情况下会启用它。所以,请检查您的配置。@rmunge这是可能的,但dynatrace中显示的使用的mataspace大小是一致的,这使我认为它没有增长或收缩。@suv3ndu这很有趣,因为UseCompressedOops确实包含在JVM参数中。是否有任何文档/参考文件对此进行了解释?@Harisumshtaq请参阅以了解详细信息。