comparison src/share/vm/classfile/classLoader.cpp @ 2181:d25d4ca69222

Merge.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Wed, 16 Feb 2011 13:47:20 +0100
parents 06f017f7daa7 3582bf76420e
children 2ab52cda08e5
comparison
equal deleted inserted replaced
2108:50b45e2d9725 2181:d25d4ca69222
39 #include "memory/universe.inline.hpp" 39 #include "memory/universe.inline.hpp"
40 #include "oops/constantPoolKlass.hpp" 40 #include "oops/constantPoolKlass.hpp"
41 #include "oops/instanceKlass.hpp" 41 #include "oops/instanceKlass.hpp"
42 #include "oops/instanceRefKlass.hpp" 42 #include "oops/instanceRefKlass.hpp"
43 #include "oops/oop.inline.hpp" 43 #include "oops/oop.inline.hpp"
44 #include "oops/symbolOop.hpp" 44 #include "oops/symbol.hpp"
45 #include "prims/jvm_misc.hpp" 45 #include "prims/jvm_misc.hpp"
46 #include "runtime/arguments.hpp" 46 #include "runtime/arguments.hpp"
47 #include "runtime/compilationPolicy.hpp" 47 #include "runtime/compilationPolicy.hpp"
48 #include "runtime/fprofiler.hpp" 48 #include "runtime/fprofiler.hpp"
49 #include "runtime/handles.hpp" 49 #include "runtime/handles.hpp"
750 pp = pp->next()) { 750 pp = pp->next()) {
751 n += (int)(strlen(pp->pkgname()) + 1); 751 n += (int)(strlen(pp->pkgname()) + 1);
752 } 752 }
753 } 753 }
754 if (*top + n + sizeof(intptr_t) >= end) { 754 if (*top + n + sizeof(intptr_t) >= end) {
755 warning("\nThe shared miscellaneous data space is not large " 755 report_out_of_shared_space(SharedMiscData);
756 "enough to \npreload requested classes. Use "
757 "-XX:SharedMiscDataSize= to increase \nthe initial "
758 "size of the miscellaneous data space.\n");
759 exit(2);
760 } 756 }
761 757
762 // Copy the table data (the strings) to the shared space. 758 // Copy the table data (the strings) to the shared space.
763 n = align_size_up(n, sizeof(HeapWord)); 759 n = align_size_up(n, sizeof(HeapWord));
764 *(intptr_t*)(*top) = n; 760 *(intptr_t*)(*top) = n;
873 869
874 return result(); 870 return result();
875 } 871 }
876 872
877 873
878 instanceKlassHandle ClassLoader::load_classfile(symbolHandle h_name, TRAPS) { 874 instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
879 ResourceMark rm(THREAD); 875 ResourceMark rm(THREAD);
880 EventMark m("loading class " INTPTR_FORMAT, (address)h_name()); 876 EventMark m("loading class " INTPTR_FORMAT, (address)h_name);
881 ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion); 877 ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion);
882 878
883 stringStream st; 879 stringStream st;
884 // st.print() uses too much stack space while handling a StackOverflowError 880 // st.print() uses too much stack space while handling a StackOverflowError
885 // st.print("%s.class", h_name->as_utf8()); 881 // st.print("%s.class", h_name->as_utf8());
910 906
911 // class file found, parse it 907 // class file found, parse it
912 ClassFileParser parser(stream); 908 ClassFileParser parser(stream);
913 Handle class_loader; 909 Handle class_loader;
914 Handle protection_domain; 910 Handle protection_domain;
915 symbolHandle parsed_name; 911 TempNewSymbol parsed_name = NULL;
916 instanceKlassHandle result = parser.parseClassFile(h_name, 912 instanceKlassHandle result = parser.parseClassFile(h_name,
917 class_loader, 913 class_loader,
918 protection_domain, 914 protection_domain,
919 parsed_name, 915 parsed_name,
920 false, 916 false,
1306 if (strchr(buffer, '.') == NULL) { 1302 if (strchr(buffer, '.') == NULL) {
1307 _compile_the_world_counter++; 1303 _compile_the_world_counter++;
1308 if (_compile_the_world_counter > CompileTheWorldStopAt) return; 1304 if (_compile_the_world_counter > CompileTheWorldStopAt) return;
1309 1305
1310 // Construct name without extension 1306 // Construct name without extension
1311 symbolHandle sym = oopFactory::new_symbol_handle(buffer, CHECK); 1307 TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
1312 // Use loader to load and initialize class 1308 // Use loader to load and initialize class
1313 klassOop ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD); 1309 klassOop ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
1314 instanceKlassHandle k (THREAD, ik); 1310 instanceKlassHandle k (THREAD, ik);
1315 if (k.not_null() && !HAS_PENDING_EXCEPTION) { 1311 if (k.not_null() && !HAS_PENDING_EXCEPTION) {
1316 k->initialize(THREAD); 1312 k->initialize(THREAD);
1380 } 1376 }
1381 } 1377 }
1382 } 1378 }
1383 1379
1384 #endif //PRODUCT 1380 #endif //PRODUCT
1381
1382 // Please keep following two functions at end of this file. With them placed at top or in middle of the file,
1383 // they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
1384 void PerfClassTraceTime::initialize() {
1385 if (!UsePerfData) return;
1386
1387 if (_eventp != NULL) {
1388 // increment the event counter
1389 _eventp->inc();
1390 }
1391
1392 // stop the current active thread-local timer to measure inclusive time
1393 _prev_active_event = -1;
1394 for (int i=0; i < EVENT_TYPE_COUNT; i++) {
1395 if (_timers[i].is_active()) {
1396 assert(_prev_active_event == -1, "should have only one active timer");
1397 _prev_active_event = i;
1398 _timers[i].stop();
1399 }
1400 }
1401
1402 if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
1403 // start the inclusive timer if not recursively called
1404 _t.start();
1405 }
1406
1407 // start thread-local timer of the given event type
1408 if (!_timers[_event_type].is_active()) {
1409 _timers[_event_type].start();
1410 }
1411 }
1412
1413 PerfClassTraceTime::~PerfClassTraceTime() {
1414 if (!UsePerfData) return;
1415
1416 // stop the thread-local timer as the event completes
1417 // and resume the thread-local timer of the event next on the stack
1418 _timers[_event_type].stop();
1419 jlong selftime = _timers[_event_type].ticks();
1420
1421 if (_prev_active_event >= 0) {
1422 _timers[_prev_active_event].start();
1423 }
1424
1425 if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
1426
1427 // increment the counters only on the leaf call
1428 _t.stop();
1429 _timep->inc(_t.ticks());
1430 if (_selftimep != NULL) {
1431 _selftimep->inc(selftime);
1432 }
1433 // add all class loading related event selftime to the accumulated time counter
1434 ClassLoader::perf_accumulated_time()->inc(selftime);
1435
1436 // reset the timer
1437 _timers[_event_type].reset();
1438 }