Repository navigation
jcmd jstat metaspace
ceragon edited this page Jul 4, 2022
·
2 revisions
| 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 |
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);
}
}由此可知,压缩类指针的空间是元空间的一部分。
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();
}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