1 /* 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "classfile/classFileParser.hpp" 27 #include "classfile/classFileStream.hpp" 28 #include "classfile/classLoader.hpp" 29 #include "classfile/classLoaderExt.hpp" 30 #include "classfile/classLoaderData.inline.hpp" 31 #include "classfile/javaClasses.hpp" 32 #if INCLUDE_CDS 33 #include "classfile/sharedPathsMiscInfo.hpp" 34 #include "classfile/sharedClassUtil.hpp" 35 #endif 36 #include "classfile/systemDictionary.hpp" 37 #include "classfile/vmSymbols.hpp" 38 #include "compiler/compileBroker.hpp" 39 #include "gc_interface/collectedHeap.inline.hpp" 40 #include "interpreter/bytecodeStream.hpp" 41 #include "interpreter/oopMapCache.hpp" 42 #include "memory/allocation.inline.hpp" 43 #include "memory/filemap.hpp" 44 #include "memory/generation.hpp" 45 #include "memory/oopFactory.hpp" 46 #include "memory/universe.inline.hpp" 47 #include "oops/instanceKlass.hpp" 48 #include "oops/instanceRefKlass.hpp" 49 #include "oops/oop.inline.hpp" 50 #include "oops/symbol.hpp" 51 #include "prims/jvm_misc.hpp" 52 #include "runtime/arguments.hpp" 53 #include "runtime/compilationPolicy.hpp" 54 #include "runtime/fprofiler.hpp" 55 #include "runtime/handles.hpp" 56 #include "runtime/handles.inline.hpp" 57 #include "runtime/init.hpp" 58 #include "runtime/interfaceSupport.hpp" 59 #include "runtime/java.hpp" 60 #include "runtime/javaCalls.hpp" 61 #include "runtime/os.hpp" 62 #include "runtime/threadCritical.hpp" 63 #include "runtime/timer.hpp" 64 #include "services/management.hpp" 65 #include "services/threadService.hpp" 66 #include "utilities/events.hpp" 67 #include "utilities/hashtable.hpp" 68 #include "utilities/hashtable.inline.hpp" 69 70 // Entry points in zip.dll for loading zip/jar file entries 71 72 typedef void * * (JNICALL *ZipOpen_t)(const char *name, char **pmsg); 73 typedef void (JNICALL *ZipClose_t)(jzfile *zip); 74 typedef jzentry* (JNICALL *FindEntry_t)(jzfile *zip, const char *name, jint *sizeP, jint *nameLen); 75 typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf); 76 typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf); 77 typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n); 78 typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len); 79 80 static ZipOpen_t ZipOpen = NULL; 81 static ZipClose_t ZipClose = NULL; 82 static FindEntry_t FindEntry = NULL; 83 static ReadEntry_t ReadEntry = NULL; 84 static ReadMappedEntry_t ReadMappedEntry = NULL; 85 static GetNextEntry_t GetNextEntry = NULL; 86 static canonicalize_fn_t CanonicalizeEntry = NULL; 87 static Crc32_t Crc32 = NULL; 88 89 // Globals 90 91 PerfCounter* ClassLoader::_perf_accumulated_time = NULL; 92 PerfCounter* ClassLoader::_perf_classes_inited = NULL; 93 PerfCounter* ClassLoader::_perf_class_init_time = NULL; 94 PerfCounter* ClassLoader::_perf_class_init_selftime = NULL; 95 PerfCounter* ClassLoader::_perf_classes_verified = NULL; 96 PerfCounter* ClassLoader::_perf_class_verify_time = NULL; 97 PerfCounter* ClassLoader::_perf_class_verify_selftime = NULL; 98 PerfCounter* ClassLoader::_perf_classes_linked = NULL; 99 PerfCounter* ClassLoader::_perf_class_link_time = NULL; 100 PerfCounter* ClassLoader::_perf_class_link_selftime = NULL; 101 PerfCounter* ClassLoader::_perf_class_parse_time = NULL; 102 PerfCounter* ClassLoader::_perf_class_parse_selftime = NULL; 103 PerfCounter* ClassLoader::_perf_sys_class_lookup_time = NULL; 104 PerfCounter* ClassLoader::_perf_shared_classload_time = NULL; 105 PerfCounter* ClassLoader::_perf_sys_classload_time = NULL; 106 PerfCounter* ClassLoader::_perf_app_classload_time = NULL; 107 PerfCounter* ClassLoader::_perf_app_classload_selftime = NULL; 108 PerfCounter* ClassLoader::_perf_app_classload_count = NULL; 109 PerfCounter* ClassLoader::_perf_define_appclasses = NULL; 110 PerfCounter* ClassLoader::_perf_define_appclass_time = NULL; 111 PerfCounter* ClassLoader::_perf_define_appclass_selftime = NULL; 112 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = NULL; 113 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = NULL; 114 PerfCounter* ClassLoader::_sync_systemLoaderLockContentionRate = NULL; 115 PerfCounter* ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL; 116 PerfCounter* ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL; 117 PerfCounter* ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL; 118 PerfCounter* ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL; 119 PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = NULL; 120 PerfCounter* ClassLoader::_isUnsyncloadClass = NULL; 121 PerfCounter* ClassLoader::_load_instance_class_failCounter = NULL; 122 123 ClassPathEntry* ClassLoader::_first_entry = NULL; 124 ClassPathEntry* ClassLoader::_last_entry = NULL; 125 int ClassLoader::_num_entries = 0; 126 PackageHashtable* ClassLoader::_package_hash_table = NULL; 127 128 #if INCLUDE_CDS 129 SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL; 130 #endif 131 // helper routines 132 bool string_starts_with(const char* str, const char* str_to_find) { 133 size_t str_len = strlen(str); 134 size_t str_to_find_len = strlen(str_to_find); 135 if (str_to_find_len > str_len) { 136 return false; 137 } 138 return (strncmp(str, str_to_find, str_to_find_len) == 0); 139 } 140 141 bool string_ends_with(const char* str, const char* str_to_find) { 142 size_t str_len = strlen(str); 143 size_t str_to_find_len = strlen(str_to_find); 144 if (str_to_find_len > str_len) { 145 return false; 146 } 147 return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0); 148 } 149 150 151 MetaIndex::MetaIndex(char** meta_package_names, int num_meta_package_names) { 152 if (num_meta_package_names == 0) { 153 _meta_package_names = NULL; 154 _num_meta_package_names = 0; 155 } else { 156 _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names, mtClass); 157 _num_meta_package_names = num_meta_package_names; 158 memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*)); 159 } 160 } 161 162 163 MetaIndex::~MetaIndex() { 164 FREE_C_HEAP_ARRAY(char*, _meta_package_names, mtClass); 165 } 166 167 168 bool MetaIndex::may_contain(const char* class_name) { 169 if ( _num_meta_package_names == 0) { 170 return false; 171 } 172 size_t class_name_len = strlen(class_name); 173 for (int i = 0; i < _num_meta_package_names; i++) { 174 char* pkg = _meta_package_names[i]; 175 size_t pkg_len = strlen(pkg); 176 size_t min_len = MIN2(class_name_len, pkg_len); 177 if (!strncmp(class_name, pkg, min_len)) { 178 return true; 179 } 180 } 181 return false; 182 } 183 184 185 ClassPathEntry::ClassPathEntry() { 186 set_next(NULL); 187 } 188 189 190 bool ClassPathEntry::is_lazy() { 191 return false; 192 } 193 194 ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() { 195 char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass); 196 strcpy(copy, dir); 197 _dir = copy; 198 } 199 200 201 ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) { 202 // construct full path name 203 char path[JVM_MAXPATHLEN]; 204 if (jio_snprintf(path, sizeof(path), "%s%s%s", _dir, os::file_separator(), name) == -1) { 205 return NULL; 206 } 207 // check if file exists 208 struct stat st; 209 if (os::stat(path, &st) == 0) { 210 #if INCLUDE_CDS 211 if (DumpSharedSpaces) { 212 // We have already check in ClassLoader::check_shared_classpath() that the directory is empty, so 213 // we should never find a file underneath it -- unless user has added a new file while we are running 214 // the dump, in which case let's quit! 215 ShouldNotReachHere(); 216 } 217 #endif 218 // found file, open it 219 int file_handle = os::open(path, 0, 0); 220 if (file_handle != -1) { 221 // read contents into resource array 222 u1* buffer = NEW_RESOURCE_ARRAY(u1, st.st_size); 223 size_t num_read = os::read(file_handle, (char*) buffer, st.st_size); 224 // close file 225 os::close(file_handle); 226 // construct ClassFileStream 227 if (num_read == (size_t)st.st_size) { 228 if (UsePerfData) { 229 ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read); 230 } 231 return new ClassFileStream(buffer, st.st_size, _dir); // Resource allocated 232 } 233 } 234 } 235 return NULL; 236 } 237 238 239 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() { 240 _zip = zip; 241 char *copy = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass); 242 strcpy(copy, zip_name); 243 _zip_name = copy; 244 } 245 246 ClassPathZipEntry::~ClassPathZipEntry() { 247 if (ZipClose != NULL) { 248 (*ZipClose)(_zip); 249 } 250 FREE_C_HEAP_ARRAY(char, _zip_name, mtClass); 251 } 252 253 u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) { 254 // enable call to C land 255 JavaThread* thread = JavaThread::current(); 256 ThreadToNativeFromVM ttn(thread); 257 // check whether zip archive contains name 258 jint name_len; 259 jzentry* entry = (*FindEntry)(_zip, name, filesize, &name_len); 260 if (entry == NULL) return NULL; 261 u1* buffer; 262 char name_buf[128]; 263 char* filename; 264 if (name_len < 128) { 265 filename = name_buf; 266 } else { 267 filename = NEW_RESOURCE_ARRAY(char, name_len + 1); 268 } 269 270 // file found, get pointer to the entry in mmapped jar file. 271 if (ReadMappedEntry == NULL || 272 !(*ReadMappedEntry)(_zip, entry, &buffer, filename)) { 273 // mmapped access not available, perhaps due to compression, 274 // read contents into resource array 275 int size = (*filesize) + ((nul_terminate) ? 1 : 0); 276 buffer = NEW_RESOURCE_ARRAY(u1, size); 277 if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL; 278 } 279 280 // return result 281 if (nul_terminate) { 282 buffer[*filesize] = 0; 283 } 284 return buffer; 285 } 286 287 ClassFileStream* ClassPathZipEntry::open_stream(const char* name, TRAPS) { 288 jint filesize; 289 u1* buffer = open_entry(name, &filesize, false, CHECK_NULL); 290 if (buffer == NULL) { 291 return NULL; 292 } 293 if (UsePerfData) { 294 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize); 295 } 296 return new ClassFileStream(buffer, filesize, _zip_name); // Resource allocated 297 } 298 299 // invoke function for each entry in the zip file 300 void ClassPathZipEntry::contents_do(void f(const char* name, void* context), void* context) { 301 JavaThread* thread = JavaThread::current(); 302 HandleMark handle_mark(thread); 303 ThreadToNativeFromVM ttn(thread); 304 for (int n = 0; ; n++) { 305 jzentry * ze = ((*GetNextEntry)(_zip, n)); 306 if (ze == NULL) break; 307 (*f)(ze->name, context); 308 } 309 } 310 311 LazyClassPathEntry::LazyClassPathEntry(const char* path, const struct stat* st, bool throw_exception) : ClassPathEntry() { 312 _path = os::strdup_check_oom(path); 313 _st = *st; 314 _meta_index = NULL; 315 _resolved_entry = NULL; 316 _has_error = false; 317 _throw_exception = throw_exception; 318 } 319 320 LazyClassPathEntry::~LazyClassPathEntry() { 321 os::free((void*)_path); 322 } 323 324 bool LazyClassPathEntry::is_jar_file() { 325 return ((_st.st_mode & S_IFREG) == S_IFREG); 326 } 327 328 ClassPathEntry* LazyClassPathEntry::resolve_entry(TRAPS) { 329 if (_resolved_entry != NULL) { 330 return (ClassPathEntry*) _resolved_entry; 331 } 332 ClassPathEntry* new_entry = NULL; 333 new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, _throw_exception, CHECK_NULL); 334 if (!_throw_exception && new_entry == NULL) { 335 assert(!HAS_PENDING_EXCEPTION, "must be"); 336 return NULL; 337 } 338 { 339 ThreadCritical tc; 340 if (_resolved_entry == NULL) { 341 _resolved_entry = new_entry; 342 return new_entry; 343 } 344 } 345 assert(_resolved_entry != NULL, "bug in MT-safe resolution logic"); 346 delete new_entry; 347 return (ClassPathEntry*) _resolved_entry; 348 } 349 350 ClassFileStream* LazyClassPathEntry::open_stream(const char* name, TRAPS) { 351 if (_meta_index != NULL && 352 !_meta_index->may_contain(name)) { 353 return NULL; 354 } 355 if (_has_error) { 356 return NULL; 357 } 358 ClassPathEntry* cpe = resolve_entry(THREAD); 359 if (cpe == NULL) { 360 _has_error = true; 361 return NULL; 362 } else { 363 return cpe->open_stream(name, THREAD); 364 } 365 } 366 367 bool LazyClassPathEntry::is_lazy() { 368 return true; 369 } 370 371 u1* LazyClassPathEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) { 372 if (_has_error) { 373 return NULL; 374 } 375 ClassPathEntry* cpe = resolve_entry(THREAD); 376 if (cpe == NULL) { 377 _has_error = true; 378 return NULL; 379 } else if (cpe->is_jar_file()) { 380 return ((ClassPathZipEntry*)cpe)->open_entry(name, filesize, nul_terminate,THREAD); 381 } else { 382 ShouldNotReachHere(); 383 *filesize = 0; 384 return NULL; 385 } 386 } 387 388 static void print_meta_index(LazyClassPathEntry* entry, 389 GrowableArray<char*>& meta_packages) { 390 tty->print("[Meta index for %s=", entry->name()); 391 for (int i = 0; i < meta_packages.length(); i++) { 392 if (i > 0) tty->print(" "); 393 tty->print("%s", meta_packages.at(i)); 394 } 395 tty->print_cr("]"); 396 } 397 398 #if INCLUDE_CDS 399 void ClassLoader::exit_with_path_failure(const char* error, const char* message) { 400 assert(DumpSharedSpaces, "only called at dump time"); 401 tty->print_cr("Hint: enable -XX:+TraceClassPaths to diagnose the failure"); 402 vm_exit_during_initialization(error, message); 403 } 404 #endif 405 406 void ClassLoader::trace_class_path(const char* msg, const char* name) { 407 if (!TraceClassPaths) { 408 return; 409 } 410 411 if (msg) { 412 tty->print("%s", msg); 413 } 414 if (name) { 415 if (strlen(name) < 256) { 416 tty->print("%s", name); 417 } else { 418 // For very long paths, we need to print each character separately, 419 // as print_cr() has a length limit 420 while (name[0] != '\0') { 421 tty->print("%c", name[0]); 422 name++; 423 } 424 } 425 } 426 if (msg && msg[0] == '[') { 427 tty->print_cr("]"); 428 } else { 429 tty->cr(); 430 } 431 } 432 433 void ClassLoader::setup_bootstrap_meta_index() { 434 // Set up meta index which allows us to open boot jars lazily if 435 // class data sharing is enabled 436 const char* meta_index_path = Arguments::get_meta_index_path(); 437 const char* meta_index_dir = Arguments::get_meta_index_dir(); 438 setup_meta_index(meta_index_path, meta_index_dir, 0); 439 } 440 441 void ClassLoader::setup_meta_index(const char* meta_index_path, const char* meta_index_dir, int start_index) { 442 const char* known_version = "% VERSION 2"; 443 FILE* file = fopen(meta_index_path, "r"); 444 int line_no = 0; 445 #if INCLUDE_CDS 446 if (DumpSharedSpaces) { 447 if (file != NULL) { 448 _shared_paths_misc_info->add_required_file(meta_index_path); 449 } else { 450 _shared_paths_misc_info->add_nonexist_path(meta_index_path); 451 } 452 } 453 #endif 454 if (file != NULL) { 455 ResourceMark rm; 456 LazyClassPathEntry* cur_entry = NULL; 457 GrowableArray<char*> boot_class_path_packages(10); 458 char package_name[256]; 459 bool skipCurrentJar = false; 460 while (fgets(package_name, sizeof(package_name), file) != NULL) { 461 ++line_no; 462 // Remove trailing newline 463 package_name[strlen(package_name) - 1] = '\0'; 464 switch(package_name[0]) { 465 case '%': 466 { 467 if ((line_no == 1) && (strcmp(package_name, known_version) != 0)) { 468 if (TraceClassLoading && Verbose) { 469 tty->print("[Unsupported meta index version]"); 470 } 471 fclose(file); 472 return; 473 } 474 } 475 476 // These directives indicate jar files which contain only 477 // classes, only non-classfile resources, or a combination of 478 // the two. See src/share/classes/sun/misc/MetaIndex.java and 479 // make/tools/MetaIndex/BuildMetaIndex.java in the J2SE 480 // workspace. 481 case '#': 482 case '!': 483 case '@': 484 { 485 // Hand off current packages to current lazy entry (if any) 486 if ((cur_entry != NULL) && 487 (boot_class_path_packages.length() > 0)) { 488 if ((TraceClassLoading || TraceClassPaths) && Verbose) { 489 print_meta_index(cur_entry, boot_class_path_packages); 490 } 491 MetaIndex* index = new MetaIndex(boot_class_path_packages.adr_at(0), 492 boot_class_path_packages.length()); 493 cur_entry->set_meta_index(index); 494 } 495 cur_entry = NULL; 496 boot_class_path_packages.clear(); 497 498 // Find lazy entry corresponding to this jar file 499 int count = 0; 500 for (ClassPathEntry* entry = _first_entry; entry != NULL; entry = entry->next(), count++) { 501 if (count >= start_index && 502 entry->is_lazy() && 503 string_starts_with(entry->name(), meta_index_dir) && 504 string_ends_with(entry->name(), &package_name[2])) { 505 cur_entry = (LazyClassPathEntry*) entry; 506 break; 507 } 508 } 509 510 // If the first character is '@', it indicates the following jar 511 // file is a resource only jar file in which case, we should skip 512 // reading the subsequent entries since the resource loading is 513 // totally handled by J2SE side. 514 if (package_name[0] == '@') { 515 if (cur_entry != NULL) { 516 cur_entry->set_meta_index(new MetaIndex(NULL, 0)); 517 } 518 cur_entry = NULL; 519 skipCurrentJar = true; 520 } else { 521 skipCurrentJar = false; 522 } 523 524 break; 525 } 526 527 default: 528 { 529 if (!skipCurrentJar && cur_entry != NULL) { 530 char* new_name = os::strdup_check_oom(package_name); 531 boot_class_path_packages.append(new_name); 532 } 533 } 534 } 535 } 536 // Hand off current packages to current lazy entry (if any) 537 if ((cur_entry != NULL) && 538 (boot_class_path_packages.length() > 0)) { 539 if ((TraceClassLoading || TraceClassPaths) && Verbose) { 540 print_meta_index(cur_entry, boot_class_path_packages); 541 } 542 MetaIndex* index = new MetaIndex(boot_class_path_packages.adr_at(0), 543 boot_class_path_packages.length()); 544 cur_entry->set_meta_index(index); 545 } 546 fclose(file); 547 } 548 } 549 550 #if INCLUDE_CDS 551 void ClassLoader::check_shared_classpath(const char *path) { 552 if (strcmp(path, "") == 0) { 553 exit_with_path_failure("Cannot have empty path in archived classpaths", NULL); 554 } 555 556 struct stat st; 557 if (os::stat(path, &st) == 0) { 558 if ((st.st_mode & S_IFREG) != S_IFREG) { // is directory 559 if (!os::dir_is_empty(path)) { 560 tty->print_cr("Error: non-empty directory '%s'", path); 561 exit_with_path_failure("CDS allows only empty directories in archived classpaths", NULL); 562 } 563 } 564 } 565 } 566 #endif 567 568 void ClassLoader::setup_bootstrap_search_path() { 569 assert(_first_entry == NULL, "should not setup bootstrap class search path twice"); 570 const char* sys_class_path = Arguments::get_sysclasspath(); 571 if (PrintSharedArchiveAndExit) { 572 // Don't print sys_class_path - this is the bootcp of this current VM process, not necessarily 573 // the same as the bootcp of the shared archive. 574 } else { 575 trace_class_path("[Bootstrap loader class path=", sys_class_path); 576 } 577 #if INCLUDE_CDS 578 if (DumpSharedSpaces) { 579 _shared_paths_misc_info->add_boot_classpath(sys_class_path); 580 } 581 #endif 582 setup_search_path(sys_class_path); 583 } 584 585 #if INCLUDE_CDS 586 int ClassLoader::get_shared_paths_misc_info_size() { 587 return _shared_paths_misc_info->get_used_bytes(); 588 } 589 590 void* ClassLoader::get_shared_paths_misc_info() { 591 return _shared_paths_misc_info->buffer(); 592 } 593 594 bool ClassLoader::check_shared_paths_misc_info(void *buf, int size) { 595 SharedPathsMiscInfo* checker = SharedClassUtil::allocate_shared_paths_misc_info((char*)buf, size); 596 bool result = checker->check(); 597 delete checker; 598 return result; 599 } 600 #endif 601 602 void ClassLoader::setup_search_path(const char *class_path) { 603 int offset = 0; 604 int len = (int)strlen(class_path); 605 int end = 0; 606 607 // Iterate over class path entries 608 for (int start = 0; start < len; start = end) { 609 while (class_path[end] && class_path[end] != os::path_separator()[0]) { 610 end++; 611 } 612 EXCEPTION_MARK; 613 ResourceMark rm(THREAD); 614 char* path = NEW_RESOURCE_ARRAY(char, end - start + 1); 615 strncpy(path, &class_path[start], end - start); 616 path[end - start] = '\0'; 617 update_class_path_entry_list(path, false); 618 #if INCLUDE_CDS 619 if (DumpSharedSpaces) { 620 check_shared_classpath(path); 621 } 622 #endif 623 while (class_path[end] == os::path_separator()[0]) { 624 end++; 625 } 626 } 627 } 628 629 ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st, 630 bool lazy, bool throw_exception, TRAPS) { 631 JavaThread* thread = JavaThread::current(); 632 if (lazy) { 633 return new LazyClassPathEntry(path, st, throw_exception); 634 } 635 ClassPathEntry* new_entry = NULL; 636 if ((st->st_mode & S_IFREG) == S_IFREG) { 637 // Regular file, should be a zip file 638 // Canonicalized filename 639 char canonical_path[JVM_MAXPATHLEN]; 640 if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) { 641 // This matches the classic VM 642 if (throw_exception) { 643 THROW_MSG_(vmSymbols::java_io_IOException(), "Bad pathname", NULL); 644 } else { 645 return NULL; 646 } 647 } 648 char* error_msg = NULL; 649 jzfile* zip; 650 { 651 // enable call to C land 652 ThreadToNativeFromVM ttn(thread); 653 HandleMark hm(thread); 654 zip = (*ZipOpen)(canonical_path, &error_msg); 655 } 656 if (zip != NULL && error_msg == NULL) { 657 new_entry = new ClassPathZipEntry(zip, path); 658 if (TraceClassLoading || TraceClassPaths) { 659 tty->print_cr("[Opened %s]", path); 660 } 661 } else { 662 ResourceMark rm(thread); 663 char *msg; 664 if (error_msg == NULL) { 665 msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ; 666 jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path); 667 } else { 668 int len = (int)(strlen(path) + strlen(error_msg) + 128); 669 msg = NEW_RESOURCE_ARRAY(char, len); ; 670 jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path); 671 } 672 if (throw_exception) { 673 THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL); 674 } else { 675 return NULL; 676 } 677 } 678 } else { 679 // Directory 680 new_entry = new ClassPathDirEntry(path); 681 if (TraceClassLoading || TraceClassPaths) { 682 tty->print_cr("[Path %s]", path); 683 } 684 } 685 return new_entry; 686 } 687 688 689 // Create a class path zip entry for a given path (return NULL if not found 690 // or zip/JAR file cannot be opened) 691 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path) { 692 // check for a regular file 693 struct stat st; 694 if (os::stat(path, &st) == 0) { 695 if ((st.st_mode & S_IFREG) == S_IFREG) { 696 char canonical_path[JVM_MAXPATHLEN]; 697 if (get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) { 698 char* error_msg = NULL; 699 jzfile* zip; 700 { 701 // enable call to C land 702 JavaThread* thread = JavaThread::current(); 703 ThreadToNativeFromVM ttn(thread); 704 HandleMark hm(thread); 705 zip = (*ZipOpen)(canonical_path, &error_msg); 706 } 707 if (zip != NULL && error_msg == NULL) { 708 // create using canonical path 709 return new ClassPathZipEntry(zip, canonical_path); 710 } 711 } 712 } 713 } 714 return NULL; 715 } 716 717 // returns true if entry already on class path 718 bool ClassLoader::contains_entry(ClassPathEntry *entry) { 719 ClassPathEntry* e = _first_entry; 720 while (e != NULL) { 721 // assume zip entries have been canonicalized 722 if (strcmp(entry->name(), e->name()) == 0) { 723 return true; 724 } 725 e = e->next(); 726 } 727 return false; 728 } 729 730 void ClassLoader::add_to_list(ClassPathEntry *new_entry) { 731 if (new_entry != NULL) { 732 if (_last_entry == NULL) { 733 _first_entry = _last_entry = new_entry; 734 } else { 735 _last_entry->set_next(new_entry); 736 _last_entry = new_entry; 737 } 738 } 739 _num_entries ++; 740 } 741 742 // Returns true IFF the file/dir exists and the entry was successfully created. 743 bool ClassLoader::update_class_path_entry_list(const char *path, 744 bool check_for_duplicates, 745 bool throw_exception) { 746 struct stat st; 747 if (os::stat(path, &st) == 0) { 748 // File or directory found 749 ClassPathEntry* new_entry = NULL; 750 Thread* THREAD = Thread::current(); 751 new_entry = create_class_path_entry(path, &st, LazyBootClassLoader, throw_exception, CHECK_(false)); 752 if (new_entry == NULL) { 753 return false; 754 } 755 // The kernel VM adds dynamically to the end of the classloader path and 756 // doesn't reorder the bootclasspath which would break java.lang.Package 757 // (see PackageInfo). 758 // Add new entry to linked list 759 if (!check_for_duplicates || !contains_entry(new_entry)) { 760 ClassLoaderExt::add_class_path_entry(path, check_for_duplicates, new_entry); 761 } 762 return true; 763 } else { 764 #if INCLUDE_CDS 765 if (DumpSharedSpaces) { 766 _shared_paths_misc_info->add_nonexist_path(path); 767 } 768 #endif 769 return false; 770 } 771 } 772 773 void ClassLoader::print_bootclasspath() { 774 ClassPathEntry* e = _first_entry; 775 tty->print("[bootclasspath= "); 776 while (e != NULL) { 777 tty->print("%s ;", e->name()); 778 e = e->next(); 779 } 780 tty->print_cr("]"); 781 } 782 783 void ClassLoader::load_zip_library() { 784 assert(ZipOpen == NULL, "should not load zip library twice"); 785 // First make sure native library is loaded 786 os::native_java_library(); 787 // Load zip library 788 char path[JVM_MAXPATHLEN]; 789 char ebuf[1024]; 790 void* handle = NULL; 791 if (os::dll_build_name(path, sizeof(path), Arguments::get_dll_dir(), "zip")) { 792 handle = os::dll_load(path, ebuf, sizeof ebuf); 793 } 794 if (handle == NULL) { 795 vm_exit_during_initialization("Unable to load ZIP library", path); 796 } 797 // Lookup zip entry points 798 ZipOpen = CAST_TO_FN_PTR(ZipOpen_t, os::dll_lookup(handle, "ZIP_Open")); 799 ZipClose = CAST_TO_FN_PTR(ZipClose_t, os::dll_lookup(handle, "ZIP_Close")); 800 FindEntry = CAST_TO_FN_PTR(FindEntry_t, os::dll_lookup(handle, "ZIP_FindEntry")); 801 ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry")); 802 ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry")); 803 GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry")); 804 Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32")); 805 806 // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL 807 if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || 808 GetNextEntry == NULL || Crc32 == NULL) { 809 vm_exit_during_initialization("Corrupted ZIP library", path); 810 } 811 812 // Lookup canonicalize entry in libjava.dll 813 void *javalib_handle = os::native_java_library(); 814 CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize")); 815 // This lookup only works on 1.3. Do not check for non-null here 816 } 817 818 int ClassLoader::crc32(int crc, const char* buf, int len) { 819 assert(Crc32 != NULL, "ZIP_CRC32 is not found"); 820 return (*Crc32)(crc, (const jbyte*)buf, len); 821 } 822 823 // PackageInfo data exists in order to support the java.lang.Package 824 // class. A Package object provides information about a java package 825 // (version, vendor, etc.) which originates in the manifest of the jar 826 // file supplying the package. For application classes, the ClassLoader 827 // object takes care of this. 828 829 // For system (boot) classes, the Java code in the Package class needs 830 // to be able to identify which source jar file contained the boot 831 // class, so that it can extract the manifest from it. This table 832 // identifies java packages with jar files in the boot classpath. 833 834 // Because the boot classpath cannot change, the classpath index is 835 // sufficient to identify the source jar file or directory. (Since 836 // directories have no manifests, the directory name is not required, 837 // but is available.) 838 839 // When using sharing -- the pathnames of entries in the boot classpath 840 // may not be the same at runtime as they were when the archive was 841 // created (NFS, Samba, etc.). The actual files and directories named 842 // in the classpath must be the same files, in the same order, even 843 // though the exact name is not the same. 844 845 class PackageInfo: public BasicHashtableEntry<mtClass> { 846 public: 847 const char* _pkgname; // Package name 848 int _classpath_index; // Index of directory or JAR file loaded from 849 850 PackageInfo* next() { 851 return (PackageInfo*)BasicHashtableEntry<mtClass>::next(); 852 } 853 854 const char* pkgname() { return _pkgname; } 855 void set_pkgname(char* pkgname) { _pkgname = pkgname; } 856 857 const char* filename() { 858 return ClassLoader::classpath_entry(_classpath_index)->name(); 859 } 860 861 void set_index(int index) { 862 _classpath_index = index; 863 } 864 }; 865 866 867 class PackageHashtable : public BasicHashtable<mtClass> { 868 private: 869 inline unsigned int compute_hash(const char *s, int n) { 870 unsigned int val = 0; 871 while (--n >= 0) { 872 val = *s++ + 31 * val; 873 } 874 return val; 875 } 876 877 PackageInfo* bucket(int index) { 878 return (PackageInfo*)BasicHashtable<mtClass>::bucket(index); 879 } 880 881 PackageInfo* get_entry(int index, unsigned int hash, 882 const char* pkgname, size_t n) { 883 for (PackageInfo* pp = bucket(index); pp != NULL; pp = pp->next()) { 884 if (pp->hash() == hash && 885 strncmp(pkgname, pp->pkgname(), n) == 0 && 886 pp->pkgname()[n] == '\0') { 887 return pp; 888 } 889 } 890 return NULL; 891 } 892 893 public: 894 PackageHashtable(int table_size) 895 : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo)) {} 896 897 PackageHashtable(int table_size, HashtableBucket<mtClass>* t, int number_of_entries) 898 : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo), t, number_of_entries) {} 899 900 PackageInfo* get_entry(const char* pkgname, int n) { 901 unsigned int hash = compute_hash(pkgname, n); 902 return get_entry(hash_to_index(hash), hash, pkgname, n); 903 } 904 905 PackageInfo* new_entry(char* pkgname, int n) { 906 unsigned int hash = compute_hash(pkgname, n); 907 PackageInfo* pp; 908 pp = (PackageInfo*)BasicHashtable<mtClass>::new_entry(hash); 909 pp->set_pkgname(pkgname); 910 return pp; 911 } 912 913 void add_entry(PackageInfo* pp) { 914 int index = hash_to_index(pp->hash()); 915 BasicHashtable<mtClass>::add_entry(index, pp); 916 } 917 918 void copy_pkgnames(const char** packages) { 919 int n = 0; 920 for (int i = 0; i < table_size(); ++i) { 921 for (PackageInfo* pp = bucket(i); pp != NULL; pp = pp->next()) { 922 packages[n++] = pp->pkgname(); 923 } 924 } 925 assert(n == number_of_entries(), "just checking"); 926 } 927 928 CDS_ONLY(void copy_table(char** top, char* end, PackageHashtable* table);) 929 }; 930 931 #if INCLUDE_CDS 932 void PackageHashtable::copy_table(char** top, char* end, 933 PackageHashtable* table) { 934 // Copy (relocate) the table to the shared space. 935 BasicHashtable<mtClass>::copy_table(top, end); 936 937 // Calculate the space needed for the package name strings. 938 int i; 939 intptr_t* tableSize = (intptr_t*)(*top); 940 *top += sizeof(intptr_t); // For table size 941 char* tableStart = *top; 942 943 for (i = 0; i < table_size(); ++i) { 944 for (PackageInfo* pp = table->bucket(i); 945 pp != NULL; 946 pp = pp->next()) { 947 int n1 = (int)(strlen(pp->pkgname()) + 1); 948 if (*top + n1 >= end) { 949 report_out_of_shared_space(SharedMiscData); 950 } 951 pp->set_pkgname((char*)memcpy(*top, pp->pkgname(), n1)); 952 *top += n1; 953 } 954 } 955 *top = (char*)align_size_up((intptr_t)*top, sizeof(HeapWord)); 956 if (*top >= end) { 957 report_out_of_shared_space(SharedMiscData); 958 } 959 960 // Write table size 961 intptr_t len = *top - (char*)tableStart; 962 *tableSize = len; 963 } 964 965 966 void ClassLoader::copy_package_info_buckets(char** top, char* end) { 967 _package_hash_table->copy_buckets(top, end); 968 } 969 970 void ClassLoader::copy_package_info_table(char** top, char* end) { 971 _package_hash_table->copy_table(top, end, _package_hash_table); 972 } 973 #endif 974 975 PackageInfo* ClassLoader::lookup_package(const char *pkgname) { 976 const char *cp = strrchr(pkgname, '/'); 977 if (cp != NULL) { 978 // Package prefix found 979 int n = cp - pkgname + 1; 980 return _package_hash_table->get_entry(pkgname, n); 981 } 982 return NULL; 983 } 984 985 986 bool ClassLoader::add_package(const char *pkgname, int classpath_index, TRAPS) { 987 assert(pkgname != NULL, "just checking"); 988 // Bootstrap loader no longer holds system loader lock obj serializing 989 // load_instance_class and thereby add_package 990 { 991 MutexLocker ml(PackageTable_lock, THREAD); 992 // First check for previously loaded entry 993 PackageInfo* pp = lookup_package(pkgname); 994 if (pp != NULL) { 995 // Existing entry found, check source of package 996 pp->set_index(classpath_index); 997 return true; 998 } 999 1000 const char *cp = strrchr(pkgname, '/'); 1001 if (cp != NULL) { 1002 // Package prefix found 1003 int n = cp - pkgname + 1; 1004 1005 char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1, mtClass); 1006 if (new_pkgname == NULL) { 1007 return false; 1008 } 1009 1010 memcpy(new_pkgname, pkgname, n); 1011 new_pkgname[n] = '\0'; 1012 pp = _package_hash_table->new_entry(new_pkgname, n); 1013 pp->set_index(classpath_index); 1014 1015 // Insert into hash table 1016 _package_hash_table->add_entry(pp); 1017 } 1018 return true; 1019 } 1020 } 1021 1022 1023 oop ClassLoader::get_system_package(const char* name, TRAPS) { 1024 PackageInfo* pp; 1025 { 1026 MutexLocker ml(PackageTable_lock, THREAD); 1027 pp = lookup_package(name); 1028 } 1029 if (pp == NULL) { 1030 return NULL; 1031 } else { 1032 Handle p = java_lang_String::create_from_str(pp->filename(), THREAD); 1033 return p(); 1034 } 1035 } 1036 1037 1038 objArrayOop ClassLoader::get_system_packages(TRAPS) { 1039 ResourceMark rm(THREAD); 1040 int nof_entries; 1041 const char** packages; 1042 { 1043 MutexLocker ml(PackageTable_lock, THREAD); 1044 // Allocate resource char* array containing package names 1045 nof_entries = _package_hash_table->number_of_entries(); 1046 if ((packages = NEW_RESOURCE_ARRAY(const char*, nof_entries)) == NULL) { 1047 return NULL; 1048 } 1049 _package_hash_table->copy_pkgnames(packages); 1050 } 1051 // Allocate objArray and fill with java.lang.String 1052 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 1053 nof_entries, CHECK_0); 1054 objArrayHandle result(THREAD, r); 1055 for (int i = 0; i < nof_entries; i++) { 1056 Handle str = java_lang_String::create_from_str(packages[i], CHECK_0); 1057 result->obj_at_put(i, str()); 1058 } 1059 1060 return result(); 1061 } 1062 1063 1064 instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) { 1065 ResourceMark rm(THREAD); 1066 const char* class_name = h_name->as_C_string(); 1067 EventMark m("loading class %s", class_name); 1068 ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion); 1069 1070 stringStream st; 1071 // st.print() uses too much stack space while handling a StackOverflowError 1072 // st.print("%s.class", h_name->as_utf8()); 1073 st.print_raw(h_name->as_utf8()); 1074 st.print_raw(".class"); 1075 const char* file_name = st.as_string(); 1076 ClassLoaderExt::Context context(class_name, file_name, THREAD); 1077 1078 // Lookup stream for parsing .class file 1079 ClassFileStream* stream = NULL; 1080 int classpath_index = 0; 1081 ClassPathEntry* e = NULL; 1082 instanceKlassHandle h; 1083 { 1084 PerfClassTraceTime vmtimer(perf_sys_class_lookup_time(), 1085 ((JavaThread*) THREAD)->get_thread_stat()->perf_timers_addr(), 1086 PerfClassTraceTime::CLASS_LOAD); 1087 e = _first_entry; 1088 while (e != NULL) { 1089 stream = e->open_stream(file_name, CHECK_NULL); 1090 if (!context.check(stream, classpath_index)) { 1091 return h; // NULL 1092 } 1093 if (stream != NULL) { 1094 break; 1095 } 1096 e = e->next(); 1097 ++classpath_index; 1098 } 1099 } 1100 1101 if (stream != NULL) { 1102 // class file found, parse it 1103 ClassFileParser parser(stream); 1104 ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); 1105 Handle protection_domain; 1106 TempNewSymbol parsed_name = NULL; 1107 instanceKlassHandle result = parser.parseClassFile(h_name, 1108 loader_data, 1109 protection_domain, 1110 parsed_name, 1111 context.should_verify(classpath_index), 1112 THREAD); 1113 if (HAS_PENDING_EXCEPTION) { 1114 ResourceMark rm; 1115 if (DumpSharedSpaces) { 1116 tty->print_cr("Preload Error: Failed to load %s", class_name); 1117 } 1118 return h; 1119 } 1120 h = context.record_result(classpath_index, e, result, THREAD); 1121 } else { 1122 if (DumpSharedSpaces) { 1123 tty->print_cr("Preload Error: Cannot find %s", class_name); 1124 } 1125 } 1126 1127 return h; 1128 } 1129 1130 1131 void ClassLoader::create_package_info_table(HashtableBucket<mtClass> *t, int length, 1132 int number_of_entries) { 1133 assert(_package_hash_table == NULL, "One package info table allowed."); 1134 assert(length == package_hash_table_size * sizeof(HashtableBucket<mtClass>), 1135 "bad shared package info size."); 1136 _package_hash_table = new PackageHashtable(package_hash_table_size, t, 1137 number_of_entries); 1138 } 1139 1140 1141 void ClassLoader::create_package_info_table() { 1142 assert(_package_hash_table == NULL, "shouldn't have one yet"); 1143 _package_hash_table = new PackageHashtable(package_hash_table_size); 1144 } 1145 1146 1147 // Initialize the class loader's access to methods in libzip. Parse and 1148 // process the boot classpath into a list ClassPathEntry objects. Once 1149 // this list has been created, it must not change order (see class PackageInfo) 1150 // it can be appended to and is by jvmti and the kernel vm. 1151 1152 void ClassLoader::initialize() { 1153 assert(_package_hash_table == NULL, "should have been initialized by now."); 1154 EXCEPTION_MARK; 1155 1156 if (UsePerfData) { 1157 // jvmstat performance counters 1158 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time"); 1159 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime"); 1160 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self"); 1161 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime"); 1162 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self"); 1163 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime"); 1164 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self"); 1165 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses"); 1166 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses"); 1167 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses"); 1168 1169 NEWPERFTICKCOUNTER(_perf_class_parse_time, SUN_CLS, "parseClassTime"); 1170 NEWPERFTICKCOUNTER(_perf_class_parse_selftime, SUN_CLS, "parseClassTime.self"); 1171 NEWPERFTICKCOUNTER(_perf_sys_class_lookup_time, SUN_CLS, "lookupSysClassTime"); 1172 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime"); 1173 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime"); 1174 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime"); 1175 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self"); 1176 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount"); 1177 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses"); 1178 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime"); 1179 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self"); 1180 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes"); 1181 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes"); 1182 1183 1184 // The following performance counters are added for measuring the impact 1185 // of the bug fix of 6365597. They are mainly focused on finding out 1186 // the behavior of system & user-defined classloader lock, whether 1187 // ClassLoader.loadClass/findClass is being called synchronized or not. 1188 // Also two additional counters are created to see whether 'UnsyncloadClass' 1189 // flag is being set or not and how many times load_instance_class call 1190 // fails with linkageError etc. 1191 NEWPERFEVENTCOUNTER(_sync_systemLoaderLockContentionRate, SUN_CLS, 1192 "systemLoaderLockContentionRate"); 1193 NEWPERFEVENTCOUNTER(_sync_nonSystemLoaderLockContentionRate, SUN_CLS, 1194 "nonSystemLoaderLockContentionRate"); 1195 NEWPERFEVENTCOUNTER(_sync_JVMFindLoadedClassLockFreeCounter, SUN_CLS, 1196 "jvmFindLoadedClassNoLockCalls"); 1197 NEWPERFEVENTCOUNTER(_sync_JVMDefineClassLockFreeCounter, SUN_CLS, 1198 "jvmDefineClassNoLockCalls"); 1199 1200 NEWPERFEVENTCOUNTER(_sync_JNIDefineClassLockFreeCounter, SUN_CLS, 1201 "jniDefineClassNoLockCalls"); 1202 1203 NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS, 1204 "unsafeDefineClassCalls"); 1205 1206 NEWPERFEVENTCOUNTER(_isUnsyncloadClass, SUN_CLS, "isUnsyncloadClassSet"); 1207 NEWPERFEVENTCOUNTER(_load_instance_class_failCounter, SUN_CLS, 1208 "loadInstanceClassFailRate"); 1209 1210 // increment the isUnsyncloadClass counter if UnsyncloadClass is set. 1211 if (UnsyncloadClass) { 1212 _isUnsyncloadClass->inc(); 1213 } 1214 } 1215 1216 // lookup zip library entry points 1217 load_zip_library(); 1218 #if INCLUDE_CDS 1219 // initialize search path 1220 if (DumpSharedSpaces) { 1221 _shared_paths_misc_info = SharedClassUtil::allocate_shared_paths_misc_info(); 1222 } 1223 #endif 1224 setup_bootstrap_search_path(); 1225 if (LazyBootClassLoader) { 1226 // set up meta index which makes boot classpath initialization lazier 1227 setup_bootstrap_meta_index(); 1228 } 1229 } 1230 1231 #if INCLUDE_CDS 1232 void ClassLoader::initialize_shared_path() { 1233 if (DumpSharedSpaces) { 1234 ClassLoaderExt::setup_search_paths(); 1235 _shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check() 1236 } 1237 } 1238 #endif 1239 1240 jlong ClassLoader::classloader_time_ms() { 1241 return UsePerfData ? 1242 Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1; 1243 } 1244 1245 jlong ClassLoader::class_init_count() { 1246 return UsePerfData ? _perf_classes_inited->get_value() : -1; 1247 } 1248 1249 jlong ClassLoader::class_init_time_ms() { 1250 return UsePerfData ? 1251 Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1; 1252 } 1253 1254 jlong ClassLoader::class_verify_time_ms() { 1255 return UsePerfData ? 1256 Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1; 1257 } 1258 1259 jlong ClassLoader::class_link_count() { 1260 return UsePerfData ? _perf_classes_linked->get_value() : -1; 1261 } 1262 1263 jlong ClassLoader::class_link_time_ms() { 1264 return UsePerfData ? 1265 Management::ticks_to_ms(_perf_class_link_time->get_value()) : -1; 1266 } 1267 1268 int ClassLoader::compute_Object_vtable() { 1269 // hardwired for JDK1.2 -- would need to duplicate class file parsing 1270 // code to determine actual value from file 1271 // Would be value '11' if finals were in vtable 1272 int JDK_1_2_Object_vtable_size = 5; 1273 return JDK_1_2_Object_vtable_size * vtableEntry::size(); 1274 } 1275 1276 1277 void classLoader_init() { 1278 ClassLoader::initialize(); 1279 } 1280 1281 1282 bool ClassLoader::get_canonical_path(const char* orig, char* out, int len) { 1283 assert(orig != NULL && out != NULL && len > 0, "bad arguments"); 1284 if (CanonicalizeEntry != NULL) { 1285 JavaThread* THREAD = JavaThread::current(); 1286 JNIEnv* env = THREAD->jni_environment(); 1287 ResourceMark rm(THREAD); 1288 1289 // os::native_path writes into orig_copy 1290 char* orig_copy = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, strlen(orig)+1); 1291 strcpy(orig_copy, orig); 1292 if ((CanonicalizeEntry)(env, os::native_path(orig_copy), out, len) < 0) { 1293 return false; 1294 } 1295 } else { 1296 // On JDK 1.2.2 the Canonicalize does not exist, so just do nothing 1297 strncpy(out, orig, len); 1298 out[len - 1] = '\0'; 1299 } 1300 return true; 1301 } 1302 1303 #ifndef PRODUCT 1304 1305 void ClassLoader::verify() { 1306 _package_hash_table->verify(); 1307 } 1308 1309 1310 // CompileTheWorld 1311 // 1312 // Iterates over all class path entries and forces compilation of all methods 1313 // in all classes found. Currently, only zip/jar archives are searched. 1314 // 1315 // The classes are loaded by the Java level bootstrap class loader, and the 1316 // initializer is called. If DelayCompilationDuringStartup is true (default), 1317 // the interpreter will run the initialization code. Note that forcing 1318 // initialization in this way could potentially lead to initialization order 1319 // problems, in which case we could just force the initialization bit to be set. 1320 1321 1322 // We need to iterate over the contents of a zip/jar file, so we replicate the 1323 // jzcell and jzfile definitions from zip_util.h but rename jzfile to real_jzfile, 1324 // since jzfile already has a void* definition. 1325 // 1326 // Note that this is only used in debug mode. 1327 // 1328 // HotSpot integration note: 1329 // Matches zip_util.h 1.14 99/06/01 from jdk1.3 beta H build 1330 1331 1332 // JDK 1.3 version 1333 typedef struct real_jzentry { /* Zip file entry */ 1334 char *name; /* entry name */ 1335 jint time; /* modification time */ 1336 jint size; /* size of uncompressed data */ 1337 jint csize; /* size of compressed data (zero if uncompressed) */ 1338 jint crc; /* crc of uncompressed data */ 1339 char *comment; /* optional zip file comment */ 1340 jbyte *extra; /* optional extra data */ 1341 jint pos; /* position of LOC header (if negative) or data */ 1342 } real_jzentry; 1343 1344 typedef struct real_jzfile { /* Zip file */ 1345 char *name; /* zip file name */ 1346 jint refs; /* number of active references */ 1347 jint fd; /* open file descriptor */ 1348 void *lock; /* read lock */ 1349 char *comment; /* zip file comment */ 1350 char *msg; /* zip error message */ 1351 void *entries; /* array of hash cells */ 1352 jint total; /* total number of entries */ 1353 unsigned short *table; /* Hash chain heads: indexes into entries */ 1354 jint tablelen; /* number of hash eads */ 1355 real_jzfile *next; /* next zip file in search list */ 1356 jzentry *cache; /* we cache the most recently freed jzentry */ 1357 /* Information on metadata names in META-INF directory */ 1358 char **metanames; /* array of meta names (may have null names) */ 1359 jint metacount; /* number of slots in metanames array */ 1360 /* If there are any per-entry comments, they are in the comments array */ 1361 char **comments; 1362 } real_jzfile; 1363 1364 void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) { 1365 // For now we only compile all methods in all classes in zip/jar files 1366 tty->print_cr("CompileTheWorld : Skipped classes in %s", _dir); 1367 tty->cr(); 1368 } 1369 1370 1371 bool ClassPathDirEntry::is_rt_jar() { 1372 return false; 1373 } 1374 1375 void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) { 1376 real_jzfile* zip = (real_jzfile*) _zip; 1377 tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name); 1378 tty->cr(); 1379 // Iterate over all entries in zip file 1380 for (int n = 0; ; n++) { 1381 real_jzentry * ze = (real_jzentry *)((*GetNextEntry)(_zip, n)); 1382 if (ze == NULL) break; 1383 ClassLoader::compile_the_world_in(ze->name, loader, CHECK); 1384 } 1385 if (HAS_PENDING_EXCEPTION) { 1386 if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) { 1387 CLEAR_PENDING_EXCEPTION; 1388 tty->print_cr("\nCompileTheWorld : Ran out of memory\n"); 1389 tty->print_cr("Increase class metadata storage if a limit was set"); 1390 } else { 1391 tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n"); 1392 } 1393 } 1394 } 1395 1396 bool ClassPathZipEntry::is_rt_jar() { 1397 real_jzfile* zip = (real_jzfile*) _zip; 1398 int len = (int)strlen(zip->name); 1399 // Check whether zip name ends in "rt.jar" 1400 // This will match other archives named rt.jar as well, but this is 1401 // only used for debugging. 1402 return (len >= 6) && (strcasecmp(zip->name + len - 6, "rt.jar") == 0); 1403 } 1404 1405 void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) { 1406 ClassPathEntry* cpe = resolve_entry(THREAD); 1407 if (cpe != NULL) { 1408 cpe->compile_the_world(loader, CHECK); 1409 } 1410 } 1411 1412 bool LazyClassPathEntry::is_rt_jar() { 1413 Thread* THREAD = Thread::current(); 1414 ClassPathEntry* cpe = resolve_entry(THREAD); 1415 return (cpe != NULL) ? cpe->is_jar_file() : false; 1416 } 1417 1418 void ClassLoader::compile_the_world() { 1419 EXCEPTION_MARK; 1420 HandleMark hm(THREAD); 1421 ResourceMark rm(THREAD); 1422 // Make sure we don't run with background compilation 1423 BackgroundCompilation = false; 1424 // Find bootstrap loader 1425 Handle system_class_loader (THREAD, SystemDictionary::java_system_loader()); 1426 // Iterate over all bootstrap class path entries 1427 ClassPathEntry* e = _first_entry; 1428 jlong start = os::javaTimeMillis(); 1429 while (e != NULL) { 1430 // We stop at rt.jar, unless it is the first bootstrap path entry 1431 if (e->is_rt_jar() && e != _first_entry) break; 1432 e->compile_the_world(system_class_loader, CATCH); 1433 e = e->next(); 1434 } 1435 jlong end = os::javaTimeMillis(); 1436 tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, " JLONG_FORMAT " ms)", 1437 _compile_the_world_class_counter, _compile_the_world_method_counter, (end - start)); 1438 { 1439 // Print statistics as if before normal exit: 1440 extern void print_statistics(); 1441 print_statistics(); 1442 } 1443 vm_exit(0); 1444 } 1445 1446 int ClassLoader::_compile_the_world_class_counter = 0; 1447 int ClassLoader::_compile_the_world_method_counter = 0; 1448 static int _codecache_sweep_counter = 0; 1449 1450 // Filter out all exceptions except OOMs 1451 static void clear_pending_exception_if_not_oom(TRAPS) { 1452 if (HAS_PENDING_EXCEPTION && 1453 !PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) { 1454 CLEAR_PENDING_EXCEPTION; 1455 } 1456 // The CHECK at the caller will propagate the exception out 1457 } 1458 1459 /** 1460 * Returns if the given method should be compiled when doing compile-the-world. 1461 * 1462 * TODO: This should be a private method in a CompileTheWorld class. 1463 */ 1464 static bool can_be_compiled(methodHandle m, int comp_level) { 1465 assert(CompileTheWorld, "must be"); 1466 1467 // It's not valid to compile a native wrapper for MethodHandle methods 1468 // that take a MemberName appendix since the bytecode signature is not 1469 // correct. 1470 vmIntrinsics::ID iid = m->intrinsic_id(); 1471 if (MethodHandles::is_signature_polymorphic(iid) && MethodHandles::has_member_arg(iid)) { 1472 return false; 1473 } 1474 1475 return CompilationPolicy::can_be_compiled(m, comp_level); 1476 } 1477 1478 void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) { 1479 int len = (int)strlen(name); 1480 if (len > 6 && strcmp(".class", name + len - 6) == 0) { 1481 // We have a .class file 1482 char buffer[2048]; 1483 strncpy(buffer, name, len - 6); 1484 buffer[len-6] = 0; 1485 // If the file has a period after removing .class, it's not really a 1486 // valid class file. The class loader will check everything else. 1487 if (strchr(buffer, '.') == NULL) { 1488 _compile_the_world_class_counter++; 1489 if (_compile_the_world_class_counter > CompileTheWorldStopAt) return; 1490 1491 // Construct name without extension 1492 TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK); 1493 // Use loader to load and initialize class 1494 Klass* ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD); 1495 instanceKlassHandle k (THREAD, ik); 1496 if (k.not_null() && !HAS_PENDING_EXCEPTION) { 1497 k->initialize(THREAD); 1498 } 1499 bool exception_occurred = HAS_PENDING_EXCEPTION; 1500 clear_pending_exception_if_not_oom(CHECK); 1501 if (CompileTheWorldPreloadClasses && k.not_null()) { 1502 ConstantPool::preload_and_initialize_all_classes(k->constants(), THREAD); 1503 if (HAS_PENDING_EXCEPTION) { 1504 // If something went wrong in preloading we just ignore it 1505 clear_pending_exception_if_not_oom(CHECK); 1506 tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_class_counter, buffer); 1507 } 1508 } 1509 1510 if (_compile_the_world_class_counter >= CompileTheWorldStartAt) { 1511 if (k.is_null() || exception_occurred) { 1512 // If something went wrong (e.g. ExceptionInInitializerError) we skip this class 1513 tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer); 1514 } else { 1515 tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_class_counter, buffer); 1516 // Preload all classes to get around uncommon traps 1517 // Iterate over all methods in class 1518 int comp_level = CompilationPolicy::policy()->initial_compile_level(); 1519 for (int n = 0; n < k->methods()->length(); n++) { 1520 methodHandle m (THREAD, k->methods()->at(n)); 1521 if (can_be_compiled(m, comp_level)) { 1522 if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) { 1523 // Give sweeper a chance to keep up with CTW 1524 VM_ForceSafepoint op; 1525 VMThread::execute(&op); 1526 _codecache_sweep_counter = 0; 1527 } 1528 // Force compilation 1529 CompileBroker::compile_method(m, InvocationEntryBci, comp_level, 1530 methodHandle(), 0, "CTW", THREAD); 1531 if (HAS_PENDING_EXCEPTION) { 1532 clear_pending_exception_if_not_oom(CHECK); 1533 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string()); 1534 } else { 1535 _compile_the_world_method_counter++; 1536 } 1537 if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) { 1538 // Clobber the first compile and force second tier compilation 1539 nmethod* nm = m->code(); 1540 if (nm != NULL && !m->is_method_handle_intrinsic()) { 1541 // Throw out the code so that the code cache doesn't fill up 1542 nm->make_not_entrant(); 1543 m->clear_code(); 1544 } 1545 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization, 1546 methodHandle(), 0, "CTW", THREAD); 1547 if (HAS_PENDING_EXCEPTION) { 1548 clear_pending_exception_if_not_oom(CHECK); 1549 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string()); 1550 } else { 1551 _compile_the_world_method_counter++; 1552 } 1553 } 1554 } else { 1555 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string()); 1556 } 1557 1558 nmethod* nm = m->code(); 1559 if (nm != NULL && !m->is_method_handle_intrinsic()) { 1560 // Throw out the code so that the code cache doesn't fill up 1561 nm->make_not_entrant(); 1562 m->clear_code(); 1563 } 1564 } 1565 } 1566 } 1567 } 1568 } 1569 } 1570 1571 #endif //PRODUCT 1572 1573 // Please keep following two functions at end of this file. With them placed at top or in middle of the file, 1574 // they could get inlined by agressive compiler, an unknown trick, see bug 6966589. 1575 void PerfClassTraceTime::initialize() { 1576 if (!UsePerfData) return; 1577 1578 if (_eventp != NULL) { 1579 // increment the event counter 1580 _eventp->inc(); 1581 } 1582 1583 // stop the current active thread-local timer to measure inclusive time 1584 _prev_active_event = -1; 1585 for (int i=0; i < EVENT_TYPE_COUNT; i++) { 1586 if (_timers[i].is_active()) { 1587 assert(_prev_active_event == -1, "should have only one active timer"); 1588 _prev_active_event = i; 1589 _timers[i].stop(); 1590 } 1591 } 1592 1593 if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) { 1594 // start the inclusive timer if not recursively called 1595 _t.start(); 1596 } 1597 1598 // start thread-local timer of the given event type 1599 if (!_timers[_event_type].is_active()) { 1600 _timers[_event_type].start(); 1601 } 1602 } 1603 1604 PerfClassTraceTime::~PerfClassTraceTime() { 1605 if (!UsePerfData) return; 1606 1607 // stop the thread-local timer as the event completes 1608 // and resume the thread-local timer of the event next on the stack 1609 _timers[_event_type].stop(); 1610 jlong selftime = _timers[_event_type].ticks(); 1611 1612 if (_prev_active_event >= 0) { 1613 _timers[_prev_active_event].start(); 1614 } 1615 1616 if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return; 1617 1618 // increment the counters only on the leaf call 1619 _t.stop(); 1620 _timep->inc(_t.ticks()); 1621 if (_selftimep != NULL) { 1622 _selftimep->inc(selftime); 1623 } 1624 // add all class loading related event selftime to the accumulated time counter 1625 ClassLoader::perf_accumulated_time()->inc(selftime); 1626 1627 // reset the timer 1628 _timers[_event_type].reset(); 1629 }