51 #include "logging/logTag.hpp"
52 #include "memory/allocation.inline.hpp"
53 #include "memory/oopFactory.hpp"
54 #include "memory/resourceArea.hpp"
55 #include "memory/universe.hpp"
56 #include "oops/instanceKlass.hpp"
57 #include "oops/instanceRefKlass.hpp"
58 #include "oops/klass.inline.hpp"
59 #include "oops/method.inline.hpp"
60 #include "oops/objArrayOop.inline.hpp"
61 #include "oops/oop.inline.hpp"
62 #include "oops/symbol.hpp"
63 #include "prims/jvm_misc.hpp"
64 #include "runtime/arguments.hpp"
65 #include "runtime/handles.inline.hpp"
66 #include "runtime/init.hpp"
67 #include "runtime/interfaceSupport.inline.hpp"
68 #include "runtime/java.hpp"
69 #include "runtime/javaCalls.hpp"
70 #include "runtime/os.hpp"
71 #include "runtime/perfData.hpp"
72 #include "runtime/threadCritical.hpp"
73 #include "runtime/timer.hpp"
74 #include "runtime/vm_version.hpp"
75 #include "services/management.hpp"
76 #include "services/threadService.hpp"
77 #include "utilities/checkedCast.hpp"
78 #include "utilities/classpathStream.hpp"
79 #include "utilities/events.hpp"
80 #include "utilities/macros.hpp"
81 #include "utilities/ostream.hpp"
82 #include "utilities/utf8.hpp"
83
84 #include <stdlib.h>
85 #include <ctype.h>
86
87 // Entry point in java.dll for path canonicalization
88
89 typedef int (*canonicalize_fn_t)(const char *orig, char *out, int len);
90
91 static canonicalize_fn_t CanonicalizeEntry = nullptr;
92
93 // Entry points for jimage.dll for loading jimage file entries
94
95 static JImageOpen_t JImageOpen = nullptr;
96 static JImageClose_t JImageClose = nullptr;
97 static JImageFindResource_t JImageFindResource = nullptr;
98 static JImageGetResource_t JImageGetResource = nullptr;
99
100 // JimageFile pointer, or null if exploded JDK build.
101 static JImageFile* JImage_file = nullptr;
102
103 // Globals
104
105 PerfCounter* ClassLoader::_perf_accumulated_time = nullptr;
106 PerfCounter* ClassLoader::_perf_classes_inited = nullptr;
107 PerfCounter* ClassLoader::_perf_class_init_time = nullptr;
108 PerfCounter* ClassLoader::_perf_class_init_selftime = nullptr;
109 PerfCounter* ClassLoader::_perf_classes_verified = nullptr;
110 PerfCounter* ClassLoader::_perf_class_verify_time = nullptr;
111 PerfCounter* ClassLoader::_perf_class_verify_selftime = nullptr;
112 PerfCounter* ClassLoader::_perf_classes_linked = nullptr;
113 PerfCounter* ClassLoader::_perf_class_link_time = nullptr;
114 PerfCounter* ClassLoader::_perf_class_link_selftime = nullptr;
115 PerfCounter* ClassLoader::_perf_shared_classload_time = nullptr;
116 PerfCounter* ClassLoader::_perf_sys_classload_time = nullptr;
117 PerfCounter* ClassLoader::_perf_app_classload_time = nullptr;
118 PerfCounter* ClassLoader::_perf_app_classload_selftime = nullptr;
119 PerfCounter* ClassLoader::_perf_app_classload_count = nullptr;
120 PerfCounter* ClassLoader::_perf_define_appclasses = nullptr;
121 PerfCounter* ClassLoader::_perf_define_appclass_time = nullptr;
122 PerfCounter* ClassLoader::_perf_define_appclass_selftime = nullptr;
123 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = nullptr;
124 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = nullptr;
125 PerfCounter* ClassLoader::_perf_ik_link_methods_time = nullptr;
126 PerfCounter* ClassLoader::_perf_method_adapters_time = nullptr;
127 PerfCounter* ClassLoader::_perf_ik_link_methods_count = nullptr;
128 PerfCounter* ClassLoader::_perf_method_adapters_count = nullptr;
129 PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = nullptr;
130 PerfCounter* ClassLoader::_perf_secondary_hash_time = nullptr;
131
132 PerfCounter* ClassLoader::_perf_resolve_indy_time = nullptr;
133 PerfCounter* ClassLoader::_perf_resolve_invokehandle_time = nullptr;
134 PerfCounter* ClassLoader::_perf_resolve_mh_time = nullptr;
135 PerfCounter* ClassLoader::_perf_resolve_mt_time = nullptr;
136
137 PerfCounter* ClassLoader::_perf_resolve_indy_count = nullptr;
138 PerfCounter* ClassLoader::_perf_resolve_invokehandle_count = nullptr;
139 PerfCounter* ClassLoader::_perf_resolve_mh_count = nullptr;
140 PerfCounter* ClassLoader::_perf_resolve_mt_count = nullptr;
141
142 void ClassLoader::print_counters(outputStream *st) {
143 st->print_cr("ClassLoader:");
144 st->print_cr(" clinit: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", ClassLoader::class_init_time_ms(), ClassLoader::class_init_count());
145 st->print_cr(" link methods: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_ik_link_methods_time->get_value()) , _perf_ik_link_methods_count->get_value());
146 st->print_cr(" method adapters: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_method_adapters_time->get_value()) , _perf_method_adapters_count->get_value());
147 st->print_cr(" resolve...");
148 st->print_cr(" invokedynamic: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_indy_time->get_value()) , _perf_resolve_indy_count->get_value());
149 st->print_cr(" invokehandle: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_invokehandle_time->get_value()) , _perf_resolve_invokehandle_count->get_value());
150 st->print_cr(" CP_MethodHandle: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mh_time->get_value()) , _perf_resolve_mh_count->get_value());
151 st->print_cr(" CP_MethodType: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mt_time->get_value()) , _perf_resolve_mt_count->get_value());
152 st->cr();
153 }
154
155 GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = nullptr;
156 GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = nullptr;
157 ClassPathEntry* ClassLoader::_jrt_entry = nullptr;
158
159 ClassPathEntry* volatile ClassLoader::_first_append_entry_list = nullptr;
160 ClassPathEntry* volatile ClassLoader::_last_append_entry = nullptr;
161 #if INCLUDE_CDS
162 ClassPathEntry* ClassLoader::_app_classpath_entries = nullptr;
163 ClassPathEntry* ClassLoader::_last_app_classpath_entry = nullptr;
164 ClassPathEntry* ClassLoader::_module_path_entries = nullptr;
165 ClassPathEntry* ClassLoader::_last_module_path_entry = nullptr;
166 #endif
167
168 // helper routines
169 #if INCLUDE_CDS
170 static bool string_starts_with(const char* str, const char* str_to_find) {
171 size_t str_len = strlen(str);
172 size_t str_to_find_len = strlen(str_to_find);
285 }
286 #ifdef ASSERT
287 // Freeing path is a no-op here as buffer prevents it from being reclaimed. But we keep it for
288 // debug builds so that we guard against use-after-free bugs.
289 FREE_RESOURCE_ARRAY_IN_THREAD(current, char, path, path_len);
290 #endif
291 // We don't verify the length of the classfile stream fits in an int, but this is the
292 // bootloader so we have control of this.
293 // Resource allocated
294 return new ClassFileStream(buffer,
295 checked_cast<int>(st.st_size),
296 _dir);
297 }
298 }
299 }
300 FREE_RESOURCE_ARRAY_IN_THREAD(current, char, path, path_len);
301 return nullptr;
302 }
303
304 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name,
305 bool is_boot_append, bool from_class_path_attr, bool multi_release) : ClassPathEntry() {
306 _zip = zip;
307 _zip_name = copy_path(zip_name);
308 _from_class_path_attr = from_class_path_attr;
309 _multi_release = multi_release;
310 }
311
312 ClassPathZipEntry::~ClassPathZipEntry() {
313 ZipLibrary::close(_zip);
314 FREE_C_HEAP_ARRAY(char, _zip_name);
315 }
316
317 u1* ClassPathZipEntry::open_entry(JavaThread* current, const char* name, jint* filesize, bool nul_terminate) {
318 // enable call to C land
319 ThreadToNativeFromVM ttn(current);
320 // check whether zip archive contains name
321 jint name_len;
322 jzentry* entry = ZipLibrary::find_entry(_zip, name, filesize, &name_len);
323 if (entry == nullptr) return nullptr;
324 u1* buffer;
325 char name_buf[128];
326 char* filename;
327 if (name_len < 128) {
328 filename = name_buf;
329 } else {
330 filename = NEW_RESOURCE_ARRAY(char, name_len + 1);
331 }
332
333 // read contents into resource array
334 size_t size = (uint32_t)(*filesize);
335 if (nul_terminate) {
336 if (sizeof(size) == sizeof(uint32_t) && size == UINT_MAX) {
337 return nullptr; // 32-bit integer overflow will occur.
338 }
339 size++;
340 }
341 buffer = NEW_RESOURCE_ARRAY(u1, size);
342 if (!ZipLibrary::read_entry(_zip, entry, buffer, filename)) {
343 return nullptr;
344 }
345
346 // return result
347 if (nul_terminate) {
348 buffer[size - 1] = 0;
349 }
350 return buffer;
351 }
352
353 ClassFileStream* ClassPathZipEntry::open_stream(JavaThread* current, const char* name) {
354 jint filesize;
355 u1* buffer = open_entry(current, name, &filesize, false);
356 if (buffer == nullptr) {
357 return nullptr;
358 }
359 if (UsePerfData) {
360 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
523
524 void ClassLoader::setup_bootstrap_search_path(JavaThread* current) {
525 const char* bootcp = Arguments::get_boot_class_path();
526 assert(bootcp != nullptr, "Boot class path must not be nullptr");
527 if (PrintSharedArchiveAndExit) {
528 // Don't print bootcp - this is the bootcp of this current VM process, not necessarily
529 // the same as the boot classpath of the shared archive.
530 } else {
531 trace_class_path("bootstrap loader class path=", bootcp);
532 }
533 setup_bootstrap_search_path_impl(current, bootcp);
534 }
535
536 #if INCLUDE_CDS
537 void ClassLoader::setup_app_search_path(JavaThread* current, const char *class_path) {
538 assert(CDSConfig::is_dumping_archive(), "sanity");
539
540 ResourceMark rm(current);
541 ClasspathStream cp_stream(class_path);
542
543 while (cp_stream.has_next()) {
544 const char* path = cp_stream.get_next();
545 update_class_path_entry_list(current, path, /* check_for_duplicates */ true,
546 /* is_boot_append */ false, /* from_class_path_attr */ false);
547 }
548 }
549
550 void ClassLoader::add_to_module_path_entries(const char* path,
551 ClassPathEntry* entry) {
552 assert(entry != nullptr, "ClassPathEntry should not be nullptr");
553 assert(CDSConfig::is_dumping_archive(), "sanity");
554
555 // The entry does not exist, add to the list
556 if (_module_path_entries == nullptr) {
557 assert(_last_module_path_entry == nullptr, "Sanity");
558 _module_path_entries = _last_module_path_entry = entry;
559 } else {
560 _last_module_path_entry->set_next(entry);
561 _last_module_path_entry = entry;
562 }
563 }
564
565 // Add a module path to the _module_path_entries list.
566 void ClassLoader::setup_module_search_path(JavaThread* current, const char* path) {
567 assert(CDSConfig::is_dumping_archive(), "sanity");
747 return ZipLibrary::open(canonical_path, error_msg);
748 }
749
750 ClassPathEntry* ClassLoader::create_class_path_entry(JavaThread* current,
751 const char *path, const struct stat* st,
752 bool is_boot_append,
753 bool from_class_path_attr,
754 bool is_multi_release) {
755 ClassPathEntry* new_entry = nullptr;
756 if ((st->st_mode & S_IFMT) == S_IFREG) {
757 ResourceMark rm(current);
758 // Regular file, should be a zip file
759 // Canonicalized filename
760 const char* canonical_path = get_canonical_path(path, current);
761 if (canonical_path == nullptr) {
762 return nullptr;
763 }
764 char* error_msg = nullptr;
765 jzfile* zip = open_zip_file(canonical_path, &error_msg, current);
766 if (zip != nullptr && error_msg == nullptr) {
767 new_entry = new ClassPathZipEntry(zip, path, is_boot_append, from_class_path_attr, is_multi_release);
768 } else {
769 #if INCLUDE_CDS
770 ClassLoaderExt::set_has_non_jar_in_classpath();
771 #endif
772 return nullptr;
773 }
774 log_info(class, path)("opened: %s", path);
775 log_info(class, load)("opened: %s", path);
776 } else {
777 // Directory
778 new_entry = new ClassPathDirEntry(path);
779 log_info(class, load)("path: %s", path);
780 }
781 return new_entry;
782 }
783
784
785 // Create a class path zip entry for a given path (return null if not found
786 // or zip/JAR file cannot be opened)
787 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path, bool is_boot_append) {
788 // check for a regular file
789 struct stat st;
790 if (os::stat(path, &st) == 0) {
791 if ((st.st_mode & S_IFMT) == S_IFREG) {
792 JavaThread* thread = JavaThread::current();
793 ResourceMark rm(thread);
794 const char* canonical_path = get_canonical_path(path, thread);
795 if (canonical_path != nullptr) {
796 char* error_msg = nullptr;
797 jzfile* zip = open_zip_file(canonical_path, &error_msg, thread);
798 if (zip != nullptr && error_msg == nullptr) {
799 // create using canonical path
800 return new ClassPathZipEntry(zip, canonical_path, is_boot_append, false, false);
801 }
802 }
803 }
804 }
805 return nullptr;
806 }
807
808 // The boot append entries are added with a lock, and read lock free.
809 void ClassLoader::add_to_boot_append_entries(ClassPathEntry *new_entry) {
810 if (new_entry != nullptr) {
811 MutexLocker ml(Bootclasspath_lock, Mutex::_no_safepoint_check_flag);
812 if (_last_append_entry == nullptr) {
813 _last_append_entry = new_entry;
814 assert(first_append_entry() == nullptr, "boot loader's append class path entry list not empty");
815 Atomic::release_store(&_first_append_entry_list, new_entry);
816 } else {
817 _last_append_entry->set_next(new_entry);
818 _last_append_entry = new_entry;
819 }
820 }
1440 #endif // INCLUDE_CDS
1441
1442 // Initialize the class loader's access to methods in libzip. Parse and
1443 // process the boot classpath into a list ClassPathEntry objects. Once
1444 // this list has been created, it must not change order (see class PackageInfo)
1445 // it can be appended to and is by jvmti.
1446
1447 void ClassLoader::initialize(TRAPS) {
1448 if (UsePerfData) {
1449 // jvmstat performance counters
1450 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
1451 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
1452 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
1453 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
1454 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
1455 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
1456 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
1457 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
1458 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
1459 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
1460
1461 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
1462 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
1463 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
1464 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
1465 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
1466 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
1467 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
1468 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
1469 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
1470 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
1471 NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS, "unsafeDefineClassCalls");
1472 NEWPERFTICKCOUNTER(_perf_secondary_hash_time, SUN_CLS, "secondarySuperHashTime");
1473
1474 if (log_is_enabled(Info, perf, class, link)) {
1475 NEWPERFTICKCOUNTER(_perf_ik_link_methods_time, SUN_CLS, "linkMethodsTime");
1476 NEWPERFTICKCOUNTER(_perf_method_adapters_time, SUN_CLS, "makeAdaptersTime");
1477 NEWPERFEVENTCOUNTER(_perf_ik_link_methods_count, SUN_CLS, "linkMethodsCount");
1478 NEWPERFEVENTCOUNTER(_perf_method_adapters_count, SUN_CLS, "makeAdaptersCount");
1479
1480 NEWPERFTICKCOUNTER(_perf_resolve_indy_time, SUN_CLS, "resolve_invokedynamic_time");
1481 NEWPERFTICKCOUNTER(_perf_resolve_invokehandle_time, SUN_CLS, "resolve_invokehandle_time");
1482 NEWPERFTICKCOUNTER(_perf_resolve_mh_time, SUN_CLS, "resolve_MethodHandle_time");
1483 NEWPERFTICKCOUNTER(_perf_resolve_mt_time, SUN_CLS, "resolve_MethodType_time");
1484
1485 NEWPERFEVENTCOUNTER(_perf_resolve_indy_count, SUN_CLS, "resolve_invokedynamic_count");
1486 NEWPERFEVENTCOUNTER(_perf_resolve_invokehandle_count, SUN_CLS, "resolve_invokehandle_count");
1487 NEWPERFEVENTCOUNTER(_perf_resolve_mh_count, SUN_CLS, "resolve_MethodHandle_count");
1488 NEWPERFEVENTCOUNTER(_perf_resolve_mt_count, SUN_CLS, "resolve_MethodType_count");
1489 }
1490 }
1491
1492 // lookup java library entry points
1493 load_java_library();
1494 // jimage library entry points are loaded below, in lookup_vm_options
1495 setup_bootstrap_search_path(THREAD);
1496 }
1497
1498 static char* lookup_vm_resource(JImageFile *jimage, const char *jimage_version, const char *path) {
1499 jlong size;
1500 JImageLocationRef location = (*JImageFindResource)(jimage, "java.base", jimage_version, path, &size);
1501 if (location == 0)
1502 return nullptr;
1503 char *val = NEW_C_HEAP_ARRAY(char, size+1, mtClass);
1556
1557 // Helper function used by CDS code to get the number of module path
1558 // entries during shared classpath setup time.
1559 int ClassLoader::num_module_path_entries() {
1560 assert(CDSConfig::is_dumping_archive(), "sanity");
1561 int num_entries = 0;
1562 ClassPathEntry* e= ClassLoader::_module_path_entries;
1563 while (e != nullptr) {
1564 num_entries ++;
1565 e = e->next();
1566 }
1567 return num_entries;
1568 }
1569 #endif
1570
1571 jlong ClassLoader::classloader_time_ms() {
1572 return UsePerfData ?
1573 Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1;
1574 }
1575
1576 jlong ClassLoader::class_init_count() {
1577 return UsePerfData ? _perf_classes_inited->get_value() : -1;
1578 }
1579
1580 jlong ClassLoader::class_init_time_ms() {
1581 return UsePerfData ?
1582 Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1;
1583 }
1584
1585 jlong ClassLoader::class_verify_time_ms() {
1586 return UsePerfData ?
1587 Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1;
1588 }
1589
1590 jlong ClassLoader::class_link_count() {
1591 return UsePerfData ? _perf_classes_linked->get_value() : -1;
1592 }
1593
1594 jlong ClassLoader::class_link_time_ms() {
1595 return UsePerfData ?
|
51 #include "logging/logTag.hpp"
52 #include "memory/allocation.inline.hpp"
53 #include "memory/oopFactory.hpp"
54 #include "memory/resourceArea.hpp"
55 #include "memory/universe.hpp"
56 #include "oops/instanceKlass.hpp"
57 #include "oops/instanceRefKlass.hpp"
58 #include "oops/klass.inline.hpp"
59 #include "oops/method.inline.hpp"
60 #include "oops/objArrayOop.inline.hpp"
61 #include "oops/oop.inline.hpp"
62 #include "oops/symbol.hpp"
63 #include "prims/jvm_misc.hpp"
64 #include "runtime/arguments.hpp"
65 #include "runtime/handles.inline.hpp"
66 #include "runtime/init.hpp"
67 #include "runtime/interfaceSupport.inline.hpp"
68 #include "runtime/java.hpp"
69 #include "runtime/javaCalls.hpp"
70 #include "runtime/os.hpp"
71 #include "runtime/perfData.inline.hpp"
72 #include "runtime/threadCritical.hpp"
73 #include "runtime/timer.hpp"
74 #include "runtime/vm_version.hpp"
75 #include "services/management.hpp"
76 #include "services/threadService.hpp"
77 #include "utilities/checkedCast.hpp"
78 #include "utilities/classpathStream.hpp"
79 #include "utilities/events.hpp"
80 #include "utilities/macros.hpp"
81 #include "utilities/ostream.hpp"
82 #include "utilities/utf8.hpp"
83
84 #include <stdlib.h>
85 #include <ctype.h>
86
87 // Entry point in java.dll for path canonicalization
88
89 typedef int (*canonicalize_fn_t)(const char *orig, char *out, int len);
90
91 static canonicalize_fn_t CanonicalizeEntry = nullptr;
92
93 // Entry points for jimage.dll for loading jimage file entries
94
95 static JImageOpen_t JImageOpen = nullptr;
96 static JImageClose_t JImageClose = nullptr;
97 static JImageFindResource_t JImageFindResource = nullptr;
98 static JImageGetResource_t JImageGetResource = nullptr;
99
100 // JimageFile pointer, or null if exploded JDK build.
101 static JImageFile* JImage_file = nullptr;
102
103 // Globals
104
105 PerfCounter* ClassLoader::_perf_accumulated_time = nullptr;
106 PerfCounter* ClassLoader::_perf_classes_inited = nullptr;
107 PerfCounter* ClassLoader::_perf_class_init_time = nullptr;
108 PerfCounter* ClassLoader::_perf_class_init_selftime = nullptr;
109 PerfCounter* ClassLoader::_perf_class_init_bytecodes_count = nullptr;
110 PerfCounter* ClassLoader::_perf_classes_verified = nullptr;
111 PerfCounter* ClassLoader::_perf_class_verify_time = nullptr;
112 PerfCounter* ClassLoader::_perf_class_verify_selftime = nullptr;
113 PerfCounter* ClassLoader::_perf_classes_linked = nullptr;
114 PerfCounter* ClassLoader::_perf_class_link_time = nullptr;
115 PerfCounter* ClassLoader::_perf_class_link_selftime = nullptr;
116 PerfCounter* ClassLoader::_perf_shared_classload_time = nullptr;
117 PerfCounter* ClassLoader::_perf_sys_classload_time = nullptr;
118 PerfCounter* ClassLoader::_perf_app_classload_time = nullptr;
119 PerfCounter* ClassLoader::_perf_app_classload_selftime = nullptr;
120 PerfCounter* ClassLoader::_perf_app_classload_count = nullptr;
121 PerfCounter* ClassLoader::_perf_define_appclasses = nullptr;
122 PerfCounter* ClassLoader::_perf_define_appclass_time = nullptr;
123 PerfCounter* ClassLoader::_perf_define_appclass_selftime = nullptr;
124 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = nullptr;
125 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = nullptr;
126 PerfCounter* ClassLoader::_perf_preload_total_time = nullptr;
127 PerfCounter* ClassLoader::_perf_preload_time = nullptr;
128 PerfCounter* ClassLoader::_perf_prelink_time = nullptr;
129 PerfCounter* ClassLoader::_perf_preinit_time = nullptr;
130 PerfCounter* ClassLoader::_perf_preresolve_time = nullptr;
131 PerfCounter* ClassLoader::_perf_ik_link_methods_time = nullptr;
132 PerfCounter* ClassLoader::_perf_method_adapters_time = nullptr;
133 PerfCounter* ClassLoader::_perf_ik_link_methods_count = nullptr;
134 PerfCounter* ClassLoader::_perf_method_adapters_count = nullptr;
135 PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = nullptr;
136 PerfCounter* ClassLoader::_perf_secondary_hash_time = nullptr;
137
138 PerfTickCounters* ClassLoader::_perf_resolve_indy_time = nullptr;
139 PerfTickCounters* ClassLoader::_perf_resolve_invokehandle_time = nullptr;
140 PerfTickCounters* ClassLoader::_perf_resolve_mh_time = nullptr;
141 PerfTickCounters* ClassLoader::_perf_resolve_mt_time = nullptr;
142
143 PerfCounter* ClassLoader::_perf_resolve_indy_count = nullptr;
144 PerfCounter* ClassLoader::_perf_resolve_invokehandle_count = nullptr;
145 PerfCounter* ClassLoader::_perf_resolve_mh_count = nullptr;
146 PerfCounter* ClassLoader::_perf_resolve_mt_count = nullptr;
147
148 void ClassLoader::print_counters(outputStream *st) {
149 st->print_cr("ClassLoader:");
150 st->print_cr( " clinit: " JLONG_FORMAT_W(6) "us / " JLONG_FORMAT " events",
151 ClassLoader::class_init_time_ms(), ClassLoader::class_init_count());
152 st->print_cr(" link methods: " JLONG_FORMAT_W(6) "us / " JLONG_FORMAT " events",
153 Management::ticks_to_us(_perf_ik_link_methods_time->get_value()) , _perf_ik_link_methods_count->get_value());
154 st->print_cr(" method adapters: " JLONG_FORMAT_W(6) "us / " JLONG_FORMAT " events",
155 Management::ticks_to_us(_perf_method_adapters_time->get_value()) , _perf_method_adapters_count->get_value());
156 if (CountBytecodes || CountBytecodesPerThread) {
157 st->print_cr("; executed " JLONG_FORMAT " bytecodes", ClassLoader::class_init_bytecodes_count());
158 }
159 st->print_cr(" resolve...");
160 st->print_cr(" invokedynamic: " JLONG_FORMAT_W(6) "us (elapsed) " JLONG_FORMAT_W(6) "us (thread) / " JLONG_FORMAT_W(5) " events",
161 _perf_resolve_indy_time->elapsed_counter_value_us(),
162 _perf_resolve_indy_time->thread_counter_value_us(),
163 _perf_resolve_indy_count->get_value());
164 st->print_cr(" invokehandle: " JLONG_FORMAT_W(6) "us (elapsed) " JLONG_FORMAT_W(6) "us (thread) / " JLONG_FORMAT_W(5) " events",
165 _perf_resolve_invokehandle_time->elapsed_counter_value_us(),
166 _perf_resolve_invokehandle_time->thread_counter_value_us(),
167 _perf_resolve_invokehandle_count->get_value());
168 st->print_cr(" CP_MethodHandle: " JLONG_FORMAT_W(6) "us (elapsed) " JLONG_FORMAT_W(6) "us (thread) / " JLONG_FORMAT_W(5) " events",
169 _perf_resolve_mh_time->elapsed_counter_value_us(),
170 _perf_resolve_mh_time->thread_counter_value_us(),
171 _perf_resolve_mh_count->get_value());
172 st->print_cr(" CP_MethodType: " JLONG_FORMAT_W(6) "us (elapsed) " JLONG_FORMAT_W(6) "us (thread) / " JLONG_FORMAT_W(5) " events",
173 _perf_resolve_mt_time->elapsed_counter_value_us(),
174 _perf_resolve_mt_time->thread_counter_value_us(),
175 _perf_resolve_mt_count->get_value());
176 }
177
178 GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = nullptr;
179 GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = nullptr;
180 ClassPathEntry* ClassLoader::_jrt_entry = nullptr;
181
182 ClassPathEntry* volatile ClassLoader::_first_append_entry_list = nullptr;
183 ClassPathEntry* volatile ClassLoader::_last_append_entry = nullptr;
184 #if INCLUDE_CDS
185 ClassPathEntry* ClassLoader::_app_classpath_entries = nullptr;
186 ClassPathEntry* ClassLoader::_last_app_classpath_entry = nullptr;
187 ClassPathEntry* ClassLoader::_module_path_entries = nullptr;
188 ClassPathEntry* ClassLoader::_last_module_path_entry = nullptr;
189 #endif
190
191 // helper routines
192 #if INCLUDE_CDS
193 static bool string_starts_with(const char* str, const char* str_to_find) {
194 size_t str_len = strlen(str);
195 size_t str_to_find_len = strlen(str_to_find);
308 }
309 #ifdef ASSERT
310 // Freeing path is a no-op here as buffer prevents it from being reclaimed. But we keep it for
311 // debug builds so that we guard against use-after-free bugs.
312 FREE_RESOURCE_ARRAY_IN_THREAD(current, char, path, path_len);
313 #endif
314 // We don't verify the length of the classfile stream fits in an int, but this is the
315 // bootloader so we have control of this.
316 // Resource allocated
317 return new ClassFileStream(buffer,
318 checked_cast<int>(st.st_size),
319 _dir);
320 }
321 }
322 }
323 FREE_RESOURCE_ARRAY_IN_THREAD(current, char, path, path_len);
324 return nullptr;
325 }
326
327 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name,
328 bool from_class_path_attr, bool multi_release) : ClassPathEntry() {
329 _zip = zip;
330 _zip_name = copy_path(zip_name);
331 _from_class_path_attr = from_class_path_attr;
332 _multi_release = multi_release;
333 }
334
335 ClassPathZipEntry::~ClassPathZipEntry() {
336 ZipLibrary::close(_zip);
337 FREE_C_HEAP_ARRAY(char, _zip_name);
338 }
339
340 bool ClassPathZipEntry::has_entry(JavaThread* current, const char* name) {
341 ThreadToNativeFromVM ttn(current);
342 // check whether zip archive contains name
343 jint name_len;
344 jint filesize;
345 jzentry* entry = ZipLibrary::find_entry(_zip, name, &filesize, &name_len);
346 if (entry == nullptr) {
347 return false;
348 } else {
349 ZipLibrary::free_entry(_zip, entry);
350 return true;
351 }
352 }
353
354 u1* ClassPathZipEntry::open_entry(JavaThread* current, const char* name, jint* filesize, bool nul_terminate) {
355 // enable call to C land
356 ThreadToNativeFromVM ttn(current);
357 // check whether zip archive contains name
358 jint name_len;
359 jzentry* entry = ZipLibrary::find_entry(_zip, name, filesize, &name_len);
360 if (entry == nullptr) return nullptr;
361 u1* buffer;
362 char name_buf[128];
363 char* filename;
364 if (name_len < 128) {
365 filename = name_buf;
366 } else {
367 filename = NEW_RESOURCE_ARRAY(char, name_len + 1);
368 }
369
370 // read contents into resource array
371 size_t size = (uint32_t)(*filesize);
372 if (nul_terminate) {
373 if (sizeof(size) == sizeof(uint32_t) && size == UINT_MAX) {
374 return nullptr; // 32-bit integer overflow will occur.
375 }
376 size++;
377 }
378
379 // ZIP_ReadEntry also frees zentry
380 buffer = NEW_RESOURCE_ARRAY(u1, size);
381 if (!ZipLibrary::read_entry(_zip, entry, buffer, filename)) {
382 return nullptr;
383 }
384
385 // return result
386 if (nul_terminate) {
387 buffer[size - 1] = 0;
388 }
389 return buffer;
390 }
391
392 ClassFileStream* ClassPathZipEntry::open_stream(JavaThread* current, const char* name) {
393 jint filesize;
394 u1* buffer = open_entry(current, name, &filesize, false);
395 if (buffer == nullptr) {
396 return nullptr;
397 }
398 if (UsePerfData) {
399 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
562
563 void ClassLoader::setup_bootstrap_search_path(JavaThread* current) {
564 const char* bootcp = Arguments::get_boot_class_path();
565 assert(bootcp != nullptr, "Boot class path must not be nullptr");
566 if (PrintSharedArchiveAndExit) {
567 // Don't print bootcp - this is the bootcp of this current VM process, not necessarily
568 // the same as the boot classpath of the shared archive.
569 } else {
570 trace_class_path("bootstrap loader class path=", bootcp);
571 }
572 setup_bootstrap_search_path_impl(current, bootcp);
573 }
574
575 #if INCLUDE_CDS
576 void ClassLoader::setup_app_search_path(JavaThread* current, const char *class_path) {
577 assert(CDSConfig::is_dumping_archive(), "sanity");
578
579 ResourceMark rm(current);
580 ClasspathStream cp_stream(class_path);
581
582 int exclusion_start_index = INT_MAX;
583 size_t limit = SIZE_MAX;
584 if (CacheOnlyClassesIn != nullptr) {
585 char* appclasspath = Arguments::get_appclasspath();
586 bool bad = false;
587 if (strstr(appclasspath, CacheOnlyClassesIn) != appclasspath) {
588 bad = true;
589 } else {
590 limit = strlen(CacheOnlyClassesIn);
591 if (limit > 0 && limit < strlen(appclasspath)
592 && CacheOnlyClassesIn[limit-1] != os::path_separator()[0]
593 && appclasspath[limit] != os::path_separator()[0]) {
594 bad = true;
595 }
596 }
597 if (bad) {
598 vm_exit_during_initialization(err_msg("CacheOnlyClassesIn \"%s\" must be a proper prefix of the CLASSPATH \"%s\"",
599 CacheOnlyClassesIn, appclasspath));
600 }
601 }
602
603 while (cp_stream.has_next()) {
604 if (cp_stream.num_chars_consumed() >= limit && exclusion_start_index == INT_MAX) {
605 exclusion_start_index = num_boot_classpath_entries() + num_app_classpath_entries();
606 }
607 const char* path = cp_stream.get_next();
608 update_class_path_entry_list(current, path, /* check_for_duplicates */ true,
609 /* is_boot_append */ false, /* from_class_path_attr */ false);
610 }
611
612 ClassLoaderExt::set_app_class_exclusion_start_path_index(exclusion_start_index);
613 if (exclusion_start_index != INT_MAX) {
614 log_info(cds)("Exclude all app classes whose shared_classpath_index is greater than %d", exclusion_start_index);
615 }
616 }
617
618 void ClassLoader::add_to_module_path_entries(const char* path,
619 ClassPathEntry* entry) {
620 assert(entry != nullptr, "ClassPathEntry should not be nullptr");
621 assert(CDSConfig::is_dumping_archive(), "sanity");
622
623 // The entry does not exist, add to the list
624 if (_module_path_entries == nullptr) {
625 assert(_last_module_path_entry == nullptr, "Sanity");
626 _module_path_entries = _last_module_path_entry = entry;
627 } else {
628 _last_module_path_entry->set_next(entry);
629 _last_module_path_entry = entry;
630 }
631 }
632
633 // Add a module path to the _module_path_entries list.
634 void ClassLoader::setup_module_search_path(JavaThread* current, const char* path) {
635 assert(CDSConfig::is_dumping_archive(), "sanity");
815 return ZipLibrary::open(canonical_path, error_msg);
816 }
817
818 ClassPathEntry* ClassLoader::create_class_path_entry(JavaThread* current,
819 const char *path, const struct stat* st,
820 bool is_boot_append,
821 bool from_class_path_attr,
822 bool is_multi_release) {
823 ClassPathEntry* new_entry = nullptr;
824 if ((st->st_mode & S_IFMT) == S_IFREG) {
825 ResourceMark rm(current);
826 // Regular file, should be a zip file
827 // Canonicalized filename
828 const char* canonical_path = get_canonical_path(path, current);
829 if (canonical_path == nullptr) {
830 return nullptr;
831 }
832 char* error_msg = nullptr;
833 jzfile* zip = open_zip_file(canonical_path, &error_msg, current);
834 if (zip != nullptr && error_msg == nullptr) {
835 new_entry = new ClassPathZipEntry(zip, path, from_class_path_attr, is_multi_release);
836 } else {
837 #if INCLUDE_CDS
838 ClassLoaderExt::set_has_non_jar_in_classpath();
839 #endif
840 return nullptr;
841 }
842 log_info(class, path)("opened: %s", path);
843 log_info(class, load)("opened: %s", path);
844 } else {
845 // Directory
846 new_entry = new ClassPathDirEntry(path);
847 log_info(class, load)("path: %s", path);
848 }
849 return new_entry;
850 }
851
852
853 // Create a class path zip entry for a given path (return null if not found
854 // or zip/JAR file cannot be opened)
855 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path) {
856 // check for a regular file
857 struct stat st;
858 if (os::stat(path, &st) == 0) {
859 if ((st.st_mode & S_IFMT) == S_IFREG) {
860 JavaThread* thread = JavaThread::current();
861 ResourceMark rm(thread);
862 const char* canonical_path = get_canonical_path(path, thread);
863 if (canonical_path != nullptr) {
864 char* error_msg = nullptr;
865 jzfile* zip = open_zip_file(canonical_path, &error_msg, thread);
866 if (zip != nullptr && error_msg == nullptr) {
867 // create using canonical path
868 return new ClassPathZipEntry(zip, canonical_path, false, false);
869 }
870 }
871 }
872 }
873 return nullptr;
874 }
875
876 // The boot append entries are added with a lock, and read lock free.
877 void ClassLoader::add_to_boot_append_entries(ClassPathEntry *new_entry) {
878 if (new_entry != nullptr) {
879 MutexLocker ml(Bootclasspath_lock, Mutex::_no_safepoint_check_flag);
880 if (_last_append_entry == nullptr) {
881 _last_append_entry = new_entry;
882 assert(first_append_entry() == nullptr, "boot loader's append class path entry list not empty");
883 Atomic::release_store(&_first_append_entry_list, new_entry);
884 } else {
885 _last_append_entry->set_next(new_entry);
886 _last_append_entry = new_entry;
887 }
888 }
1508 #endif // INCLUDE_CDS
1509
1510 // Initialize the class loader's access to methods in libzip. Parse and
1511 // process the boot classpath into a list ClassPathEntry objects. Once
1512 // this list has been created, it must not change order (see class PackageInfo)
1513 // it can be appended to and is by jvmti.
1514
1515 void ClassLoader::initialize(TRAPS) {
1516 if (UsePerfData) {
1517 // jvmstat performance counters
1518 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
1519 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
1520 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
1521 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
1522 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
1523 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
1524 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
1525 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
1526 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
1527 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
1528 NEWPERFEVENTCOUNTER(_perf_class_init_bytecodes_count, SUN_CLS, "clinitBytecodesCount");
1529
1530 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
1531 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
1532 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
1533 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
1534 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
1535 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
1536 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
1537 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
1538 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
1539 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
1540 NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS, "unsafeDefineClassCalls");
1541 NEWPERFTICKCOUNTER(_perf_secondary_hash_time, SUN_CLS, "secondarySuperHashTime");
1542
1543 if (log_is_enabled(Info, perf, class, link) || log_is_enabled(Info, init)) {
1544 NEWPERFTICKCOUNTER(_perf_preload_total_time, SUN_CLS, "preloadTotalTime");
1545 NEWPERFTICKCOUNTER(_perf_preload_time, SUN_CLS, "preloadTime");
1546 NEWPERFTICKCOUNTER(_perf_prelink_time, SUN_CLS, "prelinkTime");
1547 NEWPERFTICKCOUNTER(_perf_preinit_time, SUN_CLS, "preinitTime");
1548 NEWPERFTICKCOUNTER(_perf_preresolve_time, SUN_CLS, "preresolveTime");
1549
1550 NEWPERFTICKCOUNTER(_perf_ik_link_methods_time, SUN_CLS, "linkMethodsTime");
1551 NEWPERFTICKCOUNTER(_perf_method_adapters_time, SUN_CLS, "makeAdaptersTime");
1552 NEWPERFEVENTCOUNTER(_perf_ik_link_methods_count, SUN_CLS, "linkMethodsCount");
1553 NEWPERFEVENTCOUNTER(_perf_method_adapters_count, SUN_CLS, "makeAdaptersCount");
1554
1555 NEWPERFTICKCOUNTERS(_perf_resolve_indy_time, SUN_CLS, "resolve_invokedynamic_time");
1556 NEWPERFTICKCOUNTERS(_perf_resolve_invokehandle_time, SUN_CLS, "resolve_invokehandle_time");
1557 NEWPERFTICKCOUNTERS(_perf_resolve_mh_time, SUN_CLS, "resolve_MethodHandle_time");
1558 NEWPERFTICKCOUNTERS(_perf_resolve_mt_time, SUN_CLS, "resolve_MethodType_time");
1559
1560 NEWPERFEVENTCOUNTER(_perf_resolve_indy_count, SUN_CLS, "resolve_invokedynamic_count");
1561 NEWPERFEVENTCOUNTER(_perf_resolve_invokehandle_count, SUN_CLS, "resolve_invokehandle_count");
1562 NEWPERFEVENTCOUNTER(_perf_resolve_mh_count, SUN_CLS, "resolve_MethodHandle_count");
1563 NEWPERFEVENTCOUNTER(_perf_resolve_mt_count, SUN_CLS, "resolve_MethodType_count");
1564 }
1565 }
1566
1567 // lookup java library entry points
1568 load_java_library();
1569 // jimage library entry points are loaded below, in lookup_vm_options
1570 setup_bootstrap_search_path(THREAD);
1571 }
1572
1573 static char* lookup_vm_resource(JImageFile *jimage, const char *jimage_version, const char *path) {
1574 jlong size;
1575 JImageLocationRef location = (*JImageFindResource)(jimage, "java.base", jimage_version, path, &size);
1576 if (location == 0)
1577 return nullptr;
1578 char *val = NEW_C_HEAP_ARRAY(char, size+1, mtClass);
1631
1632 // Helper function used by CDS code to get the number of module path
1633 // entries during shared classpath setup time.
1634 int ClassLoader::num_module_path_entries() {
1635 assert(CDSConfig::is_dumping_archive(), "sanity");
1636 int num_entries = 0;
1637 ClassPathEntry* e= ClassLoader::_module_path_entries;
1638 while (e != nullptr) {
1639 num_entries ++;
1640 e = e->next();
1641 }
1642 return num_entries;
1643 }
1644 #endif
1645
1646 jlong ClassLoader::classloader_time_ms() {
1647 return UsePerfData ?
1648 Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1;
1649 }
1650
1651 jlong ClassLoader::class_init_bytecodes_count() {
1652 return UsePerfData ? _perf_class_init_bytecodes_count->get_value() : -1;
1653 }
1654
1655 jlong ClassLoader::class_init_count() {
1656 return UsePerfData ? _perf_classes_inited->get_value() : -1;
1657 }
1658
1659 jlong ClassLoader::class_init_time_ms() {
1660 return UsePerfData ?
1661 Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1;
1662 }
1663
1664 jlong ClassLoader::class_verify_time_ms() {
1665 return UsePerfData ?
1666 Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1;
1667 }
1668
1669 jlong ClassLoader::class_link_count() {
1670 return UsePerfData ? _perf_classes_linked->get_value() : -1;
1671 }
1672
1673 jlong ClassLoader::class_link_time_ms() {
1674 return UsePerfData ?
|