openjdk8 소스 코드에서 일부 java.lang.String oop은 바이트 코드 엔진을 거치지 않고 jvm 자체에서 할당한다는 것을 알았습니다. hotspot/src/share/vm/classfile/javaClasses.cpp:185
는 말하기를 :핫스팟 VM은 String oops 및 mirror oops를 어떻게 생성합니까?
Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
Handle h_obj = basic_create(length, CHECK_NH); // alloc size of java.lang.String oop
typeArrayOop buffer = value(h_obj());
for (int index = 0; index < length; index++) {
buffer->char_at_put(index, unicode[index]); // put a char[] into this oop...
}
return h_obj;
}
하는 가짜 문자열 생성됩니다 ... 그러나, java.lang.String
다섯 개 멤버 변수 (필드), 그들이 어떻게 초기화합니까있다? 다른 말로하면, 이것들은 어떻게합니까 가짜 문자열은 진짜 java.lang.String
개체가됩니까?
java.lang.String
과 동일합니다. java.lang.Class
도 마찬가지입니다. hotspot/src/share/vm/classfile/javaClasses.cpp:553
의 메시지 :
oop java_lang_Class::create_mirror(KlassHandle k, Handle protection_domain, TRAPS) {
...
Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0);
...
// if `k` holds a InstanceKlass, it will initialize the static fields by constant value attribute. else do nothing...
}
나는 매우 혼란 스러웠습니다. alloc
메모리인데, java.lang.String
의 오브젝트 인 경우 char[]
을 넣으십시오. java.lang.String
및 java.lang.Class
의 다른 필드는 언제 oop에 채워 집니까? 고맙습니다.
Java 8부터는 인스턴스 필드가 두 개뿐입니다. 다른 필드는 '정적'입니다. 'hashCode'가'hashCode()'메소드 내에서 느리게 초기화되기 때문에'char [] value'는 초기화 될 필요가있는 유일한 필드입니다. – Holger
감사! 나는 그것을 완전히 이해한다. – wind2412