comparison src/share/vm/classfile/classLoader.cpp @ 875:6a93908f268f

6857194: Add hotspot perf counters to aid class loading performance measurement Summary: Add new jvmstat counters to measure detailed class loading time Reviewed-by: acorn, kamg
author mchung
date Fri, 10 Jul 2009 11:10:00 -0700
parents 3ec1ff9307d6
children 66b0f834a440
comparison
equal deleted inserted replaced
812:85d0690f7d12 875:6a93908f268f
46 // Globals 46 // Globals
47 47
48 PerfCounter* ClassLoader::_perf_accumulated_time = NULL; 48 PerfCounter* ClassLoader::_perf_accumulated_time = NULL;
49 PerfCounter* ClassLoader::_perf_classes_inited = NULL; 49 PerfCounter* ClassLoader::_perf_classes_inited = NULL;
50 PerfCounter* ClassLoader::_perf_class_init_time = NULL; 50 PerfCounter* ClassLoader::_perf_class_init_time = NULL;
51 PerfCounter* ClassLoader::_perf_class_init_selftime = NULL;
52 PerfCounter* ClassLoader::_perf_classes_verified = NULL;
51 PerfCounter* ClassLoader::_perf_class_verify_time = NULL; 53 PerfCounter* ClassLoader::_perf_class_verify_time = NULL;
54 PerfCounter* ClassLoader::_perf_class_verify_selftime = NULL;
52 PerfCounter* ClassLoader::_perf_classes_linked = NULL; 55 PerfCounter* ClassLoader::_perf_classes_linked = NULL;
53 PerfCounter* ClassLoader::_perf_class_link_time = NULL; 56 PerfCounter* ClassLoader::_perf_class_link_time = NULL;
57 PerfCounter* ClassLoader::_perf_class_link_selftime = NULL;
58 PerfCounter* ClassLoader::_perf_class_parse_time = NULL;
59 PerfCounter* ClassLoader::_perf_class_parse_selftime = NULL;
60 PerfCounter* ClassLoader::_perf_sys_class_lookup_time = NULL;
61 PerfCounter* ClassLoader::_perf_shared_classload_time = NULL;
62 PerfCounter* ClassLoader::_perf_sys_classload_time = NULL;
63 PerfCounter* ClassLoader::_perf_app_classload_time = NULL;
64 PerfCounter* ClassLoader::_perf_app_classload_selftime = NULL;
65 PerfCounter* ClassLoader::_perf_app_classload_count = NULL;
66 PerfCounter* ClassLoader::_perf_define_appclasses = NULL;
67 PerfCounter* ClassLoader::_perf_define_appclass_time = NULL;
68 PerfCounter* ClassLoader::_perf_define_appclass_selftime = NULL;
69 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = NULL;
70 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = NULL;
54 PerfCounter* ClassLoader::_sync_systemLoaderLockContentionRate = NULL; 71 PerfCounter* ClassLoader::_sync_systemLoaderLockContentionRate = NULL;
55 PerfCounter* ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL; 72 PerfCounter* ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL;
56 PerfCounter* ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL; 73 PerfCounter* ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL;
57 PerfCounter* ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL; 74 PerfCounter* ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL;
58 PerfCounter* ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL; 75 PerfCounter* ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL;
150 size_t num_read = os::read(file_handle, (char*) buffer, st.st_size); 167 size_t num_read = os::read(file_handle, (char*) buffer, st.st_size);
151 // close file 168 // close file
152 hpi::close(file_handle); 169 hpi::close(file_handle);
153 // construct ClassFileStream 170 // construct ClassFileStream
154 if (num_read == (size_t)st.st_size) { 171 if (num_read == (size_t)st.st_size) {
172 if (UsePerfData) {
173 ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
174 }
155 return new ClassFileStream(buffer, st.st_size, _dir); // Resource allocated 175 return new ClassFileStream(buffer, st.st_size, _dir); // Resource allocated
156 } 176 }
157 } 177 }
158 } 178 }
159 return NULL; 179 return NULL;
195 !(*ReadMappedEntry)(_zip, entry, &buffer, filename)) { 215 !(*ReadMappedEntry)(_zip, entry, &buffer, filename)) {
196 // mmaped access not available, perhaps due to compression, 216 // mmaped access not available, perhaps due to compression,
197 // read contents into resource array 217 // read contents into resource array
198 buffer = NEW_RESOURCE_ARRAY(u1, filesize); 218 buffer = NEW_RESOURCE_ARRAY(u1, filesize);
199 if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL; 219 if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL;
220 }
221 if (UsePerfData) {
222 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
200 } 223 }
201 // return result 224 // return result
202 return new ClassFileStream(buffer, filesize, _zip_name); // Resource allocated 225 return new ClassFileStream(buffer, filesize, _zip_name); // Resource allocated
203 } 226 }
204 227
823 846
824 // Lookup stream for parsing .class file 847 // Lookup stream for parsing .class file
825 ClassFileStream* stream = NULL; 848 ClassFileStream* stream = NULL;
826 int classpath_index = 0; 849 int classpath_index = 0;
827 { 850 {
828 PerfTraceTime vmtimer(perf_accumulated_time()); 851 PerfClassTraceTime vmtimer(perf_sys_class_lookup_time(),
852 ((JavaThread*) THREAD)->get_thread_stat()->perf_timers_addr(),
853 PerfClassTraceTime::CLASS_LOAD);
829 ClassPathEntry* e = _first_entry; 854 ClassPathEntry* e = _first_entry;
830 while (e != NULL) { 855 while (e != NULL) {
831 stream = e->open_stream(name); 856 stream = e->open_stream(name);
832 if (stream != NULL) { 857 if (stream != NULL) {
833 break; 858 break;
888 913
889 if (UsePerfData) { 914 if (UsePerfData) {
890 // jvmstat performance counters 915 // jvmstat performance counters
891 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time"); 916 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
892 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime"); 917 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
918 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
893 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime"); 919 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
920 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
894 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime"); 921 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
895 922 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
896 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses"); 923 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
897 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses"); 924 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
925 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
926
927 NEWPERFTICKCOUNTER(_perf_class_parse_time, SUN_CLS, "parseClassTime");
928 NEWPERFTICKCOUNTER(_perf_class_parse_selftime, SUN_CLS, "parseClassTime.self");
929 NEWPERFTICKCOUNTER(_perf_sys_class_lookup_time, SUN_CLS, "lookupSysClassTime");
930 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
931 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
932 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
933 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
934 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
935 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
936 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
937 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
938 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
939 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
940
898 941
899 // The following performance counters are added for measuring the impact 942 // The following performance counters are added for measuring the impact
900 // of the bug fix of 6365597. They are mainly focused on finding out 943 // of the bug fix of 6365597. They are mainly focused on finding out
901 // the behavior of system & user-defined classloader lock, whether 944 // the behavior of system & user-defined classloader lock, whether
902 // ClassLoader.loadClass/findClass is being called synchronized or not. 945 // ClassLoader.loadClass/findClass is being called synchronized or not.