Skip to content

jcmd jstat metaspace

ceragon edited this page Jul 4, 2022 · 2 revisions

jstat metaspace

metaspace 统计变量

perf 映射表

name perf key jvm var
MC sun.gc.metaspace.capacity
MU sun.gc.metaspace.used
CCSC sun.gc.compressedclassspace.capacity
CCSU sun.gc.compressedclassspace.used

metaspace 的统计

void MetaspaceCounters::initialize_performance_counters() {
    size_t min_capacity = 0;
    // max_capacity = ClassType + NonClassType
    // 也就是最大空间包含了 压缩类指针的空间
    _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity,
                                               capacity(), max_capacity(), used());
}
class MetaspacePerfCounters: public CHeapObj<mtInternal> {
    PerfVariable*      _capacity;
    PerfVariable*      _used;
    PerfVariable*      _max_capacity;
    MetaspacePerfCounters(const char* ns, size_t min_capacity, size_t curr_capacity, size_t max_capacity, size_t used) {
        create_constant(ns, "minCapacity", min_capacity, THREAD);
        _capacity = create_variable(ns, "capacity", curr_capacity, THREAD);
        _max_capacity = create_variable(ns, "maxCapacity", max_capacity, THREAD);
        _used = create_variable(ns, "used", used, THREAD);
    }
    
    PerfVariable* create_variable(const char *ns, const char *name, size_t value, TRAPS) {
        const char *path = PerfDataManager::counter_name(ns, name);
        return PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value, THREAD);
    }
};

压缩类指针空间

void CompressedClassSpaceCounters::initialize_performance_counters() {
    const char* ns = "compressedclassspace";
    if (UseCompressedClassPointers) {
        size_t min_capacity = 0;
        _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity(),
                                                 max_capacity(), used());
    } else {
        _perf_counters = new MetaspacePerfCounters(ns, 0, 0, 0, 0);
    }
}

压缩类指针的相关变量

capacity

由此可知,压缩类指针的空间是元空间的一部分。

enum MetadataType {
    ClassType,
    NonClassType,
    MetadataTypeCount
};
size_t CompressedClassSpaceCounters::max_capacity() {
    // 只包含 ClassType 的空间
    return MetaspaceUtils::reserved_bytes(Metaspace::ClassType);
}
size_t MetaspaceUtils::reserved_bytes(Metaspace::MetadataType mdtype) {
    VirtualSpaceList* list = Metaspace::get_space_list(mdtype);
    return list == NULL ? 0 : list->reserved_bytes();
}

ClassType 的 list 空间赋值

void Metaspace::initialize_class_space(ReservedSpace rs) {
    _class_space_list = new VirtualSpaceList(rs);
}
void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, address cds_base) {
    ReservedSpace metaspace_rs = ReservedSpace(compressed_class_space_size(),
                                             _reserve_alignment,
                                             large_pages,
                                             requested_addr);
    initialize_class_space(metaspace_rs);
}

compressed_class_space_size 的计算

product(size_t, CompressedClassSpaceSize, 1*G,                            \
          "Maximum size of class area in Metaspace when compressed "        \
          "class pointers are used")                                        \
          range(1*M, 3*G)                                                   \
void Metaspace::ergo_initialize() {
    set_compressed_class_space_size(CompressedClassSpaceSize);
}

小结一下:如果开启了压缩类指针,那么空间的上限就是 3G,这是由 CompressedClassSpaceSize 参数本身决定的。

元空间相关参数的初始化

void Metaspace::ergo_initialize() {
    
}

常用指令

打印 gc 的具体值

$ jstat -gc 23216
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
0.0   7168.0  0.0   7168.0 131072.0 92160.0  3704832.0   785227.9  357448.0 343382.1 45388.0 40007.2    743    6.652   0      0.000  276     6.103   12.755

打印 gc 的百分比和 gc 的原因

$ jstat -gcmetacapacity 23216
MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT    CGC    CGCT     GCT
    0.0  1386496.0   385480.0        0.0  1048576.0    47564.0  2459     0    0.000   676   15.605   40.016

Clone this wiki locally