565 566 void ParNewGenTask::work(uint worker_id) { 567 GenCollectedHeap* gch = GenCollectedHeap::heap(); 568 // Since this is being done in a separate thread, need new resource 569 // and handle marks. 570 ResourceMark rm; 571 HandleMark hm; 572 573 ParScanThreadState& par_scan_state = _state_set->thread_state(worker_id); 574 assert(_state_set->is_valid(worker_id), "Should not have been called"); 575 576 par_scan_state.set_young_old_boundary(_young_old_boundary); 577 578 KlassScanClosure klass_scan_closure(&par_scan_state.to_space_root_closure(), 579 gch->rem_set()->klass_rem_set()); 580 CLDToKlassAndOopClosure cld_scan_closure(&klass_scan_closure, 581 &par_scan_state.to_space_root_closure(), 582 false); 583 584 par_scan_state.start_strong_roots(); 585 gch->gen_process_roots(_strong_roots_scope, 586 GenCollectedHeap::YoungGen, 587 true, // Process younger gens, if any, as strong roots. 588 GenCollectedHeap::SO_ScavengeCodeCache, 589 GenCollectedHeap::StrongAndWeakRoots, 590 &par_scan_state.to_space_root_closure(), 591 &par_scan_state.older_gen_closure(), 592 &cld_scan_closure); 593 594 par_scan_state.end_strong_roots(); 595 596 // "evacuate followers". 597 par_scan_state.evacuate_followers_closure().do_void(); 598 } 599 600 #ifdef _MSC_VER 601 #pragma warning( push ) 602 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list 603 #endif 604 ParNewGeneration::ParNewGeneration(ReservedSpace rs, size_t initial_byte_size) 605 : DefNewGeneration(rs, initial_byte_size, "PCopy"), 606 _overflow_list(NULL), 607 _is_alive_closure(this), 608 _plab_stats(YoungPLABSize, PLABWeight) 609 { 610 NOT_PRODUCT(_overflow_counter = ParGCWorkQueueOverflowInterval;) 611 NOT_PRODUCT(_num_par_pushes = 0;) 612 _task_queues = new ObjToScanQueueSet(ParallelGCThreads); | 565 566 void ParNewGenTask::work(uint worker_id) { 567 GenCollectedHeap* gch = GenCollectedHeap::heap(); 568 // Since this is being done in a separate thread, need new resource 569 // and handle marks. 570 ResourceMark rm; 571 HandleMark hm; 572 573 ParScanThreadState& par_scan_state = _state_set->thread_state(worker_id); 574 assert(_state_set->is_valid(worker_id), "Should not have been called"); 575 576 par_scan_state.set_young_old_boundary(_young_old_boundary); 577 578 KlassScanClosure klass_scan_closure(&par_scan_state.to_space_root_closure(), 579 gch->rem_set()->klass_rem_set()); 580 CLDToKlassAndOopClosure cld_scan_closure(&klass_scan_closure, 581 &par_scan_state.to_space_root_closure(), 582 false); 583 584 par_scan_state.start_strong_roots(); 585 gch->young_process_roots(_strong_roots_scope, 586 &par_scan_state.to_space_root_closure(), 587 &par_scan_state.older_gen_closure(), 588 &cld_scan_closure); 589 590 par_scan_state.end_strong_roots(); 591 592 // "evacuate followers". 593 par_scan_state.evacuate_followers_closure().do_void(); 594 } 595 596 #ifdef _MSC_VER 597 #pragma warning( push ) 598 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list 599 #endif 600 ParNewGeneration::ParNewGeneration(ReservedSpace rs, size_t initial_byte_size) 601 : DefNewGeneration(rs, initial_byte_size, "PCopy"), 602 _overflow_list(NULL), 603 _is_alive_closure(this), 604 _plab_stats(YoungPLABSize, PLABWeight) 605 { 606 NOT_PRODUCT(_overflow_counter = ParGCWorkQueueOverflowInterval;) 607 NOT_PRODUCT(_num_par_pushes = 0;) 608 _task_queues = new ObjToScanQueueSet(ParallelGCThreads); |