Java8 MetaspaceSize标志无效。

5

我有一段简单的测试代码,设置了-XX:MetaspaceSize-XX:MaxMetaspaceSize两个参数值相同。我认为metaspace应该不会动态调整大小。但是从我的测试结果来看(从VisualVM GC中检查Metaspace图表并通过jstat打印出日志),我发现metaspace的值从低值逐渐增加到我设置的最大值。那么-XX:MetaspaceSize参数无法生效吗?

我的测试代码如下:

try {

    while(true){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(A.class);
        enhancer.setUseCache(false);
        enhancer.setCallback((MethodInterceptor) (obj, method, args1, methodProxy) -> methodProxy.invokeSuper(obj, args1));
        enhancer.create();

        Thread.sleep(50);
    }
} catch (Throwable throwable) {
    throwable.printStackTrace();
}

虚拟机参数:

-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m

Java版本:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

jstat结果:(MC值持续增长到约10m)

C:\Users\dyu>jstat -gc 12336 1000 20
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
8192.0 8192.0  0.0   2207.8 49152.0  43399.2   131072.0     16.0    7168.0 6777.9 768.0  677.7       1    0.015   0      0.000    0.015
8192.0 8192.0  0.0   2207.8 49152.0  48166.1   131072.0     16.0    7168.0 6777.9 768.0  677.7       1    0.015   0      0.000    0.015
8192.0 8192.0 2592.0  0.0   49152.0   3691.9   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0   7537.9   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  11378.9   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  16180.3   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  20021.3   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  24822.5   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  28663.5   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  33466.8   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  37312.8   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  42114.1   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0 2592.0  0.0   49152.0  45955.1   131072.0     24.0    8832.0 8403.6 896.0  795.9       2    0.020   0      0.000    0.020
8192.0 8192.0  0.0   3488.0 49152.0   1925.1   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0   6737.6   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0  11758.5   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0  15608.7   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0  29056.4   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0  34196.6   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
8192.0 8192.0  0.0   3488.0 49152.0  39339.7   131072.0     32.0    10752.0 10225.1 1024.0 934.2       3    0.026   0      0.000    0.026
1个回答

11
您误解了 -XX:MetaspaceSize 的作用:

-XX:MetaspaceSize=size

设置分配的类元数据空间的大小,当第一次超过时触发垃圾回收。此垃圾回收的阈值会根据使用的元数据量而增加或减少。

该选项的名称可能被认为是有误导性的,除非您将其解释为“预期大小”,因此显然应在超过时触发垃圾回收(而最大大小定义了硬限制)。

有一个未解决的 bug 报告 JDK-8067205,要求添加一个选项来设置初始元空间大小。


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