diff src/share/vm/memory/genMarkSweep.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents d2a62e0f25eb
children 8966c2d65d96
line wrap: on
line diff
--- a/src/share/vm/memory/genMarkSweep.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/src/share/vm/memory/genMarkSweep.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -78,14 +78,13 @@
 
   TraceTime t1(GCCauseString("Full GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, gclog_or_tty);
 
-  // When collecting the permanent generation methodOops may be moving,
+  // When collecting the permanent generation Method*s may be moving,
   // so we either have to flush all bcp data or convert it into bci.
   CodeCache::gc_prologue();
   Threads::gc_prologue();
 
-  // Increment the invocation count for the permanent generation, since it is
-  // implicitly collected whenever we do a full mark sweep collection.
-  gch->perm_gen()->stat_record()->invocations++;
+  // Increment the invocation count
+  _total_invocations++;
 
   // Capture heap size before collection for printing.
   size_t gch_prev_used = gch->used();
@@ -98,7 +97,7 @@
   // Capture used regions for each generation that will be
   // subject to collection, so that card table adjustments can
   // be made intelligently (see clear / invalidate further below).
-  gch->save_used_regions(level, true /* perm */);
+  gch->save_used_regions(level);
 
   allocate_stacks();
 
@@ -149,14 +148,13 @@
   if (all_empty) {
     // We've evacuated all generations below us.
     Generation* g = gch->get_gen(level);
-    rs->clear_into_younger(g, true /* perm */);
+    rs->clear_into_younger(g);
   } else {
     // Invalidate the cards corresponding to the currently used
     // region and clear those corresponding to the evacuated region
     // of all generations just collected (i.e. level and younger).
     rs->invalidate_or_clear(gch->get_gen(level),
-                            true /* younger */,
-                            true /* perm */);
+                            true /* younger */);
   }
 
   Threads::gc_epilogue();
@@ -238,8 +236,6 @@
   _preserved_oop_stack.clear(true);
   _marking_stack.clear();
   _objarray_stack.clear(true);
-  _revisit_klass_stack.clear(true);
-  _revisit_mdo_stack.clear(true);
 
 #ifdef VALIDATE_MARK_SWEEP
   if (ValidateMarkSweep) {
@@ -261,7 +257,7 @@
   TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty);
   trace(" 1");
 
-  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
+  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
 
   GenCollectedHeap* gch = GenCollectedHeap::heap();
 
@@ -271,14 +267,18 @@
   // are run.
   follow_root_closure.set_orig_generation(gch->get_gen(level));
 
+  // Need new claim bits before marking starts.
+  ClassLoaderDataGraph::clear_claimed_marks();
+
   gch->gen_process_strong_roots(level,
                                 false, // Younger gens are not roots.
                                 true,  // activate StrongRootsScope
-                                true,  // Collecting permanent generation.
+                                false, // not scavenging
                                 SharedHeap::SO_SystemClasses,
                                 &follow_root_closure,
                                 true,   // walk code active on stacks
-                                &follow_root_closure);
+                                &follow_root_closure,
+                                &follow_klass_closure);
 
   // Process reference objects found during marking
   {
@@ -295,11 +295,7 @@
   follow_stack(); // Flush marking stack
 
   // Update subklass/sibling/implementor links of live klasses
-  follow_weak_klass_links();
-  assert(_marking_stack.is_empty(), "just drained");
-
-  // Visit memoized MDO's and clear any unmarked weak refs
-  follow_mdo_weak_refs();
+  Klass::clean_weak_klass_links(&is_alive);
   assert(_marking_stack.is_empty(), "just drained");
 
   // Visit interned string tables and delete unmarked oops
@@ -316,28 +312,23 @@
 
   // It is imperative that we traverse perm_gen LAST. If dead space is
   // allowed a range of dead object may get overwritten by a dead int
-  // array. If perm_gen is not traversed last a klassOop may get
+  // array. If perm_gen is not traversed last a Klass* may get
   // overwritten. This is fine since it is dead, but if the class has dead
   // instances we have to skip them, and in order to find their size we
-  // need the klassOop!
+  // need the Klass*!
   //
   // It is not required that we traverse spaces in the same order in
   // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
   // tracking expects us to do so. See comment under phase4.
 
   GenCollectedHeap* gch = GenCollectedHeap::heap();
-  Generation* pg = gch->perm_gen();
 
   TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty);
   trace("2");
 
-  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
+  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
 
   gch->prepare_for_compaction();
-
-  VALIDATE_MARK_SWEEP_ONLY(_live_oops_index_at_perm = _live_oops_index);
-  CompactPoint perm_cp(pg, NULL, NULL);
-  pg->prepare_for_compaction(&perm_cp);
 }
 
 class GenAdjustPointersClosure: public GenCollectedHeap::GenClosure {
@@ -349,16 +340,15 @@
 
 void GenMarkSweep::mark_sweep_phase3(int level) {
   GenCollectedHeap* gch = GenCollectedHeap::heap();
-  Generation* pg = gch->perm_gen();
 
   // Adjust the pointers to reflect the new locations
   TraceTime tm("phase 3", PrintGC && Verbose, true, gclog_or_tty);
   trace("3");
 
-  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
+  // Need new claim bits for the pointer adjustment tracing.
+  ClassLoaderDataGraph::clear_claimed_marks();
 
-  // Needs to be done before the system dictionary is adjusted.
-  pg->pre_adjust_pointers();
+  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
 
   // Because the two closures below are created statically, cannot
   // use OopsInGenClosure constructor which takes a generation,
@@ -370,11 +360,12 @@
   gch->gen_process_strong_roots(level,
                                 false, // Younger gens are not roots.
                                 true,  // activate StrongRootsScope
-                                true,  // Collecting permanent generation.
+                                false, // not scavenging
                                 SharedHeap::SO_AllClasses,
                                 &adjust_root_pointer_closure,
                                 false, // do not walk code
-                                &adjust_root_pointer_closure);
+                                &adjust_root_pointer_closure,
+                                &adjust_klass_closure);
 
   // Now adjust pointers in remaining weak roots.  (All of which should
   // have been cleared if they pointed to non-surviving objects.)
@@ -387,7 +378,6 @@
   adjust_marks();
   GenAdjustPointersClosure blk;
   gch->generation_iterate(&blk, true);
-  pg->adjust_pointers();
 }
 
 class GenCompactClosure: public GenCollectedHeap::GenClosure {
@@ -402,7 +392,7 @@
 
   // It is imperative that we traverse perm_gen first in phase4. All
   // classes must be allocated earlier than their instances, and traversing
-  // perm_gen first makes sure that all klassOops have moved to their new
+  // perm_gen first makes sure that all Klass*s have moved to their new
   // location before any instance does a dispatch through it's klass!
 
   // The ValidateMarkSweep live oops tracking expects us to traverse spaces
@@ -410,21 +400,14 @@
   // here (perm_gen first rather than last), so we tell the validate code
   // to use a higher index (saved from phase2) when verifying perm_gen.
   GenCollectedHeap* gch = GenCollectedHeap::heap();
-  Generation* pg = gch->perm_gen();
 
   TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty);
   trace("4");
 
-  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(true));
-
-  pg->compact();
-
-  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking(false));
+  VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
 
   GenCompactClosure blk;
   gch->generation_iterate(&blk, true);
 
   VALIDATE_MARK_SWEEP_ONLY(compaction_complete());
-
-  pg->post_compact(); // Shared spaces verification.
 }