Mercurial > hg > truffle
comparison src/share/vm/classfile/classLoader.cpp @ 9150:b8b081e53312
8011933: add number of classes, methods and time spent to CompileTheWorld
Reviewed-by: jrose, kvn
author | twisti |
---|---|
date | Fri, 12 Apr 2013 12:22:59 -0700 |
parents | 90273fc0a981 |
children | 43223d3f5dcd d1c9384eecb4 |
comparison
equal
deleted
inserted
replaced
9149:c60f69931e1a | 9150:b8b081e53312 |
---|---|
1272 BackgroundCompilation = false; | 1272 BackgroundCompilation = false; |
1273 // Find bootstrap loader | 1273 // Find bootstrap loader |
1274 Handle system_class_loader (THREAD, SystemDictionary::java_system_loader()); | 1274 Handle system_class_loader (THREAD, SystemDictionary::java_system_loader()); |
1275 // Iterate over all bootstrap class path entries | 1275 // Iterate over all bootstrap class path entries |
1276 ClassPathEntry* e = _first_entry; | 1276 ClassPathEntry* e = _first_entry; |
1277 jlong start = os::javaTimeMillis(); | |
1277 while (e != NULL) { | 1278 while (e != NULL) { |
1278 // We stop at rt.jar, unless it is the first bootstrap path entry | 1279 // We stop at rt.jar, unless it is the first bootstrap path entry |
1279 if (e->is_rt_jar() && e != _first_entry) break; | 1280 if (e->is_rt_jar() && e != _first_entry) break; |
1280 e->compile_the_world(system_class_loader, CATCH); | 1281 e->compile_the_world(system_class_loader, CATCH); |
1281 e = e->next(); | 1282 e = e->next(); |
1282 } | 1283 } |
1283 tty->print_cr("CompileTheWorld : Done"); | 1284 jlong end = os::javaTimeMillis(); |
1285 tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, %d ms)", | |
1286 _compile_the_world_class_counter, _compile_the_world_method_counter, (end - start)); | |
1284 { | 1287 { |
1285 // Print statistics as if before normal exit: | 1288 // Print statistics as if before normal exit: |
1286 extern void print_statistics(); | 1289 extern void print_statistics(); |
1287 print_statistics(); | 1290 print_statistics(); |
1288 } | 1291 } |
1289 vm_exit(0); | 1292 vm_exit(0); |
1290 } | 1293 } |
1291 | 1294 |
1292 int ClassLoader::_compile_the_world_counter = 0; | 1295 int ClassLoader::_compile_the_world_class_counter = 0; |
1296 int ClassLoader::_compile_the_world_method_counter = 0; | |
1293 static int _codecache_sweep_counter = 0; | 1297 static int _codecache_sweep_counter = 0; |
1294 | 1298 |
1295 // Filter out all exceptions except OOMs | 1299 // Filter out all exceptions except OOMs |
1296 static void clear_pending_exception_if_not_oom(TRAPS) { | 1300 static void clear_pending_exception_if_not_oom(TRAPS) { |
1297 if (HAS_PENDING_EXCEPTION && | 1301 if (HAS_PENDING_EXCEPTION && |
1309 strncpy(buffer, name, len - 6); | 1313 strncpy(buffer, name, len - 6); |
1310 buffer[len-6] = 0; | 1314 buffer[len-6] = 0; |
1311 // If the file has a period after removing .class, it's not really a | 1315 // If the file has a period after removing .class, it's not really a |
1312 // valid class file. The class loader will check everything else. | 1316 // valid class file. The class loader will check everything else. |
1313 if (strchr(buffer, '.') == NULL) { | 1317 if (strchr(buffer, '.') == NULL) { |
1314 _compile_the_world_counter++; | 1318 _compile_the_world_class_counter++; |
1315 if (_compile_the_world_counter > CompileTheWorldStopAt) return; | 1319 if (_compile_the_world_class_counter > CompileTheWorldStopAt) return; |
1316 | 1320 |
1317 // Construct name without extension | 1321 // Construct name without extension |
1318 TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK); | 1322 TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK); |
1319 // Use loader to load and initialize class | 1323 // Use loader to load and initialize class |
1320 Klass* ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD); | 1324 Klass* ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD); |
1327 if (CompileTheWorldPreloadClasses && k.not_null()) { | 1331 if (CompileTheWorldPreloadClasses && k.not_null()) { |
1328 ConstantPool::preload_and_initialize_all_classes(k->constants(), THREAD); | 1332 ConstantPool::preload_and_initialize_all_classes(k->constants(), THREAD); |
1329 if (HAS_PENDING_EXCEPTION) { | 1333 if (HAS_PENDING_EXCEPTION) { |
1330 // If something went wrong in preloading we just ignore it | 1334 // If something went wrong in preloading we just ignore it |
1331 clear_pending_exception_if_not_oom(CHECK); | 1335 clear_pending_exception_if_not_oom(CHECK); |
1332 tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer); | 1336 tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_class_counter, buffer); |
1333 } | 1337 } |
1334 } | 1338 } |
1335 | 1339 |
1336 if (_compile_the_world_counter >= CompileTheWorldStartAt) { | 1340 if (_compile_the_world_class_counter >= CompileTheWorldStartAt) { |
1337 if (k.is_null() || exception_occurred) { | 1341 if (k.is_null() || exception_occurred) { |
1338 // If something went wrong (e.g. ExceptionInInitializerError) we skip this class | 1342 // If something went wrong (e.g. ExceptionInInitializerError) we skip this class |
1339 tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_counter, buffer); | 1343 tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer); |
1340 } else { | 1344 } else { |
1341 tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_counter, buffer); | 1345 tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_class_counter, buffer); |
1342 // Preload all classes to get around uncommon traps | 1346 // Preload all classes to get around uncommon traps |
1343 // Iterate over all methods in class | 1347 // Iterate over all methods in class |
1344 for (int n = 0; n < k->methods()->length(); n++) { | 1348 for (int n = 0; n < k->methods()->length(); n++) { |
1345 methodHandle m (THREAD, k->methods()->at(n)); | 1349 methodHandle m (THREAD, k->methods()->at(n)); |
1346 if (CompilationPolicy::can_be_compiled(m)) { | 1350 if (CompilationPolicy::can_be_compiled(m)) { |
1354 // Force compilation | 1358 // Force compilation |
1355 CompileBroker::compile_method(m, InvocationEntryBci, CompilationPolicy::policy()->initial_compile_level(), | 1359 CompileBroker::compile_method(m, InvocationEntryBci, CompilationPolicy::policy()->initial_compile_level(), |
1356 methodHandle(), 0, "CTW", THREAD); | 1360 methodHandle(), 0, "CTW", THREAD); |
1357 if (HAS_PENDING_EXCEPTION) { | 1361 if (HAS_PENDING_EXCEPTION) { |
1358 clear_pending_exception_if_not_oom(CHECK); | 1362 clear_pending_exception_if_not_oom(CHECK); |
1359 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string()); | 1363 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string()); |
1364 } else { | |
1365 _compile_the_world_method_counter++; | |
1360 } | 1366 } |
1361 if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) { | 1367 if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) { |
1362 // Clobber the first compile and force second tier compilation | 1368 // Clobber the first compile and force second tier compilation |
1363 nmethod* nm = m->code(); | 1369 nmethod* nm = m->code(); |
1364 if (nm != NULL) { | 1370 if (nm != NULL) { |
1368 } | 1374 } |
1369 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization, | 1375 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization, |
1370 methodHandle(), 0, "CTW", THREAD); | 1376 methodHandle(), 0, "CTW", THREAD); |
1371 if (HAS_PENDING_EXCEPTION) { | 1377 if (HAS_PENDING_EXCEPTION) { |
1372 clear_pending_exception_if_not_oom(CHECK); | 1378 clear_pending_exception_if_not_oom(CHECK); |
1373 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string()); | 1379 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string()); |
1380 } else { | |
1381 _compile_the_world_method_counter++; | |
1374 } | 1382 } |
1375 } | 1383 } |
1376 } | 1384 } |
1377 | 1385 |
1378 nmethod* nm = m->code(); | 1386 nmethod* nm = m->code(); |