Mercurial > hg > truffle
diff src/share/vm/gc_implementation/g1/g1MarkSweep.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 | a2f7274eb6ef |
children | 8966c2d65d96 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -68,15 +68,11 @@ GenMarkSweep::_ref_processor = rp; rp->setup_policy(clear_all_softrefs); - // 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. - sh->perm_gen()->stat_record()->invocations++; - bool marked_for_unloading = false; allocate_stacks(); @@ -100,10 +96,6 @@ BiasedLocking::restore_marks(); GenMarkSweep::deallocate_stacks(); - // We must invalidate the perm-gen rs, so that it gets rebuilt. - GenRemSet* rs = sh->rem_set(); - rs->invalidate(sh->perm_gen()->used_region(), true /*whole_heap*/); - // "free at last gc" is calculated from these. // CHF: cheating for now!!! // Universe::set_heap_capacity_at_last_gc(Universe::heap()->capacity()); @@ -132,12 +124,15 @@ SharedHeap* sh = SharedHeap::heap(); - sh->process_strong_roots(true, // activeate StrongRootsScope - true, // Collecting permanent generation. + // Need cleared claim bits for the strong roots processing + ClassLoaderDataGraph::clear_claimed_marks(); + + sh->process_strong_roots(true, // activate StrongRootsScope + false, // not scavenging. SharedHeap::SO_SystemClasses, &GenMarkSweep::follow_root_closure, &GenMarkSweep::follow_code_root_closure, - &GenMarkSweep::follow_root_closure); + &GenMarkSweep::follow_klass_closure); // Process reference objects found during marking ReferenceProcessor* rp = GenMarkSweep::ref_processor(); @@ -162,14 +157,10 @@ GenMarkSweep::follow_stack(); // Update subklass/sibling/implementor links of live klasses - GenMarkSweep::follow_weak_klass_links(); + Klass::clean_weak_klass_links(&GenMarkSweep::is_alive); assert(GenMarkSweep::_marking_stack.is_empty(), "stack should be empty by now"); - // Visit memoized MDO's and clear any unmarked weak refs - GenMarkSweep::follow_mdo_weak_refs(); - assert(GenMarkSweep::_marking_stack.is_empty(), "just drained"); - // Visit interned string tables and delete unmarked oops StringTable::unlink(&GenMarkSweep::is_alive); // Clean up unreferenced symbols in symbol table. @@ -265,19 +256,11 @@ void G1MarkSweep::mark_sweep_phase2() { // Now all live objects are marked, compute the new object addresses. - // 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 - // 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! - // // 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. G1CollectedHeap* g1h = G1CollectedHeap::heap(); - Generation* pg = g1h->perm_gen(); TraceTime tm("phase 2", G1Log::fine() && Verbose, true, gclog_or_tty); GenMarkSweep::trace("2"); @@ -292,9 +275,6 @@ G1PrepareCompactClosure blk(sp); g1h->heap_region_iterate(&blk); blk.update_sets(); - - CompactPoint perm_cp(pg, NULL, NULL); - pg->prepare_for_compaction(&perm_cp); } class G1AdjustPointersClosure: public HeapRegionClosure { @@ -319,7 +299,6 @@ void G1MarkSweep::mark_sweep_phase3() { G1CollectedHeap* g1h = G1CollectedHeap::heap(); - Generation* pg = g1h->perm_gen(); // Adjust the pointers to reflect the new locations TraceTime tm("phase 3", G1Log::fine() && Verbose, true, gclog_or_tty); @@ -327,12 +306,15 @@ SharedHeap* sh = SharedHeap::heap(); + // Need cleared claim bits for the strong roots processing + ClassLoaderDataGraph::clear_claimed_marks(); + sh->process_strong_roots(true, // activate StrongRootsScope - true, // Collecting permanent generation. + false, // not scavenging. SharedHeap::SO_AllClasses, &GenMarkSweep::adjust_root_pointer_closure, NULL, // do not touch code cache here - &GenMarkSweep::adjust_pointer_closure); + &GenMarkSweep::adjust_klass_closure); assert(GenMarkSweep::ref_processor() == g1h->ref_processor_stw(), "Sanity"); g1h->ref_processor_stw()->weak_oops_do(&GenMarkSweep::adjust_root_pointer_closure); @@ -346,7 +328,6 @@ G1AdjustPointersClosure blk; g1h->heap_region_iterate(&blk); - pg->adjust_pointers(); } class G1SpaceCompactClosure: public HeapRegionClosure { @@ -374,23 +355,15 @@ void G1MarkSweep::mark_sweep_phase4() { // All pointers are now adjusted, move objects accordingly - // 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 - // location before any instance does a dispatch through it's klass! - // The ValidateMarkSweep live oops tracking expects us to traverse spaces // in the same order in phase2, phase3 and phase4. We don't quite do that - // here (perm_gen first rather than last), so we tell the validate code + // here (code and comment not fixed for perm removal), so we tell the validate code // to use a higher index (saved from phase2) when verifying perm_gen. G1CollectedHeap* g1h = G1CollectedHeap::heap(); - Generation* pg = g1h->perm_gen(); TraceTime tm("phase 4", G1Log::fine() && Verbose, true, gclog_or_tty); GenMarkSweep::trace("4"); - pg->compact(); - G1SpaceCompactClosure blk; g1h->heap_region_iterate(&blk);