【发布时间】:2016-06-15 06:05:13
【问题描述】:
我正在运行带有参数“-XX:MetaspaceSize=256M and -XX:MaxMetaspaceSize=256M”的jvm (java 8)。当我执行“jstat -gcmetacapacity <PID>”时,它会输出,
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1157120.0 122880.0 0.0 1048576.0 14336.0 499 5 1.131 12.653
我希望MCMN 和MCMX 都是256M。
这看起来类似于错误http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8077987。但它已通过 MC 的文档修复程序关闭。我希望这是 jstat 错误并且 java 配置是正确的。还有其他方法可以确认吗?
Java 版本
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
【问题讨论】:
-
所以你“希望它是 jstat 错误并且 java 配置是正确的”。 为什么?您的应用程序是否遇到任何问题?显然不是,否则,您在这里描述了您的实际问题。那么为什么你认为你必须完全搞乱元空间配置选项呢?
-
由于元空间达到顶峰,我们遇到了内存不足的问题。我们增加了元空间,但仍然内存不足。因此,需要检查元空间配置是否设置正确。发布此问题后,我们发现内存不足与此相同。 stackoverflow.com/questions/33255578/…。内存不足问题现已修复。
-
为了明确一点:没有
MaxMetaspaceSize选项,元空间是无限,并且元空间将根据需要调整大小。如果您遇到“由于元空间撞到屋顶”的问题,那么您首先会遇到由于创建屋顶而导致的自制问题。所以问题是,您在添加MaxMetaspaceSize选项之前遇到过什么样的问题? -
显然,如果未设置 MaxMetaspaceSize,我的应用程序将继续消耗内存,直到消耗完所有可用内存。正如我提到的,第三方库中存在导致此问题的错误。这就是我们应该使用 MaxMetaspaceSize 的原因。无论如何,我想确认它是否是 jstat 错误,以及是否有另一种方法可以确定是否为 jvm 正确设置了 maxMetaSpaceSize。
-
对,MaxMetaspaceSize 的存在不是为了保护 JVM,而是为了保护系统的其余部分,以防 JVM 出于某种原因行为不端。它限制了 JVM 可以从系统上的操作系统和其他进程窃取的本机内存量,因此它是一个重要的保障措施,不设置它是不聪明的,除非这个 JVM 是整个服务器上唯一重要的进程。