これらは, クラスのロード処理用, 及びロードしたクラス情報の管理用のクラス (See: here and here for details).
クラスのロード処理を行う関数, 及びロードしたクラスを管理するための関数を納めた名前空間(AllStatic クラス).
((cite: hotspot/src/share/vm/classfile/systemDictionary.hpp))
class SystemDictionary : AllStatic {
内部的には, ロード済みのJavaクラスを記憶しておくハッシュテーブルになっている. クラス名(Symbol)とクラスローダ(oop)をキーとして, クラス(klassOop)を返す (なお, クラスローダとして default VM class loader を指定したい場合は NULL をキーとすればいい模様). (See: here and here for details)
((cite: hotspot/src/share/vm/classfile/systemDictionary.hpp))
// The system dictionary stores all loaded classes and maps:
//
// [class name,class loader] -> class i.e. [Symbol*,oop] -> klassOop
//
// Classes are loaded lazily. The default VM class loader is
// represented as NULL.
HotSpot 内の様々な箇所で使用されている (#TODO).
実際にハッシュテーブルとしての機能を実装しているのは Dictionary クラス (See: Dictionary). SystemDictionary はそれを static フィールドに保持して使用しているだけ.
なお, SystemDictionary は以下の 2つの Dictionary オブジェクトを使用している.
((cite: hotspot/src/share/vm/classfile/systemDictionary.hpp))
// Hashtable holding loaded classes.
static Dictionary* _dictionary;
...
// Hashtable holding classes from the shared archive.
static Dictionary* _shared_dictionary;
See: here for details
SystemDictionary クラスのラッパークラス.
標準ライブラリ内のクラスへの簡単なアクセスを提供するクラス. SystemDictionary との違いは, 返り値の型が klassOop ではなく klassHandle である点 (SystemDictionaryHandles が klassOop を Handle 化してくれるので, 自分で Handle 化する手間が省ける).
((cite: hotspot/src/share/vm/classfile/systemDictionary.hpp))
class SystemDictionaryHandles : AllStatic {
各 Java クラスに対応したメソッドが用意されており, それを呼び出すことで Handle 化された klassOop (KlassHandle) が得られる (例: SystemDictionaryHandles::Object_klass(), SystemDictionaryHandles::Class_klass(), SystemDictionaryHandles::MethodHandle_klass(), etc).
(現状ではほとんど MethodHandle 関連の箇所でしか使われていないような... #TODO)
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
クラスに関する統計情報出力用の関数を納めた名前空間(AllStatic クラス). (e.g. ロード済みのクラスの個数, それらが消費しているメモリ量, ロード済みのメソッド数, それらが消費しているメモリ量, etc)
((cite: hotspot/src/share/vm/classfile/systemDictionary.cpp))
#ifndef PRODUCT
// statistics code
class ClassStatistics: AllStatic {
SystemDictionary::print_class_statistics() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
print_statistics() -> SystemDictionary::print_class_statistics() -> ClassStatistics::print()
なお, このクラスは (デバッグ時であることに加えて) PrintClassStatistics オプションが指定されている場合にしか使用されない.
((cite: hotspot/src/share/vm/runtime/java.cpp))
void print_statistics() {
...
if (PrintClassStatistics) {
SystemDictionary::print_class_statistics();
}
See: here for details
実行中に情報を取っておくのではなく, 呼び出された時点になってから SystemDictionary 内を調べている模様. 最終的には ClassStatistics::print() で出力が行われる.
See: here for details
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
メソッドに関する統計情報出力用の関数を納めた名前空間(AllStatic クラス). (e.g. 各 attribute (final, static, synchronized, etc) がついているメソッドがそれぞれ何個あったか, 引数の個数に関するヒストグラム情報(引数の個数が 1個,2個,3個,... のメソッドがそれぞれいくら存在するか), 全メソッド中での各bytecodeの登場比率はいくらか, etc)
((cite: hotspot/src/share/vm/classfile/systemDictionary.cpp))
class MethodStatistics: AllStatic {
SystemDictionary::print_method_statistics() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
print_statistics() -> SystemDictionary::print_method_statistics() -> MethodStatistics::print()
なお, このクラスは (デバッグ時であることに加えて) PrintMethodStatistics オプションが指定されている場合にしか使用されない.
((cite: hotspot/src/share/vm/runtime/java.cpp))
if (PrintMethodStatistics) {
SystemDictionary::print_method_statistics();
}
See: here for details
実行中に情報を取っておくのではなく, 呼び出された時点になってから SystemDictionary 内を調べている模様. 最終的には MethodStatistics::print() で出力が行われる.
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.