src/hotspot/share/gc/parallel/psPromotionManager.cpp
changeset 50752 9d62da00bf15
parent 50277 f84ae8aa5d88
child 51256 604581924221
equal deleted inserted replaced
50751:d9132bdf6c30 50752:9d62da00bf15
    21  * questions.
    21  * questions.
    22  *
    22  *
    23  */
    23  */
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
       
    26 #include "classfile/javaClasses.inline.hpp"
    26 #include "gc/parallel/gcTaskManager.hpp"
    27 #include "gc/parallel/gcTaskManager.hpp"
    27 #include "gc/parallel/mutableSpace.hpp"
    28 #include "gc/parallel/mutableSpace.hpp"
    28 #include "gc/parallel/parallelScavengeHeap.hpp"
    29 #include "gc/parallel/parallelScavengeHeap.hpp"
    29 #include "gc/parallel/psOldGen.hpp"
    30 #include "gc/parallel/psOldGen.hpp"
    30 #include "gc/parallel/psPromotionManager.inline.hpp"
    31 #include "gc/parallel/psPromotionManager.inline.hpp"
    33 #include "gc/shared/preservedMarks.inline.hpp"
    34 #include "gc/shared/preservedMarks.inline.hpp"
    34 #include "gc/shared/taskqueue.inline.hpp"
    35 #include "gc/shared/taskqueue.inline.hpp"
    35 #include "logging/log.hpp"
    36 #include "logging/log.hpp"
    36 #include "logging/logStream.hpp"
    37 #include "logging/logStream.hpp"
    37 #include "memory/allocation.inline.hpp"
    38 #include "memory/allocation.inline.hpp"
       
    39 #include "memory/iterator.inline.hpp"
    38 #include "memory/memRegion.hpp"
    40 #include "memory/memRegion.hpp"
    39 #include "memory/padded.inline.hpp"
    41 #include "memory/padded.inline.hpp"
    40 #include "memory/resourceArea.hpp"
    42 #include "memory/resourceArea.hpp"
    41 #include "oops/access.inline.hpp"
    43 #include "oops/access.inline.hpp"
    42 #include "oops/arrayOop.inline.hpp"
    44 #include "oops/arrayOop.inline.hpp"
    43 #include "oops/compressedOops.inline.hpp"
    45 #include "oops/compressedOops.inline.hpp"
       
    46 #include "oops/instanceClassLoaderKlass.inline.hpp"
    44 #include "oops/instanceKlass.inline.hpp"
    47 #include "oops/instanceKlass.inline.hpp"
    45 #include "oops/instanceMirrorKlass.inline.hpp"
    48 #include "oops/instanceMirrorKlass.inline.hpp"
    46 #include "oops/objArrayKlass.inline.hpp"
    49 #include "oops/objArrayKlass.inline.hpp"
    47 #include "oops/objArrayOop.inline.hpp"
    50 #include "oops/objArrayOop.inline.hpp"
    48 #include "oops/oop.inline.hpp"
    51 #include "oops/oop.inline.hpp"
   392   } else {
   395   } else {
   393     process_array_chunk_work<oop>(obj, start, end);
   396     process_array_chunk_work<oop>(obj, start, end);
   394   }
   397   }
   395 }
   398 }
   396 
   399 
   397 class PushContentsClosure : public ExtendedOopClosure {
   400 class PushContentsClosure : public BasicOopIterateClosure {
   398   PSPromotionManager* _pm;
   401   PSPromotionManager* _pm;
   399  public:
   402  public:
   400   PushContentsClosure(PSPromotionManager* pm) : _pm(pm) {}
   403   PushContentsClosure(PSPromotionManager* pm) : _pm(pm) {}
   401 
   404 
   402   template <typename T> void do_oop_nv(T* p) {
   405   template <typename T> void do_oop_work(T* p) {
   403     if (PSScavenge::should_scavenge(p)) {
   406     if (PSScavenge::should_scavenge(p)) {
   404       _pm->claim_or_forward_depth(p);
   407       _pm->claim_or_forward_depth(p);
   405     }
   408     }
   406   }
   409   }
   407 
   410 
   408   virtual void do_oop(oop* p)       { do_oop_nv(p); }
   411   virtual void do_oop(oop* p)       { do_oop_work(p); }
   409   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
   412   virtual void do_oop(narrowOop* p) { do_oop_work(p); }
   410 
   413 
   411   // Don't use the oop verification code in the oop_oop_iterate framework.
   414   // Don't use the oop verification code in the oop_oop_iterate framework.
   412   debug_only(virtual bool should_verify_oops() { return false; })
   415   debug_only(virtual bool should_verify_oops() { return false; })
   413 };
   416 };
   414 
   417 
   415 void InstanceKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   418 void InstanceKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   416   PushContentsClosure cl(pm);
   419   PushContentsClosure cl(pm);
   417   oop_oop_iterate_oop_maps_reverse<true>(obj, &cl);
   420   if (UseCompressedOops) {
       
   421     oop_oop_iterate_oop_maps_reverse<narrowOop>(obj, &cl);
       
   422   } else {
       
   423     oop_oop_iterate_oop_maps_reverse<oop>(obj, &cl);
       
   424   }
   418 }
   425 }
   419 
   426 
   420 void InstanceMirrorKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   427 void InstanceMirrorKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   421     // Note that we don't have to follow the mirror -> klass pointer, since all
   428     // Note that we don't have to follow the mirror -> klass pointer, since all
   422     // klasses that are dirty will be scavenged when we iterate over the
   429     // klasses that are dirty will be scavenged when we iterate over the
   423     // ClassLoaderData objects.
   430     // ClassLoaderData objects.
   424 
   431 
   425   InstanceKlass::oop_ps_push_contents(obj, pm);
   432   InstanceKlass::oop_ps_push_contents(obj, pm);
   426 
   433 
   427   PushContentsClosure cl(pm);
   434   PushContentsClosure cl(pm);
   428   oop_oop_iterate_statics<true>(obj, &cl);
   435   if (UseCompressedOops) {
       
   436     oop_oop_iterate_statics<narrowOop>(obj, &cl);
       
   437   } else {
       
   438     oop_oop_iterate_statics<oop>(obj, &cl);
       
   439   }
   429 }
   440 }
   430 
   441 
   431 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   442 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   432   InstanceKlass::oop_ps_push_contents(obj, pm);
   443   InstanceKlass::oop_ps_push_contents(obj, pm);
   433 
   444 
   467 }
   478 }
   468 
   479 
   469 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   480 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   470   assert(obj->is_objArray(), "obj must be obj array");
   481   assert(obj->is_objArray(), "obj must be obj array");
   471   PushContentsClosure cl(pm);
   482   PushContentsClosure cl(pm);
   472   oop_oop_iterate_elements<true>(objArrayOop(obj), &cl);
   483   if (UseCompressedOops) {
       
   484     oop_oop_iterate_elements<narrowOop>(objArrayOop(obj), &cl);
       
   485   } else {
       
   486     oop_oop_iterate_elements<oop>(objArrayOop(obj), &cl);
       
   487   }
   473 }
   488 }
   474 
   489 
   475 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   490 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
   476   assert(obj->is_typeArray(),"must be a type array");
   491   assert(obj->is_typeArray(),"must be a type array");
   477   ShouldNotReachHere();
   492   ShouldNotReachHere();