これらは, ロードしたクラスの情報を管理するためのクラス. より具体的に言うと, SystemDictionary クラス用の補助クラス (See: here and here for details).
SystemDictionary クラス内で使用される補助クラス (See: SystemDictionary).
SystemDictionary が管理するクラス情報を入れておくハッシュテーブル.
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// The data structure for the system dictionary (and the shared system
// dictionary).
class Dictionary : public TwoOopHashtable<klassOop> {
以下の箇所に(のみ)格納されている.
(ロードしたクラス用)
(shared archive から取得したクラス用 (なお, shared archive とは Class Data Sharing (CDS) の領域のこと))
((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;
以下の箇所で(のみ)生成されている.
(SystemDictionary::_disctionary フィールドの初期化用)
(SystemDictionary::_shared_dictionary フィールドの初期化用)
See: here for details
Dictionary クラス内で使用される補助クラス.
Java の "ProtectionDomain" 情報を管理するためのクラス. より具体的に言うと, java.security.ProtectionDomain オブジェクトを格納するための線形リスト.
(SystemDictionary の内部では, ロード済みのクラスは { klassOop, loader, protection_domain } という3つ組で管理している (See: DictionaryEntry). そして, 既にロード済みのクラスと protection_domain が合わなければ例外を出す)
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
// The following classes can be in dictionary.cpp, but we need these
// to be in header file so that SA's vmStructs can access.
class ProtectionDomainEntry :public CHeapObj {
以下のようなフィールドからなる (要は _next でつながっていく線形リストになっている).
_protection_domain フィールドに, 実際の java.security.ProtectionDomain オブジェクトが入る.
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
ProtectionDomainEntry* _next;
oop _protection_domain;
(このリストに一度 validate が通った java.security.ProtectionDomain オブジェクトをキャッシュしておくことで, 次回以降の validate を高速化するために使われている)
(なお, このリストにキャッシュされて無かった場合は, クラスローダーの checkPackageAccess() メソッドでチェックが行われる. そして, チェックに通れば DictionaryEntry::add_protection_domain() でこのリストに追加される)
develop オプションである ProtectionDomainVerification を false にすると, protection domain チェックを無効にすることもできる.
See: here for details
Dictionary クラス内で使用される補助クラス.
Dictionary オブジェクト内に格納されるハッシュテーブル・エントリ.
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
// An entry in the system dictionary, this describes a class as
// { klassOop, loader, protection_domain }.
class DictionaryEntry : public HashtableEntry<klassOop> {
スーパークラスである HashtableEntry クラスのフィールドに加えて, 以下のフィールドを持つ.
そのクラスをロードしたクラスローダを記憶しておくフィールド
一度 validate が通った ProtectionDomainEntry をキャッシュしておくフィールド
(なお, 実際のクラスオブジェクトはスーパークラスである HashtableEntry のフィールド中に格納されている)
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
// Contains the set of approved protection domains that can access
// this system dictionary entry.
ProtectionDomainEntry* _pd_set;
oop _loader;
See: here for details
SystemDictionary クラス内で使用される補助クラス (See: SystemDictionary).
java.lang.invoke.MethodHandle.invoke() の処理用のハッシュテーブル. メソッド名と型(Signature String)を表す Symbol オブジェクトをキーとして対応する methodOopDesc を引くことが出来る.
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
// A system-internal mapping of symbols to pointers, both managed
// and unmanaged. Used to record the auto-generation of each method
// MethodHandle.invoke(S)T, for all signatures (S)T.
class SymbolPropertyTable : public Hashtable<Symbol*> {
SystemDictionary クラスの _invoke_method_table フィールド (static フィールド) に(のみ)格納されている.
SystemDictionary::initialize() 内で(のみ)生成されている.
SystemDictionary::find_method_handle_invoke() 内で使用されている.
See: here for details
SymbolPropertyTable クラス内で使用される補助クラス.
SymbolPropertyTable オブジェクト内に格納されるハッシュテーブル・エントリ.
((cite: hotspot/src/share/vm/classfile/dictionary.hpp))
// Entry in a SymbolPropertyTable, mapping a single Symbol*
// to a managed and an unmanaged pointer.
class SymbolPropertyEntry : public HashtableEntry<Symbol*> {
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.