當我學習java.lang.String Java API時問題出來了。字符串文字加載到StringTable中的時間在Java HotSpot vm
我找到了一篇中文文章。 Java 中new String("字面量") 中 "字面量" 是何時進入字符串常量池的?
它說,CONSTANT_String
是HotSpot虛擬機懶惰的決心,所以字符串是加載到STRINGTABLE UTIL使用它。
我發現了一些相關的說法。
例如,Java虛擬機實現可以選擇解決一類或單獨接口的每個符號引用時,它被使用(「懶惰」或「遲到」的分辨率),或當課程正在驗證時(「渴望」或「靜態」分辨率),立即解決它們。
我發現了一些OpenJDK的代碼約ldc
IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide))
// access constant pool
constantPoolOop pool = method(thread)->constants();
int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) :get_index_u1(thread, Bytecodes::_ldc);
constantTag tag = pool->tag_at(index);
if (tag.is_unresolved_klass() || tag.is_klass()) {
klassOop klass = pool->klass_at(index, CHECK);
oop java_class = klass->java_mirror();
thread->set_vm_result(java_class);
} else {
#ifdef ASSERT
// If we entered this runtime routine, we believed the tag contained
// an unresolved string, an unresolved class or a resolved class.
// However, another thread could have resolved the unresolved string
// or class by the time we go there.
assert(tag.is_unresolved_string()|| tag.is_string(), "expected string");
#endif
oop s_oop = pool->string_at(index, CHECK);
thread->set_vm_result(s_oop);
}
IRT_END
和代碼約pool-> string_at(指數,CHECK)
oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
oop str = NULL;
CPSlot entry = this_oop->slot_at(which);
if (entry.is_metadata()) {
ObjectLocker ol(this_oop, THREAD);
if (this_oop->tag_at(which).is_unresolved_string()) {
// Intern string
Symbol* sym = this_oop->unresolved_string_at(which);
str = StringTable::intern(sym, CHECK_(constantPoolOop(NULL)));
this_oop->string_at_put(which, str);
} else {
// Another thread beat us and interned string, read string from constant pool
str = this_oop->resolved_string_at(which);
}
} else {
str = entry.get_oop();
}
assert(java_lang_String::is_instance(str), "must be string");
return str;
}
但
這些代碼只能證明字符串Literal可能被加載到StringTable util ldc
中,但無法在HotSpot VM中證明延遲解析。
有人可以明確地解釋它。
僅供參考,我知道小c但不C++。
謝謝。
您需要知道的唯一一件事情就是Java代碼無法察覺。無論是急於還是懶惰,嚴格來說都是一個實施細節,不需要任何關注,除非你是實現者。 – EJP
從代碼的角度來看,從初始化類型到甚至之前,文字都存在。 –
@EJP,盧布洛克:實際上,我們*可以*檢測到懶惰的解決... – Holger