1.1 --- a/src/share/vm/classfile/systemDictionary.cpp Thu Aug 01 03:44:03 2019 +0100 1.2 +++ b/src/share/vm/classfile/systemDictionary.cpp Mon Aug 12 18:30:40 2019 +0300 1.3 @@ -38,6 +38,7 @@ 1.4 #include "compiler/compileBroker.hpp" 1.5 #include "interpreter/bytecodeStream.hpp" 1.6 #include "interpreter/interpreter.hpp" 1.7 +#include "jfr/jfrEvents.hpp" 1.8 #include "memory/filemap.hpp" 1.9 #include "memory/gcLocker.hpp" 1.10 #include "memory/oopFactory.hpp" 1.11 @@ -64,9 +65,6 @@ 1.12 #include "services/threadService.hpp" 1.13 #include "utilities/macros.hpp" 1.14 #include "utilities/ticks.hpp" 1.15 -#if INCLUDE_TRACE 1.16 -#include "trace/tracing.hpp" 1.17 -#endif 1.18 1.19 Dictionary* SystemDictionary::_dictionary = NULL; 1.20 PlaceholderTable* SystemDictionary::_placeholders = NULL; 1.21 @@ -598,6 +596,22 @@ 1.22 return (nh); 1.23 } 1.24 1.25 +// utility function for class load event 1.26 +static void post_class_load_event(EventClassLoad &event, 1.27 + instanceKlassHandle k, 1.28 + Handle initiating_loader) { 1.29 +#if INCLUDE_JFR 1.30 + if (event.should_commit()) { 1.31 + event.set_loadedClass(k()); 1.32 + event.set_definingClassLoader(k->class_loader_data()); 1.33 + oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader(); 1.34 + event.set_initiatingClassLoader(class_loader != NULL ? 1.35 + ClassLoaderData::class_loader_data_or_null(class_loader) : 1.36 + (ClassLoaderData*)NULL); 1.37 + event.commit(); 1.38 + } 1.39 +#endif // INCLUDE_JFR 1.40 +} 1.41 1.42 Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, 1.43 Handle class_loader, 1.44 @@ -606,7 +620,7 @@ 1.45 assert(name != NULL && !FieldType::is_array(name) && 1.46 !FieldType::is_obj(name), "invalid class name"); 1.47 1.48 - Ticks class_load_start_time = Ticks::now(); 1.49 + EventClassLoad class_load_start_event; 1.50 1.51 // UseNewReflection 1.52 // Fix for 4474172; see evaluation for more details 1.53 @@ -857,7 +871,7 @@ 1.54 return NULL; 1.55 } 1.56 1.57 - post_class_load_event(class_load_start_time, k, class_loader); 1.58 + post_class_load_event(class_load_start_event, k, class_loader); 1.59 1.60 #ifdef ASSERT 1.61 { 1.62 @@ -982,7 +996,7 @@ 1.63 TRAPS) { 1.64 TempNewSymbol parsed_name = NULL; 1.65 1.66 - Ticks class_load_start_time = Ticks::now(); 1.67 + EventClassLoad class_load_start_event; 1.68 1.69 ClassLoaderData* loader_data; 1.70 if (host_klass.not_null()) { 1.71 @@ -1043,7 +1057,7 @@ 1.72 JvmtiExport::post_class_load((JavaThread *) THREAD, k()); 1.73 } 1.74 1.75 - post_class_load_event(class_load_start_time, k, class_loader); 1.76 + post_class_load_event(class_load_start_event, k, class_loader); 1.77 } 1.78 assert(host_klass.not_null() || cp_patches == NULL, 1.79 "cp_patches only found with host_klass"); 1.80 @@ -1085,12 +1099,13 @@ 1.81 // 1.82 // Note: "name" is updated. 1.83 1.84 - instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name, 1.85 - loader_data, 1.86 - protection_domain, 1.87 - parsed_name, 1.88 - verify, 1.89 - THREAD); 1.90 + ClassFileParser parser(st); 1.91 + instanceKlassHandle k = parser.parseClassFile(class_name, 1.92 + loader_data, 1.93 + protection_domain, 1.94 + parsed_name, 1.95 + verify, 1.96 + THREAD); 1.97 1.98 const char* pkg = "java/"; 1.99 size_t pkglen = strlen(pkg); 1.100 @@ -1125,6 +1140,14 @@ 1.101 assert(is_internal_format(parsed_name), 1.102 "external class name format used internally"); 1.103 1.104 +#if INCLUDE_JFR 1.105 + { 1.106 + InstanceKlass* ik = k(); 1.107 + ON_KLASS_CREATION(ik, parser, THREAD); 1.108 + k = instanceKlassHandle(ik); 1.109 + } 1.110 +#endif 1.111 + 1.112 // Add class just loaded 1.113 // If a class loader supports parallel classloading handle parallel define requests 1.114 // find_or_define_instance_class may return a different InstanceKlass 1.115 @@ -1385,6 +1408,15 @@ 1.116 } 1.117 } 1.118 1.119 +static void post_class_define_event(InstanceKlass* k, const ClassLoaderData* def_cld) { 1.120 + EventClassDefine event; 1.121 + if (event.should_commit()) { 1.122 + event.set_definedClass(k); 1.123 + event.set_definingClassLoader(def_cld); 1.124 + event.commit(); 1.125 + } 1.126 +} 1.127 + 1.128 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { 1.129 1.130 ClassLoaderData* loader_data = k->class_loader_data(); 1.131 @@ -1455,6 +1487,7 @@ 1.132 1.133 } 1.134 1.135 + post_class_define_event(k(), loader_data); 1.136 } 1.137 1.138 // Support parallel classloading 1.139 @@ -2687,26 +2720,6 @@ 1.140 constraints()->verify(dictionary(), placeholders()); 1.141 } 1.142 1.143 -// utility function for class load event 1.144 -void SystemDictionary::post_class_load_event(const Ticks& start_time, 1.145 - instanceKlassHandle k, 1.146 - Handle initiating_loader) { 1.147 -#if INCLUDE_TRACE 1.148 - EventClassLoad event(UNTIMED); 1.149 - if (event.should_commit()) { 1.150 - event.set_starttime(start_time); 1.151 - event.set_loadedClass(k()); 1.152 - oop defining_class_loader = k->class_loader(); 1.153 - event.set_definingClassLoader(defining_class_loader != NULL ? 1.154 - defining_class_loader->klass() : (Klass*)NULL); 1.155 - oop class_loader = initiating_loader.is_null() ? (oop)NULL : initiating_loader(); 1.156 - event.set_initiatingClassLoader(class_loader != NULL ? 1.157 - class_loader->klass() : (Klass*)NULL); 1.158 - event.commit(); 1.159 - } 1.160 -#endif // INCLUDE_TRACE 1.161 -} 1.162 - 1.163 #ifndef PRODUCT 1.164 1.165 // statistics code