vmSymbols和vmSymbolHandles这两个都是只拥有静态成员和方法的class。
其定义在:\hotspot\src\share\vm\memory\vmSymbols.hpp
用来缓存JVM内部常用的symboleOop和symboleHandle。
例如:
symbolOop obj = vmSymbols::java_lang_Object(); // java.lang.Object的oop
SymbolHandle handle = vmSymbolHandles::java_lang_Object(); // oop对应的Handle
其定义在:\hotspot\src\share\vm\memory\vmSymbols.hpp
用来缓存JVM内部常用的symboleOop和symboleHandle。
例如:
symbolOop obj = vmSymbols::java_lang_Object(); // java.lang.Object的oop
SymbolHandle handle = vmSymbolHandles::java_lang_Object(); // oop对应的Handle
vmSymboleHandles是vmSymboles的一个Helper。
Handle和Oop的关系参见这里。
Handle和Oop的关系参见这里。
看个例子
vmSymbolHandles::java_lang_Object()的实现代码是
static symbolHandle java_lang_Object() {
static symbolHandle java_lang_Object() {
return symbol_handle_at(vmSymbols::java_lang_Object_enum);
}
而 static symbolHandle symbol_handle_at(int n) {
return symbolHandle(&vmSymbols::_symbols[n], false);
}
所以
vmSymbolHandles::java_lang_Object()
所以
vmSymbolHandles::java_lang_Object()
<==> symbolHandle(&vmSymbols::_symbols[vmSymbols::java_lang_Object_enum], false)
(这是调用symboleHandle的构造函数)
注意到:vmSymbols::_symbols[vmSymbols::java_lang_Object_enum] <==> vmSymbols::java_lang_Object()
所以 vmSymbolHandles::java_lang_Object() <==> symbolHandle(&vmSymbols::java_lang_Object())
所以 vmSymbolHandles::java_lang_Object() <==> symbolHandle(&vmSymbols::java_lang_Object())
这些oop和handle的定义使用了宏:VM_SYMBOLS_DO、VM_SYMBOL_DECLARE、VM_SYMBOL_HANDLE_DECLARE。
oop的初始化在vmSymbols::initialize中实现,其实现使用了宏:VM_SYMBOL_INITIALIZE,
真正创建oop使用的是oopFactory::new_symbol。