これらは, Platform MXBean 機能のためのクラス. より具体的に言うと, sun.management.ClassLoadingImpl クラス及び sun.management.HotspotClassLoading クラスの実装を担当するクラス. (See: here for details) (See: here and here for details)
(ついでに, (DTrace のフック点) を提供する役割もある)
保守運用機能のためのクラス (関連する JMM 用の Java クラスからのみ使用される) (See: sun.management.ClassLoadingImpl, sun.management.HotspotClassLoadingMBean). (See: here and here for details)
クラスファイルのロード処理に関する PerfData を納めた名前空間(AllStatic クラス).
(PerfData に記録している内容は, クラスファイルがロード/アンロードされた回数, その際のロード/アンロードされたバイト数, 等)
((cite: hotspot/src/share/vm/services/classLoadingService.hpp))
// VM monitoring and management support for the Class Loading subsystem
class ClassLoadingService : public AllStatic {
sun.management.ClassLoadingImpl クラス及び sun.management.HotspotClassLoading クラスから(のみ)使用されている.
(<= ただし内部に持っているのは PerfData なので jcmd 等から見ようと思えば見ることはできるが...)
内部には以下のような Perf データを格納している.
((cite: hotspot/src/share/vm/services/classLoadingService.hpp))
// Counters for classes loaded from class files
static PerfCounter* _classes_loaded_count;
static PerfCounter* _classes_unloaded_count;
static PerfCounter* _classbytes_loaded;
static PerfCounter* _classbytes_unloaded;
// Counters for classes loaded from shared archive
static PerfCounter* _shared_classes_loaded_count;
static PerfCounter* _shared_classes_unloaded_count;
static PerfCounter* _shared_classbytes_loaded;
static PerfCounter* _shared_classbytes_unloaded;
static PerfVariable* _class_methods_size;
これらの Perf データには, それぞれ以下の名前でアクセス可能.
((cite: hotspot/src/share/vm/services/classLoadingService.cpp))
// These counters are for java.lang.management API support.
// They are created even if -XX:-UsePerfData is set and in
// that case, they will be allocated on C heap.
_classes_loaded_count =
PerfDataManager::create_counter(JAVA_CLS, "loadedClasses",
PerfData::U_Events, CHECK);
_classes_unloaded_count =
PerfDataManager::create_counter(JAVA_CLS, "unloadedClasses",
PerfData::U_Events, CHECK);
_shared_classes_loaded_count =
PerfDataManager::create_counter(JAVA_CLS, "sharedLoadedClasses",
PerfData::U_Events, CHECK);
_shared_classes_unloaded_count =
PerfDataManager::create_counter(JAVA_CLS, "sharedUnloadedClasses",
PerfData::U_Events, CHECK);
if (UsePerfData) {
_classbytes_loaded =
PerfDataManager::create_counter(SUN_CLS, "loadedBytes",
PerfData::U_Bytes, CHECK);
_classbytes_unloaded =
PerfDataManager::create_counter(SUN_CLS, "unloadedBytes",
PerfData::U_Bytes, CHECK);
_shared_classbytes_loaded =
PerfDataManager::create_counter(SUN_CLS, "sharedLoadedBytes",
PerfData::U_Bytes, CHECK);
_shared_classbytes_unloaded =
PerfDataManager::create_counter(SUN_CLS, "sharedUnloadedBytes",
PerfData::U_Bytes, CHECK);
_class_methods_size =
PerfDataManager::create_variable(SUN_CLS, "methodBytes",
PerfData::U_Bytes, CHECK);
}
なお, 以下の PerfData は, Java のクラスからは使われていない.
一応アクセス用の jmm の関数までは用意されている (しかしこれらは Java のクラスからは使われていない...).
-> jmm_GetLongAttribute() -> get_long_attribute() (引数が JMM_SHARED_CLASS_LOADED_COUNT の場合) -> ClassLoadingService::loaded_shared_class_count() -> jmm_GetLongAttribute() -> get_long_attribute() (引数が JMM_SHARED_CLASS_UNLOADED_COUNT の場合) -> ClassLoadingService::unloaded_shared_class_count() -> jmm_GetLongAttribute() -> get_long_attribute() (引数が JMM_SHARED_CLASS_LOADED_BYTES の場合) -> ClassLoadingService::loaded_shared_class_bytes() -> jmm_GetLongAttribute() -> get_long_attribute() (引数が JMM_SHARED_CLASS_UNLOADED_BYTES の場合) -> ClassLoadingService::unloaded_shared_class_bytes()
See: here for details
jmm_GetLoadedClasses() 内で使用される補助クラス. ロード済みのクラス全てをたどるためのイテレータクラス(StackObjクラス).
(なおコメントによると, このコードは JMM と JVMTI で共通化すべき, とのこと)
((cite: hotspot/src/share/vm/services/classLoadingService.hpp))
// FIXME: make this piece of code to be shared by M&M and JVMTI
class LoadedClassesEnumerator : public StackObj {
使用方法は次のような感じ.
((cite: hotspot/src/share/vm/services/management.cpp))
LoadedClassesEnumerator lce(THREAD); // Pass current Thread as parameter
int num_classes = lce.num_loaded_classes();
...
for (int i = 0; i < num_classes; i++) {
KlassHandle kh = lce.get_klass(i);
...
}
jmm_GetLoadedClasses() 内で(のみ)使用されている.
(ところでこのクラスは使われているか?? jmm_GetLoadedClasses() でしか使われてないが, jmm_GetLoadedClasses() 自体がどこからも呼ばれていないような... #TODO) (なお, 似た名前の関数として JvmtiEnv::GetLoadedClasses() というものがあるが, これは関係ない模様)
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.