comparison src/share/vm/prims/whitebox.cpp @ 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 5a1f452f8f90
children 4102b59539ce db9981fd3124
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
26 26
27 #include "memory/universe.hpp" 27 #include "memory/universe.hpp"
28 #include "oops/oop.inline.hpp" 28 #include "oops/oop.inline.hpp"
29 29
30 #include "classfile/symbolTable.hpp" 30 #include "classfile/symbolTable.hpp"
31 #include "classfile/classLoaderData.hpp"
31 32
32 #include "prims/whitebox.hpp" 33 #include "prims/whitebox.hpp"
33 #include "prims/wbtestmethods/parserTests.hpp" 34 #include "prims/wbtestmethods/parserTests.hpp"
34 35
35 #include "runtime/interfaceSupport.hpp" 36 #include "runtime/interfaceSupport.hpp"
48 return (jlong)(void*)JNIHandles::resolve(obj); 49 return (jlong)(void*)JNIHandles::resolve(obj);
49 WB_END 50 WB_END
50 51
51 WB_ENTRY(jint, WB_GetHeapOopSize(JNIEnv* env, jobject o)) 52 WB_ENTRY(jint, WB_GetHeapOopSize(JNIEnv* env, jobject o))
52 return heapOopSize; 53 return heapOopSize;
54 WB_END
55
56
57 class WBIsKlassAliveClosure : public KlassClosure {
58 Symbol* _name;
59 bool _found;
60 public:
61 WBIsKlassAliveClosure(Symbol* name) : _name(name), _found(false) {}
62
63 void do_klass(Klass* k) {
64 if (_found) return;
65 Symbol* ksym = k->name();
66 if (ksym->fast_compare(_name) == 0) {
67 _found = true;
68 }
69 }
70
71 bool found() const {
72 return _found;
73 }
74 };
75
76 WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name))
77 Handle h_name = JNIHandles::resolve(name);
78 if (h_name.is_null()) return false;
79 Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false);
80 TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return
81
82 WBIsKlassAliveClosure closure(sym);
83 ClassLoaderDataGraph::classes_do(&closure);
84
85 return closure.found();
53 WB_END 86 WB_END
54 87
55 #ifndef SERIALGC 88 #ifndef SERIALGC
56 WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj)) 89 WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj))
57 G1CollectedHeap* g1 = G1CollectedHeap::heap(); 90 G1CollectedHeap* g1 = G1CollectedHeap::heap();
82 Symbol* signature_symbol) { 115 Symbol* signature_symbol) {
83 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid"); 116 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
84 Thread* THREAD = Thread::current(); 117 Thread* THREAD = Thread::current();
85 118
86 //Get the class of our object 119 //Get the class of our object
87 klassOop arg_klass = object->klass(); 120 Klass* arg_klass = object->klass();
88 //Turn it into an instance-klass 121 //Turn it into an instance-klass
89 instanceKlass* ik = instanceKlass::cast(arg_klass); 122 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
90 123
91 //Create symbols to look for in the class 124 //Create symbols to look for in the class
92 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name), 125 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
93 THREAD); 126 THREAD);
94 127
95 //To be filled in with an offset of the field we're looking for 128 //To be filled in with an offset of the field we're looking for
96 fieldDescriptor fd; 129 fieldDescriptor fd;
97 130
98 klassOop res = ik->find_field(name_symbol, signature_symbol, &fd); 131 Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
99 if (res == NULL) { 132 if (res == NULL) {
100 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), 133 tty->print_cr("Invalid layout of %s at %s", ik->external_name(),
101 name_symbol->as_C_string()); 134 name_symbol->as_C_string());
102 fatal("Invalid layout of preloaded class"); 135 fatal("Invalid layout of preloaded class");
103 } 136 }
131 #define CC (char*) 164 #define CC (char*)
132 165
133 static JNINativeMethod methods[] = { 166 static JNINativeMethod methods[] = {
134 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress }, 167 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress },
135 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize }, 168 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize },
169 {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive },
136 {CC "parseCommandLine", 170 {CC "parseCommandLine",
137 CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;", 171 CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
138 (void*) &WB_ParseCommandLine 172 (void*) &WB_ParseCommandLine
139 }, 173 },
140 #ifndef SERIALGC 174 #ifndef SERIALGC