483 case BEFORE_EXIT_DONE: 484 return; 485 } 486 } 487 488 // The only difference between this and Win32's _onexit procs is that 489 // this version is invoked before any threads get killed. 490 ExitProc* current = exit_procs; 491 while (current != NULL) { 492 ExitProc* next = current->next(); 493 current->evaluate(); 494 delete current; 495 current = next; 496 } 497 498 // Hang forever on exit if we're reporting an error. 499 if (ShowMessageBoxOnError && is_error_reported()) { 500 os::infinite_sleep(); 501 } 502 503 // Stop any ongoing concurrent GC work 504 Universe::heap()->stop(); 505 506 // Terminate watcher thread - must before disenrolling any periodic task 507 if (PeriodicTask::num_tasks() > 0) 508 WatcherThread::stop(); 509 510 // Print statistics gathered (profiling ...) 511 if (Arguments::has_profile()) { 512 FlatProfiler::disengage(); 513 FlatProfiler::print(10); 514 } 515 516 // shut down the StatSampler task 517 StatSampler::disengage(); 518 StatSampler::destroy(); 519 520 // We do not need to explicitly stop concurrent GC threads because the 521 // JVM will be taken down at a safepoint when such threads are inactive -- 522 // except for some concurrent G1 threads, see (comment in) 523 // Threads::destroy_vm(). 524 525 // Print GC/heap related information. 526 if (PrintGCDetails) { 527 Universe::print(); 528 AdaptiveSizePolicyOutput(0); 529 if (Verbose) { 530 ClassLoaderDataGraph::dump_on(gclog_or_tty); 531 } 532 } 533 534 if (PrintBytecodeHistogram) { 535 BytecodeHistogram::print(); 536 } 537 538 if (JvmtiExport::should_post_thread_life()) { 539 JvmtiExport::post_thread_end(thread); 540 } 541 542 543 EventThreadEnd event; | 483 case BEFORE_EXIT_DONE: 484 return; 485 } 486 } 487 488 // The only difference between this and Win32's _onexit procs is that 489 // this version is invoked before any threads get killed. 490 ExitProc* current = exit_procs; 491 while (current != NULL) { 492 ExitProc* next = current->next(); 493 current->evaluate(); 494 delete current; 495 current = next; 496 } 497 498 // Hang forever on exit if we're reporting an error. 499 if (ShowMessageBoxOnError && is_error_reported()) { 500 os::infinite_sleep(); 501 } 502 503 // Terminate watcher thread - must before disenrolling any periodic task 504 if (PeriodicTask::num_tasks() > 0) 505 WatcherThread::stop(); 506 507 // Print statistics gathered (profiling ...) 508 if (Arguments::has_profile()) { 509 FlatProfiler::disengage(); 510 FlatProfiler::print(10); 511 } 512 513 // shut down the StatSampler task 514 StatSampler::disengage(); 515 StatSampler::destroy(); 516 517 // Stop concurrent GC threads 518 Universe::heap()->stop(); 519 520 // Print GC/heap related information. 521 if (PrintGCDetails) { 522 Universe::print(); 523 AdaptiveSizePolicyOutput(0); 524 if (Verbose) { 525 ClassLoaderDataGraph::dump_on(gclog_or_tty); 526 } 527 } 528 529 if (PrintBytecodeHistogram) { 530 BytecodeHistogram::print(); 531 } 532 533 if (JvmtiExport::should_post_thread_life()) { 534 JvmtiExport::post_thread_end(thread); 535 } 536 537 538 EventThreadEnd event; |