结构图
本图来自揭秘Java虚拟机(JVM设计原理与实现)
数据存放源码
put
void slot_at_put(int which, CPSlot s) const {
assert(is_within_bounds(which), "index out of bounds");
assert(s.value() != 0, "Caught something");
*(intptr_t*)&base()[which] = s.value();
}
intptr_t* obj_at_addr_raw(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (intptr_t*) &base()[which];
}
jint* int_at_addr(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (jint*) &base()[which];
}
jlong* long_at_addr(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (jlong*) &base()[which];
}
jfloat* float_at_addr(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (jfloat*) &base()[which];
}
jdouble* double_at_addr(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (jdouble*) &base()[which];
}
// For temporary use while constructing constant pool
void klass_index_at_put(int which, int name_index) {
tag_at_put(which, JVM_CONSTANT_ClassIndex);
*int_at_addr(which) = name_index;
}
// Temporary until actual use
void unresolved_klass_at_put(int which, Symbol* s) {
release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
slot_at_put(which, s);
}
void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
tag_at_put(which, JVM_CONSTANT_MethodHandle);
*int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
}
void method_type_index_at_put(int which, int ref_index) {
tag_at_put(which, JVM_CONSTANT_MethodType);
*int_at_addr(which) = ref_index;
}
void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
*int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
}
void unresolved_string_at_put(int which, Symbol* s) {
release_tag_at_put(which, JVM_CONSTANT_String);
*symbol_at_addr(which) = s;
}
void int_at_put(int which, jint i) {
tag_at_put(which, JVM_CONSTANT_Integer);
*int_at_addr(which) = i;
}
void long_at_put(int which, jlong l) {
tag_at_put(which, JVM_CONSTANT_Long);
// *long_at_addr(which) = l;
Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
}
void float_at_put(int which, jfloat f) {
tag_at_put(which, JVM_CONSTANT_Float);
*float_at_addr(which) = f;
}
void double_at_put(int which, jdouble d) {
tag_at_put(which, JVM_CONSTANT_Double);
// *double_at_addr(which) = d;
// u8 temp = *(u8*) &d;
Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
}
Symbol** symbol_at_addr(int which) const {
assert(is_within_bounds(which), "index out of bounds");
return (Symbol**) &base()[which];
}
void symbol_at_put(int which, Symbol* s) {
assert(s->refcount() != 0, "should have nonzero refcount");
tag_at_put(which, JVM_CONSTANT_Utf8);
*symbol_at_addr(which) = s;
}
void string_at_put(int which, int obj_index, oop str) {
resolved_references()->obj_at_put(obj_index, str);
}
// For temporary use while constructing constant pool
void string_index_at_put(int which, int string_index) {
tag_at_put(which, JVM_CONSTANT_StringIndex);
*int_at_addr(which) = string_index;
}
void field_at_put(int which, int class_index, int name_and_type_index) {
tag_at_put(which, JVM_CONSTANT_Fieldref);
*int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
}
void method_at_put(int which, int class_index, int name_and_type_index) {
tag_at_put(which, JVM_CONSTANT_Methodref);
*int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
}
void interface_method_at_put(int which, int class_index, int name_and_type_index) {
tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
*int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
}
void name_and_type_at_put(int which, int name_index, int signature_index) {
tag_at_put(which, JVM_CONSTANT_NameAndType);
*int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice
}
tags
Array<u1>* tags() const
{ return _tags; }
void tag_at_put(int which, jbyte t)
{ tags()->at_put(which, t); } // 常量池类型标志