hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp
changeset 13728 882756847a04
parent 13466 9fdf353d5f4c
child 13926 289339903fcf
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -478,7 +478,7 @@
 
 ParScanClosure::ParScanClosure(ParNewGeneration* g,
                                ParScanThreadState* par_scan_state) :
-  OopsInGenClosure(g), _par_scan_state(par_scan_state), _g(g)
+  OopsInKlassOrGenClosure(g), _par_scan_state(par_scan_state), _g(g)
 {
   assert(_g->level() == 0, "Optimized for youngest generation");
   _boundary = _g->reserved().end();
@@ -607,16 +607,22 @@
 
   par_scan_state.set_young_old_boundary(_young_old_boundary);
 
+  KlassScanClosure klass_scan_closure(&par_scan_state.to_space_root_closure(),
+                                      gch->rem_set()->klass_rem_set());
+
+  int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
+
   par_scan_state.start_strong_roots();
   gch->gen_process_strong_roots(_gen->level(),
                                 true,  // Process younger gens, if any,
                                        // as strong roots.
                                 false, // no scope; this is parallel code
-                                false, // not collecting perm generation.
-                                SharedHeap::SO_AllClasses,
+                                true,  // is scavenging
+                                SharedHeap::ScanningOption(so),
                                 &par_scan_state.to_space_root_closure(),
                                 true,   // walk *all* scavengable nmethods
-                                &par_scan_state.older_gen_closure());
+                                &par_scan_state.older_gen_closure(),
+                                &klass_scan_closure);
   par_scan_state.end_strong_roots();
 
   // "evacuate followers".
@@ -1191,6 +1197,16 @@
   }
   assert(new_obj != NULL, "just checking");
 
+#ifndef PRODUCT
+  // This code must come after the CAS test, or it will print incorrect
+  // information.
+  if (TraceScavenge) {
+    gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
+       is_in_reserved(new_obj) ? "copying" : "tenuring",
+       new_obj->klass()->internal_name(), old, new_obj, new_obj->size());
+  }
+#endif
+
   if (forward_ptr == NULL) {
     oop obj_to_push = new_obj;
     if (par_scan_state->should_be_partially_scanned(obj_to_push, old)) {
@@ -1303,6 +1319,16 @@
   }
   assert(new_obj != NULL, "just checking");
 
+#ifndef PRODUCT
+  // This code must come after the CAS test, or it will print incorrect
+  // information.
+  if (TraceScavenge) {
+    gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
+       is_in_reserved(new_obj) ? "copying" : "tenuring",
+       new_obj->klass()->internal_name(), old, new_obj, new_obj->size());
+  }
+#endif
+
   // Now attempt to install the forwarding pointer (atomically).
   // We have to copy the mark word before overwriting with forwarding
   // ptr, so we can restore it below in the copy.
@@ -1494,7 +1520,7 @@
   size_t i = 1;
   oop cur = prefix;
   while (i < objsFromOverflow && cur->klass_or_null() != NULL) {
-    i++; cur = oop(cur->klass());
+    i++; cur = cur->list_ptr_from_klass();
   }
 
   // Reattach remaining (suffix) to overflow list
@@ -1505,8 +1531,8 @@
       (void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY);
     }
   } else {
-    assert(cur->klass_or_null() != BUSY, "Error");
-    oop suffix = oop(cur->klass());       // suffix will be put back on global list
+    assert(cur->klass_or_null() != (Klass*)(address)BUSY, "Error");
+    oop suffix = cur->list_ptr_from_klass();       // suffix will be put back on global list
     cur->set_klass_to_list_ptr(NULL);     // break off suffix
     // It's possible that the list is still in the empty(busy) state
     // we left it in a short while ago; in that case we may be
@@ -1527,7 +1553,7 @@
       // Find the last item of suffix list
       oop last = suffix;
       while (last->klass_or_null() != NULL) {
-        last = oop(last->klass());
+        last = last->list_ptr_from_klass();
       }
       // Atomically prepend suffix to current overflow list
       observed_overflow_list = _overflow_list;
@@ -1551,7 +1577,7 @@
   ssize_t n = 0;
   while (cur != NULL) {
     oop obj_to_push = cur->forwardee();
-    oop next        = oop(cur->klass_or_null());
+    oop next        = cur->list_ptr_from_klass();
     cur->set_klass(obj_to_push->klass());
     // This may be an array object that is self-forwarded. In that case, the list pointer
     // space, cur, is not in the Java heap, but rather in the C-heap and should be freed.