764 }
765 #endif // #ifdef ASSERT
766
767 #ifdef NOT_PRODUCT
768 ParallelCompactData::RegionData* debug_region(size_t region_index) {
769 ParallelCompactData& sd = PSParallelCompact::summary_data();
770 return sd.region(region_index);
771 }
772 #endif
773
774 elapsedTimer PSParallelCompact::_accumulated_time;
775 unsigned int PSParallelCompact::_total_invocations = 0;
776 unsigned int PSParallelCompact::_maximum_compaction_gc_num = 0;
777 jlong PSParallelCompact::_time_of_last_gc = 0;
778 CollectorCounters* PSParallelCompact::_counters = NULL;
779 ParMarkBitMap PSParallelCompact::_mark_bitmap;
780 ParallelCompactData PSParallelCompact::_summary_data;
781
782 PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure;
783
784 void PSParallelCompact::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); }
785 bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); }
786
787 void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
788 void PSParallelCompact::KeepAliveClosure::do_oop(narrowOop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
789
790 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure;
791 PSParallelCompact::AdjustKlassClosure PSParallelCompact::_adjust_klass_closure;
792
793 void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p); }
794 void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p); }
795
796 void PSParallelCompact::FollowStackClosure::do_void() { _compaction_manager->follow_marking_stacks(); }
797
798 void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p) {
799 mark_and_push(_compaction_manager, p);
800 }
801 void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(_compaction_manager, p); }
802
803 void PSParallelCompact::FollowKlassClosure::do_klass(Klass* klass) {
804 klass->oops_do(_mark_and_push_closure);
2389 }
2390
2391 void PSParallelCompact::follow_class_loader(ParCompactionManager* cm,
2392 ClassLoaderData* cld) {
2393 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
2394 PSParallelCompact::FollowKlassClosure follow_klass_closure(&mark_and_push_closure);
2395
2396 cld->oops_do(&mark_and_push_closure, &follow_klass_closure, true);
2397 }
2398
2399 void PSParallelCompact::adjust_class_loader(ParCompactionManager* cm,
2400 ClassLoaderData* cld) {
2401 cld->oops_do(PSParallelCompact::adjust_pointer_closure(),
2402 PSParallelCompact::adjust_klass_closure(),
2403 true);
2404 }
2405
2406 // This should be moved to the shared markSweep code!
2407 class PSAlwaysTrueClosure: public BoolObjectClosure {
2408 public:
2409 void do_object(oop p) { ShouldNotReachHere(); }
2410 bool do_object_b(oop p) { return true; }
2411 };
2412 static PSAlwaysTrueClosure always_true;
2413
2414 void PSParallelCompact::adjust_roots() {
2415 // Adjust the pointers to reflect the new locations
2416 TraceTime tm("adjust roots", print_phases(), true, gclog_or_tty);
2417
2418 // Need new claim bits when tracing through and adjusting pointers.
2419 ClassLoaderDataGraph::clear_claimed_marks();
2420
2421 // General strong roots.
2422 Universe::oops_do(adjust_pointer_closure());
2423 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
2424 CLDToOopClosure adjust_from_cld(adjust_pointer_closure());
2425 Threads::oops_do(adjust_pointer_closure(), &adjust_from_cld, NULL);
2426 ObjectSynchronizer::oops_do(adjust_pointer_closure());
2427 FlatProfiler::oops_do(adjust_pointer_closure());
2428 Management::oops_do(adjust_pointer_closure());
2429 JvmtiExport::oops_do(adjust_pointer_closure());
|
764 }
765 #endif // #ifdef ASSERT
766
767 #ifdef NOT_PRODUCT
768 ParallelCompactData::RegionData* debug_region(size_t region_index) {
769 ParallelCompactData& sd = PSParallelCompact::summary_data();
770 return sd.region(region_index);
771 }
772 #endif
773
774 elapsedTimer PSParallelCompact::_accumulated_time;
775 unsigned int PSParallelCompact::_total_invocations = 0;
776 unsigned int PSParallelCompact::_maximum_compaction_gc_num = 0;
777 jlong PSParallelCompact::_time_of_last_gc = 0;
778 CollectorCounters* PSParallelCompact::_counters = NULL;
779 ParMarkBitMap PSParallelCompact::_mark_bitmap;
780 ParallelCompactData PSParallelCompact::_summary_data;
781
782 PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure;
783
784 bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); }
785
786 void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
787 void PSParallelCompact::KeepAliveClosure::do_oop(narrowOop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
788
789 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure;
790 PSParallelCompact::AdjustKlassClosure PSParallelCompact::_adjust_klass_closure;
791
792 void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p); }
793 void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p); }
794
795 void PSParallelCompact::FollowStackClosure::do_void() { _compaction_manager->follow_marking_stacks(); }
796
797 void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p) {
798 mark_and_push(_compaction_manager, p);
799 }
800 void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(_compaction_manager, p); }
801
802 void PSParallelCompact::FollowKlassClosure::do_klass(Klass* klass) {
803 klass->oops_do(_mark_and_push_closure);
2388 }
2389
2390 void PSParallelCompact::follow_class_loader(ParCompactionManager* cm,
2391 ClassLoaderData* cld) {
2392 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
2393 PSParallelCompact::FollowKlassClosure follow_klass_closure(&mark_and_push_closure);
2394
2395 cld->oops_do(&mark_and_push_closure, &follow_klass_closure, true);
2396 }
2397
2398 void PSParallelCompact::adjust_class_loader(ParCompactionManager* cm,
2399 ClassLoaderData* cld) {
2400 cld->oops_do(PSParallelCompact::adjust_pointer_closure(),
2401 PSParallelCompact::adjust_klass_closure(),
2402 true);
2403 }
2404
2405 // This should be moved to the shared markSweep code!
2406 class PSAlwaysTrueClosure: public BoolObjectClosure {
2407 public:
2408 bool do_object_b(oop p) { return true; }
2409 };
2410 static PSAlwaysTrueClosure always_true;
2411
2412 void PSParallelCompact::adjust_roots() {
2413 // Adjust the pointers to reflect the new locations
2414 TraceTime tm("adjust roots", print_phases(), true, gclog_or_tty);
2415
2416 // Need new claim bits when tracing through and adjusting pointers.
2417 ClassLoaderDataGraph::clear_claimed_marks();
2418
2419 // General strong roots.
2420 Universe::oops_do(adjust_pointer_closure());
2421 JNIHandles::oops_do(adjust_pointer_closure()); // Global (strong) JNI handles
2422 CLDToOopClosure adjust_from_cld(adjust_pointer_closure());
2423 Threads::oops_do(adjust_pointer_closure(), &adjust_from_cld, NULL);
2424 ObjectSynchronizer::oops_do(adjust_pointer_closure());
2425 FlatProfiler::oops_do(adjust_pointer_closure());
2426 Management::oops_do(adjust_pointer_closure());
2427 JvmtiExport::oops_do(adjust_pointer_closure());
|