4

我有一个简单的测试代码,将-XX:MetaspaceSize-XX:MaxMetaspaceSize设置为相同的值。我认为元空间不应该动态调整大小。但是从我的测试(检查 VisualVM GC 中的元空间图并通过 jstat 打印日志),我看到元空间不断从低值增长到我设置的最大值。那么-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 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
4

1 回答 1

10

你误解了什么-XX:MetaspaceSize是:

-XX:元空间大小=大小

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

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

一个打开的错误报告,JDK-8067205要求设置初始元空间大小的选项。

于 2017-11-22T08:30:13.923 回答