< prev index next >

src/hotspot/share/gc/parallel/psCompactionManager.cpp

Print this page




  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "gc/parallel/gcTaskManager.hpp"
  28 #include "gc/parallel/objectStartArray.hpp"
  29 #include "gc/parallel/parMarkBitMap.inline.hpp"
  30 #include "gc/parallel/parallelScavengeHeap.hpp"
  31 #include "gc/parallel/psCompactionManager.inline.hpp"
  32 #include "gc/parallel/psOldGen.hpp"
  33 #include "gc/parallel/psParallelCompact.inline.hpp"
  34 #include "gc/shared/taskqueue.inline.hpp"
  35 #include "logging/log.hpp"
  36 #include "memory/iterator.inline.hpp"


  37 #include "oops/instanceKlass.inline.hpp"
  38 #include "oops/instanceMirrorKlass.inline.hpp"
  39 #include "oops/objArrayKlass.inline.hpp"
  40 #include "oops/oop.inline.hpp"
  41 #include "runtime/atomic.hpp"
  42 
  43 PSOldGen*            ParCompactionManager::_old_gen = NULL;
  44 ParCompactionManager**  ParCompactionManager::_manager_array = NULL;
  45 
  46 OopTaskQueueSet*     ParCompactionManager::_stack_array = NULL;
  47 ParCompactionManager::ObjArrayTaskQueueSet*
  48   ParCompactionManager::_objarray_queues = NULL;
  49 ObjectStartArray*    ParCompactionManager::_start_array = NULL;
  50 ParMarkBitMap*       ParCompactionManager::_mark_bitmap = NULL;
  51 RegionTaskQueueSet*  ParCompactionManager::_region_array = NULL;
  52 
  53 ParCompactionManager::ParCompactionManager() :
  54     _action(CopyAndUpdate) {
  55 
  56   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();


 165     // roots in Universe::oops_do.
 166     assert(java_lang_Class::is_primitive(obj), "Sanity check");
 167   }
 168 
 169   ParCompactionManager::MarkAndPushClosure cl(cm);
 170   oop_oop_iterate_statics<true>(obj, &cl);
 171 }
 172 
 173 void InstanceClassLoaderKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 174   InstanceKlass::oop_pc_follow_contents(obj, cm);
 175 
 176   ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj);
 177   if (loader_data != NULL) {
 178     cm->follow_class_loader(loader_data);
 179   }
 180 }
 181 
 182 template <class T>
 183 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) {
 184   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 185   T heap_oop = oopDesc::load_heap_oop(referent_addr);
 186   log_develop_trace(gc, ref)("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj));
 187   if (!oopDesc::is_null(heap_oop)) {
 188     oop referent = oopDesc::decode_heap_oop_not_null(heap_oop);
 189     if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) &&
 190         PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) {
 191       // reference already enqueued, referent will be traversed later
 192       klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 193       log_develop_trace(gc, ref)("       Non NULL enqueued " PTR_FORMAT, p2i(obj));
 194       return;
 195     } else {
 196       // treat referent as normal oop
 197       log_develop_trace(gc, ref)("       Non NULL normal " PTR_FORMAT, p2i(obj));
 198       cm->mark_and_push(referent_addr);
 199     }
 200   }
 201   T* next_addr = (T*)java_lang_ref_Reference::next_addr_raw(obj);
 202   // Treat discovered as normal oop, if ref is not "active",
 203   // i.e. if next is non-NULL.
 204   T  next_oop = oopDesc::load_heap_oop(next_addr);
 205   if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active"
 206     T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj);
 207     log_develop_trace(gc, ref)("   Process discovered as normal " PTR_FORMAT, p2i(discovered_addr));
 208     cm->mark_and_push(discovered_addr);
 209   }
 210   cm->mark_and_push(next_addr);
 211   klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 212 }
 213 
 214 
 215 void InstanceRefKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 216   if (UseCompressedOops) {
 217     oop_pc_follow_contents_specialized<narrowOop>(this, obj, cm);
 218   } else {
 219     oop_pc_follow_contents_specialized<oop>(this, obj, cm);
 220   }
 221 }
 222 
 223 void ObjArrayKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 224   cm->follow_klass(this);
 225 




  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "gc/parallel/gcTaskManager.hpp"
  28 #include "gc/parallel/objectStartArray.hpp"
  29 #include "gc/parallel/parMarkBitMap.inline.hpp"
  30 #include "gc/parallel/parallelScavengeHeap.hpp"
  31 #include "gc/parallel/psCompactionManager.inline.hpp"
  32 #include "gc/parallel/psOldGen.hpp"
  33 #include "gc/parallel/psParallelCompact.inline.hpp"
  34 #include "gc/shared/taskqueue.inline.hpp"
  35 #include "logging/log.hpp"
  36 #include "memory/iterator.inline.hpp"
  37 #include "oops/access.inline.hpp"
  38 #include "oops/compressedOops.inline.hpp"
  39 #include "oops/instanceKlass.inline.hpp"
  40 #include "oops/instanceMirrorKlass.inline.hpp"
  41 #include "oops/objArrayKlass.inline.hpp"
  42 #include "oops/oop.inline.hpp"
  43 #include "runtime/atomic.hpp"
  44 
  45 PSOldGen*            ParCompactionManager::_old_gen = NULL;
  46 ParCompactionManager**  ParCompactionManager::_manager_array = NULL;
  47 
  48 OopTaskQueueSet*     ParCompactionManager::_stack_array = NULL;
  49 ParCompactionManager::ObjArrayTaskQueueSet*
  50   ParCompactionManager::_objarray_queues = NULL;
  51 ObjectStartArray*    ParCompactionManager::_start_array = NULL;
  52 ParMarkBitMap*       ParCompactionManager::_mark_bitmap = NULL;
  53 RegionTaskQueueSet*  ParCompactionManager::_region_array = NULL;
  54 
  55 ParCompactionManager::ParCompactionManager() :
  56     _action(CopyAndUpdate) {
  57 
  58   ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();


 167     // roots in Universe::oops_do.
 168     assert(java_lang_Class::is_primitive(obj), "Sanity check");
 169   }
 170 
 171   ParCompactionManager::MarkAndPushClosure cl(cm);
 172   oop_oop_iterate_statics<true>(obj, &cl);
 173 }
 174 
 175 void InstanceClassLoaderKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 176   InstanceKlass::oop_pc_follow_contents(obj, cm);
 177 
 178   ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj);
 179   if (loader_data != NULL) {
 180     cm->follow_class_loader(loader_data);
 181   }
 182 }
 183 
 184 template <class T>
 185 static void oop_pc_follow_contents_specialized(InstanceRefKlass* klass, oop obj, ParCompactionManager* cm) {
 186   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 187   T heap_oop = RawAccess<>::oop_load(referent_addr);
 188   log_develop_trace(gc, ref)("InstanceRefKlass::oop_pc_follow_contents " PTR_FORMAT, p2i(obj));
 189   if (!CompressedOops::is_null(heap_oop)) {
 190     oop referent = CompressedOops::decode_not_null(heap_oop);
 191     if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) &&
 192         PSParallelCompact::ref_processor()->discover_reference(obj, klass->reference_type())) {
 193       // reference already enqueued, referent will be traversed later
 194       klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 195       log_develop_trace(gc, ref)("       Non NULL enqueued " PTR_FORMAT, p2i(obj));
 196       return;
 197     } else {
 198       // treat referent as normal oop
 199       log_develop_trace(gc, ref)("       Non NULL normal " PTR_FORMAT, p2i(obj));
 200       cm->mark_and_push(referent_addr);
 201     }
 202   }
 203   T* next_addr = (T*)java_lang_ref_Reference::next_addr_raw(obj);
 204   // Treat discovered as normal oop, if ref is not "active",
 205   // i.e. if next is non-NULL.
 206   T  next_oop = RawAccess<>::oop_load(next_addr);
 207   if (!CompressedOops::is_null(next_oop)) { // i.e. ref is not "active"
 208     T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj);
 209     log_develop_trace(gc, ref)("   Process discovered as normal " PTR_FORMAT, p2i(discovered_addr));
 210     cm->mark_and_push(discovered_addr);
 211   }
 212   cm->mark_and_push(next_addr);
 213   klass->InstanceKlass::oop_pc_follow_contents(obj, cm);
 214 }
 215 
 216 
 217 void InstanceRefKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 218   if (UseCompressedOops) {
 219     oop_pc_follow_contents_specialized<narrowOop>(this, obj, cm);
 220   } else {
 221     oop_pc_follow_contents_specialized<oop>(this, obj, cm);
 222   }
 223 }
 224 
 225 void ObjArrayKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) {
 226   cm->follow_klass(this);
 227 


< prev index next >