hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
changeset 6762 f8d1b560700e
parent 5547 f4b087cbb361
child 7397 5b173b4ca846
equal deleted inserted replaced
6761:f9191297ce83 6762:f8d1b560700e
   464 
   464 
   465   // We want to calculate the size in bytes first.
   465   // We want to calculate the size in bytes first.
   466   _preserved_count_max  = pointer_delta(to_space->end(), to_space->top(), sizeof(jbyte));
   466   _preserved_count_max  = pointer_delta(to_space->end(), to_space->top(), sizeof(jbyte));
   467   // Now divide by the size of a PreservedMark
   467   // Now divide by the size of a PreservedMark
   468   _preserved_count_max /= sizeof(PreservedMark);
   468   _preserved_count_max /= sizeof(PreservedMark);
   469 
       
   470   _preserved_mark_stack = NULL;
       
   471   _preserved_oop_stack = NULL;
       
   472 
       
   473   _marking_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(4000, true);
       
   474   _objarray_stack = new (ResourceObj::C_HEAP) GrowableArray<ObjArrayTask>(50, true);
       
   475 
       
   476   int size = SystemDictionary::number_of_classes() * 2;
       
   477   _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
       
   478   // (#klass/k)^2, for k ~ 10 appears a better setting, but this will have to do for
       
   479   // now until we investigate a more optimal setting.
       
   480   _revisit_mdo_stack   = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true);
       
   481 }
   469 }
   482 
   470 
   483 
   471 
   484 void PSMarkSweep::deallocate_stacks() {
   472 void PSMarkSweep::deallocate_stacks() {
   485   if (_preserved_oop_stack) {
   473   _preserved_mark_stack.clear(true);
   486     delete _preserved_mark_stack;
   474   _preserved_oop_stack.clear(true);
   487     _preserved_mark_stack = NULL;
   475   _marking_stack.clear();
   488     delete _preserved_oop_stack;
   476   _objarray_stack.clear(true);
   489     _preserved_oop_stack = NULL;
   477   _revisit_klass_stack.clear(true);
   490   }
   478   _revisit_mdo_stack.clear(true);
   491 
       
   492   delete _marking_stack;
       
   493   delete _objarray_stack;
       
   494   delete _revisit_klass_stack;
       
   495   delete _revisit_mdo_stack;
       
   496 }
   479 }
   497 
   480 
   498 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
   481 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
   499   // Recursively traverse all live objects and mark them
   482   // Recursively traverse all live objects and mark them
   500   EventMark m("1 mark object");
   483   EventMark m("1 mark object");
   540                           purged_class);
   523                           purged_class);
   541   follow_stack(); // Flush marking stack
   524   follow_stack(); // Flush marking stack
   542 
   525 
   543   // Update subklass/sibling/implementor links of live klasses
   526   // Update subklass/sibling/implementor links of live klasses
   544   follow_weak_klass_links();
   527   follow_weak_klass_links();
   545   assert(_marking_stack->is_empty(), "just drained");
   528   assert(_marking_stack.is_empty(), "just drained");
   546 
   529 
   547   // Visit memoized mdo's and clear unmarked weak refs
   530   // Visit memoized mdo's and clear unmarked weak refs
   548   follow_mdo_weak_refs();
   531   follow_mdo_weak_refs();
   549   assert(_marking_stack->is_empty(), "just drained");
   532   assert(_marking_stack.is_empty(), "just drained");
   550 
   533 
   551   // Visit symbol and interned string tables and delete unmarked oops
   534   // Visit symbol and interned string tables and delete unmarked oops
   552   SymbolTable::unlink(is_alive_closure());
   535   SymbolTable::unlink(is_alive_closure());
   553   StringTable::unlink(is_alive_closure());
   536   StringTable::unlink(is_alive_closure());
   554 
   537 
   555   assert(_marking_stack->is_empty(), "stack should be empty by now");
   538   assert(_marking_stack.is_empty(), "stack should be empty by now");
   556 }
   539 }
   557 
   540 
   558 
   541 
   559 void PSMarkSweep::mark_sweep_phase2() {
   542 void PSMarkSweep::mark_sweep_phase2() {
   560   EventMark m("2 compute new addresses");
   543   EventMark m("2 compute new addresses");