Mercurial > hg > truffle
diff src/share/vm/classfile/javaClasses.hpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 1d7922586cf6 |
children | e522a00b91aa bd7a7ce2e264 070d523b96a7 |
line wrap: on
line diff
--- a/src/share/vm/classfile/javaClasses.hpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/classfile/javaClasses.hpp Sat Sep 01 13:25:18 2012 -0400 @@ -59,8 +59,7 @@ static bool initialized; - static Handle basic_create(int length, bool tenured, TRAPS); - static Handle basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS); + static Handle basic_create(int length, TRAPS); static void set_value( oop string, typeArrayOop buffer) { assert(initialized, "Must be initialized"); @@ -84,7 +83,6 @@ // Instance creation static Handle create_from_unicode(jchar* unicode, int len, TRAPS); - static Handle create_tenured_from_unicode(jchar* unicode, int len, TRAPS); static oop create_oop_from_unicode(jchar* unicode, int len, TRAPS); static Handle create_from_str(const char* utf8_str, TRAPS); static oop create_oop_from_str(const char* utf8_str, TRAPS); @@ -205,9 +203,9 @@ // Interface to java.lang.Class objects #define CLASS_INJECTED_FIELDS(macro) \ - macro(java_lang_Class, klass, object_signature, false) \ - macro(java_lang_Class, resolved_constructor, object_signature, false) \ - macro(java_lang_Class, array_klass, object_signature, false) \ + macro(java_lang_Class, klass, intptr_signature, false) \ + macro(java_lang_Class, resolved_constructor, intptr_signature, false) \ + macro(java_lang_Class, array_klass, intptr_signature, false) \ macro(java_lang_Class, oop_size, int_signature, false) \ macro(java_lang_Class, static_oop_field_count, int_signature, false) @@ -226,6 +224,7 @@ static bool offsets_computed; static int classRedefinedCount_offset; + static GrowableArray<Klass*>* _fixup_mirror_list; public: static void compute_offsets(); @@ -235,11 +234,11 @@ static void fixup_mirror(KlassHandle k, TRAPS); static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); // Conversion - static klassOop as_klassOop(oop java_class); - static void set_klass(oop java_class, klassOop klass); - static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL); + static Klass* as_Klass(oop java_class); + static void set_klass(oop java_class, Klass* klass); + static BasicType as_BasicType(oop java_class, Klass** reference_klass = NULL); static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) { - klassOop refk_oop = NULL; + Klass* refk_oop = NULL; BasicType result = as_BasicType(java_class, &refk_oop); (*reference_klass) = KlassHandle(refk_oop); return result; @@ -254,11 +253,11 @@ static BasicType primitive_type(oop java_class); static oop primitive_mirror(BasicType t); // JVM_NewInstance support - static methodOop resolved_constructor(oop java_class); - static void set_resolved_constructor(oop java_class, methodOop constructor); + static Method* resolved_constructor(oop java_class); + static void set_resolved_constructor(oop java_class, Method* constructor); // JVM_NewArray support - static klassOop array_klass(oop java_class); - static void set_array_klass(oop java_class, klassOop klass); + static Klass* array_klass(oop java_class); + static void set_array_klass(oop java_class, Klass* klass); // compiler support for class operations static int klass_offset_in_bytes() { return _klass_offset; } static int resolved_constructor_offset_in_bytes() { return _resolved_constructor_offset; } @@ -272,9 +271,15 @@ static int static_oop_field_count(oop java_class); static void set_static_oop_field_count(oop java_class, int size); + static GrowableArray<Klass*>* fixup_mirror_list() { + return _fixup_mirror_list; + } + static void set_fixup_mirror_list(GrowableArray<Klass*>* v) { + _fixup_mirror_list = v; + } // Debugging friend class JavaClasses; - friend class instanceKlass; // verification code accesses offsets + friend class InstanceKlass; // verification code accesses offsets friend class ClassFileParser; // access to number_of_fake_fields }; @@ -449,8 +454,9 @@ enum { trace_methods_offset = 0, trace_bcis_offset = 1, - trace_next_offset = 2, - trace_size = 3, + trace_mirrors_offset = 2, + trace_next_offset = 3, + trace_size = 4, trace_chunk_size = 32 }; @@ -461,7 +467,7 @@ static int static_unassigned_stacktrace_offset; // Printing - static char* print_stack_element_to_buffer(methodOop method, int bci); + static char* print_stack_element_to_buffer(Method* method, int bci); static void print_to_stream(Handle stream, const char* str); // StackTrace (programmatic access, new since 1.4) static void clear_stacktrace(oop throwable); @@ -486,8 +492,8 @@ // Note: this is no longer used in Merlin, but we still suppport // it for compatibility. static void print_stack_trace(oop throwable, oop print_stream); - static void print_stack_element(Handle stream, methodOop method, int bci); - static void print_stack_element(outputStream *st, methodOop method, int bci); + static void print_stack_element(Handle stream, Method* method, int bci); + static void print_stack_element(outputStream *st, Method* method, int bci); static void print_stack_usage(Handle stream); // Allocate space for backtrace (created but stack trace not filled in) @@ -711,7 +717,7 @@ private: // Note that to reduce dependencies on the JDK we compute these // offsets at run-time. - static int _cp_oop_offset; + static int _oop_offset; static void compute_offsets(); @@ -720,12 +726,13 @@ static Handle create(TRAPS); // Accessors - static oop cp_oop(oop reflect); - static void set_cp_oop(oop reflect, oop value); - static int cp_oop_offset() { - return _cp_oop_offset; + static void set_cp(oop reflect, ConstantPool* value); + static int oop_offset() { + return _oop_offset; } + static ConstantPool* get_cp(oop reflect); + // Debugging friend class JavaClasses; }; @@ -853,6 +860,7 @@ static oop pending_list_lock(); static oop pending_list(); + static HeapWord* pending_list_lock_addr(); static HeapWord* pending_list_addr(); }; @@ -903,7 +911,7 @@ static void set_form(oop mh, oop lform); // Testers - static bool is_subclass(klassOop klass) { + static bool is_subclass(Klass* klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass()); } static bool is_instance(oop obj) { @@ -932,7 +940,7 @@ static void set_vmentry(oop lform, oop invoker); // Testers - static bool is_subclass(klassOop klass) { + static bool is_subclass(Klass* klass) { return SystemDictionary::LambdaForm_klass() != NULL && Klass::cast(klass)->is_subclass_of(SystemDictionary::LambdaForm_klass()); } @@ -949,8 +957,9 @@ // (These are a private interface for Java code to query the class hierarchy.) #define MEMBERNAME_INJECTED_FIELDS(macro) \ + macro(java_lang_invoke_MemberName, vmloader, object_signature, false) \ macro(java_lang_invoke_MemberName, vmindex, intptr_signature, false) \ - macro(java_lang_invoke_MemberName, vmtarget, object_signature, false) + macro(java_lang_invoke_MemberName, vmtarget, intptr_signature, false) class java_lang_invoke_MemberName: AllStatic { friend class JavaClasses; @@ -961,13 +970,14 @@ // private String name; // may be null if not yet materialized // private Object type; // may be null if not yet materialized // private int flags; // modifier bits; see reflect.Modifier - // private Object vmtarget; // VM-specific target value + // private intptr vmtarget; // VM-specific target value // private intptr_t vmindex; // member index within class or interface static int _clazz_offset; static int _name_offset; static int _type_offset; static int _flags_offset; static int _vmtarget_offset; + static int _vmloader_offset; static int _vmindex_offset; static void compute_offsets(); @@ -986,14 +996,14 @@ static int flags(oop mname); static void set_flags(oop mname, int flags); - static oop vmtarget(oop mname); - static void set_vmtarget(oop mname, oop target); + static Metadata* vmtarget(oop mname); + static void set_vmtarget(oop mname, Metadata* target); static intptr_t vmindex(oop mname); static void set_vmindex(oop mname, intptr_t index); // Testers - static bool is_subclass(klassOop klass) { + static bool is_subclass(Klass* klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass()); } static bool is_instance(oop obj) { @@ -1079,7 +1089,7 @@ static void set_target_volatile(oop site, oop target) { site->obj_field_put_volatile(_target_offset, target); } // Testers - static bool is_subclass(klassOop klass) { + static bool is_subclass(Klass* klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::CallSite_klass()); } static bool is_instance(oop obj) { @@ -1112,19 +1122,31 @@ // Interface to java.lang.ClassLoader objects +#define CLASSLOADER_INJECTED_FIELDS(macro) \ + macro(java_lang_ClassLoader, loader_data, intptr_signature, false) \ + macro(java_lang_ClassLoader, dependencies, object_signature, false) + class java_lang_ClassLoader : AllStatic { private: + // The fake offsets are added by the class loader when java.lang.Class is loaded enum { hc_parent_offset = 0 }; - + static int _loader_data_offset; + static int _dependencies_offset; static bool offsets_computed; static int parent_offset; static int parallelCapable_offset; + public: static void compute_offsets(); - public: + static ClassLoaderData** loader_data_addr(oop loader); + static ClassLoaderData* loader_data(oop loader); + + static oop dependencies(oop loader); + static HeapWord* dependencies_addr(oop loader); + static oop parent(oop loader); static bool isAncestor(oop loader, oop cl); @@ -1137,7 +1159,7 @@ static oop non_reflection_class_loader(oop loader); // Testers - static bool is_subclass(klassOop klass) { + static bool is_subclass(Klass* klass) { return Klass::cast(klass)->is_subclass_of(SystemDictionary::ClassLoader_klass()); } static bool is_instance(oop obj) { @@ -1146,6 +1168,7 @@ // Debugging friend class JavaClasses; + friend class ClassFileParser; // access to number_of_fake_fields }; @@ -1268,7 +1291,7 @@ const bool may_be_java; - klassOop klass() const { return SystemDictionary::well_known_klass(klass_id); } + Klass* klass() const { return SystemDictionary::well_known_klass(klass_id); } Symbol* name() const { return lookup_symbol(name_index); } Symbol* signature() const { return lookup_symbol(signature_index); } @@ -1285,6 +1308,7 @@ #define ALL_INJECTED_FIELDS(macro) \ CLASS_INJECTED_FIELDS(macro) \ + CLASSLOADER_INJECTED_FIELDS(macro) \ MEMBERNAME_INJECTED_FIELDS(macro) // Interface to hard-coded offset checking