Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/jvm.cpp @ 657:715dceaa89b7
6603316: Improve instrumentation for classes loaded at startup
Reviewed-by: xlu, mchung
author | acorn |
---|---|
date | Wed, 25 Mar 2009 13:09:28 -0400 |
parents | 0fbdb4381b99 |
children | d3676b4cb78c |
comparison
equal
deleted
inserted
replaced
655:60bfce711da4 | 657:715dceaa89b7 |
---|---|
62 | 62 |
63 static void trace_class_resolution_impl(klassOop to_class, TRAPS) { | 63 static void trace_class_resolution_impl(klassOop to_class, TRAPS) { |
64 ResourceMark rm; | 64 ResourceMark rm; |
65 int line_number = -1; | 65 int line_number = -1; |
66 const char * source_file = NULL; | 66 const char * source_file = NULL; |
67 const char * trace = "explicit"; | |
67 klassOop caller = NULL; | 68 klassOop caller = NULL; |
68 JavaThread* jthread = JavaThread::current(); | 69 JavaThread* jthread = JavaThread::current(); |
69 if (jthread->has_last_Java_frame()) { | 70 if (jthread->has_last_Java_frame()) { |
70 vframeStream vfst(jthread); | 71 vframeStream vfst(jthread); |
71 | 72 |
105 instanceKlass::cast(last_caller->method_holder())->name() == | 106 instanceKlass::cast(last_caller->method_holder())->name() == |
106 vmSymbols::java_lang_ClassLoader() && | 107 vmSymbols::java_lang_ClassLoader() && |
107 (last_caller->name() == vmSymbols::loadClassInternal_name() || | 108 (last_caller->name() == vmSymbols::loadClassInternal_name() || |
108 last_caller->name() == vmSymbols::loadClass_name())) { | 109 last_caller->name() == vmSymbols::loadClass_name())) { |
109 found_it = true; | 110 found_it = true; |
111 } else if (!vfst.at_end()) { | |
112 if (vfst.method()->is_native()) { | |
113 // JNI call | |
114 found_it = true; | |
115 } | |
110 } | 116 } |
111 if (found_it && !vfst.at_end()) { | 117 if (found_it && !vfst.at_end()) { |
112 // found the caller | 118 // found the caller |
113 caller = vfst.method()->method_holder(); | 119 caller = vfst.method()->method_holder(); |
114 line_number = vfst.method()->line_number_from_bci(vfst.bci()); | 120 line_number = vfst.method()->line_number_from_bci(vfst.bci()); |
115 symbolOop s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name(); | 121 if (line_number == -1) { |
122 // show method name if it's a native method | |
123 trace = vfst.method()->name_and_sig_as_C_string(); | |
124 } | |
125 symbolOop s = instanceKlass::cast(caller)->source_file_name(); | |
116 if (s != NULL) { | 126 if (s != NULL) { |
117 source_file = s->as_C_string(); | 127 source_file = s->as_C_string(); |
118 } | 128 } |
119 } | 129 } |
120 } | 130 } |
122 if (to_class != caller) { | 132 if (to_class != caller) { |
123 const char * from = Klass::cast(caller)->external_name(); | 133 const char * from = Klass::cast(caller)->external_name(); |
124 const char * to = Klass::cast(to_class)->external_name(); | 134 const char * to = Klass::cast(to_class)->external_name(); |
125 // print in a single call to reduce interleaving between threads | 135 // print in a single call to reduce interleaving between threads |
126 if (source_file != NULL) { | 136 if (source_file != NULL) { |
127 tty->print("RESOLVE %s %s %s:%d (explicit)\n", from, to, source_file, line_number); | 137 tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace); |
128 } else { | 138 } else { |
129 tty->print("RESOLVE %s %s (explicit)\n", from, to); | 139 tty->print("RESOLVE %s %s (%s)\n", from, to, trace); |
130 } | 140 } |
131 } | 141 } |
132 } | 142 } |
133 } | 143 } |
134 | 144 |
135 static void trace_class_resolution(klassOop to_class) { | 145 void trace_class_resolution(klassOop to_class) { |
136 EXCEPTION_MARK; | 146 EXCEPTION_MARK; |
137 trace_class_resolution_impl(to_class, THREAD); | 147 trace_class_resolution_impl(to_class, THREAD); |
138 if (HAS_PENDING_EXCEPTION) { | 148 if (HAS_PENDING_EXCEPTION) { |
139 CLEAR_PENDING_EXCEPTION; | 149 CLEAR_PENDING_EXCEPTION; |
140 } | 150 } |
3211 loader = instanceKlass::cast(curr_klass_oop)->class_loader(); | 3221 loader = instanceKlass::cast(curr_klass_oop)->class_loader(); |
3212 protection_domain = instanceKlass::cast(curr_klass_oop)->protection_domain(); | 3222 protection_domain = instanceKlass::cast(curr_klass_oop)->protection_domain(); |
3213 } | 3223 } |
3214 Handle h_loader(THREAD, loader); | 3224 Handle h_loader(THREAD, loader); |
3215 Handle h_prot (THREAD, protection_domain); | 3225 Handle h_prot (THREAD, protection_domain); |
3216 return find_class_from_class_loader(env, name, true, h_loader, h_prot, | 3226 jclass result = find_class_from_class_loader(env, name, true, h_loader, h_prot, |
3217 false, thread); | 3227 false, thread); |
3228 if (TraceClassResolution && result != NULL) { | |
3229 trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result))); | |
3230 } | |
3231 return result; | |
3218 JVM_END | 3232 JVM_END |
3219 | 3233 |
3220 | 3234 |
3221 // Array /////////////////////////////////////////////////////////////////////////////////////////// | 3235 // Array /////////////////////////////////////////////////////////////////////////////////////////// |
3222 | 3236 |