< prev index next >

src/hotspot/share/classfile/classLoader.cpp

Print this page

  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 ?
< prev index next >