Mercurial > hg > truffle
diff src/share/vm/memory/sharedHeap.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 | 441e946dc1af |
children | d0aa87f04bd5 |
line wrap: on
line diff
--- a/src/share/vm/memory/sharedHeap.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/memory/sharedHeap.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,7 +55,7 @@ SharedHeap::SharedHeap(CollectorPolicy* policy_) : CollectedHeap(), _collector_policy(policy_), - _perm_gen(NULL), _rem_set(NULL), + _rem_set(NULL), _strong_roots_parity(0), _process_strong_tasks(new SubTasksDone(SH_PS_NumElements)), _workers(NULL) @@ -100,15 +100,6 @@ _process_strong_tasks->set_n_threads(t); } -class AssertIsPermClosure: public OopClosure { -public: - virtual void do_oop(oop* p) { - assert((*p) == NULL || (*p)->is_perm(), "Referent should be perm."); - } - virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } -}; -static AssertIsPermClosure assert_is_perm_closure; - #ifdef ASSERT class AssertNonScavengableClosure: public OopClosure { public: @@ -143,12 +134,13 @@ } void SharedHeap::process_strong_roots(bool activate_scope, - bool collecting_perm_gen, + bool is_scavenging, ScanningOption so, OopClosure* roots, CodeBlobClosure* code_roots, - OopsInGenClosure* perm_blk) { + KlassClosure* klass_closure) { StrongRootsScope srs(this, activate_scope); + // General strong roots. assert(_strong_roots_parity != 0, "must have called prologue code"); // _n_termination for _process_strong_tasks should be set up stream @@ -157,8 +149,6 @@ // is executing in another GC worker. if (!_process_strong_tasks->is_task_claimed(SH_PS_Universe_oops_do)) { Universe::oops_do(roots); - // Consider perm-gen discovered lists to be strong. - perm_gen()->ref_processor()->weak_oops_do(roots); } // Global (strong) JNI handles if (!_process_strong_tasks->is_task_claimed(SH_PS_JNIHandles_oops_do)) @@ -181,41 +171,33 @@ if (!_process_strong_tasks->is_task_claimed(SH_PS_SystemDictionary_oops_do)) { if (so & SO_AllClasses) { SystemDictionary::oops_do(roots); + ClassLoaderDataGraph::oops_do(roots, klass_closure, !is_scavenging); } else if (so & SO_SystemClasses) { SystemDictionary::always_strong_oops_do(roots); + ClassLoaderDataGraph::always_strong_oops_do(roots, klass_closure, !is_scavenging); + } else { + ShouldNotReachHere2("We should always have selected either SO_AllClasses or SO_SystemClasses"); } } if (!_process_strong_tasks->is_task_claimed(SH_PS_StringTable_oops_do)) { - if (so & SO_Strings || (!collecting_perm_gen && !JavaObjectsInPerm)) { + if (so & SO_Strings) { StringTable::oops_do(roots); } - if (JavaObjectsInPerm) { - // Verify the string table contents are in the perm gen - NOT_PRODUCT(StringTable::oops_do(&assert_is_perm_closure)); - } } if (!_process_strong_tasks->is_task_claimed(SH_PS_CodeCache_oops_do)) { if (so & SO_CodeCache) { - // (Currently, CMSCollector uses this to do intermediate-strength collections.) - assert(collecting_perm_gen, "scanning all of code cache"); assert(code_roots != NULL, "must supply closure for code cache"); - if (code_roots != NULL) { + + if (is_scavenging) { + // We only visit parts of the CodeCache when scavenging. + CodeCache::scavenge_root_nmethods_do(code_roots); + } else { + // CMSCollector uses this to do intermediate-strength collections. + // We scan the entire code cache, since CodeCache::do_unloading is not called. CodeCache::blobs_do(code_roots); } - } else if (so & (SO_SystemClasses|SO_AllClasses)) { - if (!collecting_perm_gen) { - // If we are collecting from class statics, but we are not going to - // visit all of the CodeCache, collect from the non-perm roots if any. - // This makes the code cache function temporarily as a source of strong - // roots for oops, until the next major collection. - // - // If collecting_perm_gen is true, we require that this phase will call - // CodeCache::do_unloading. This will kill off nmethods with expired - // weak references, such as stale invokedynamic targets. - CodeCache::scavenge_root_nmethods_do(code_roots); - } } // Verify that the code cache contents are not subject to // movement by a scavenging collection. @@ -223,11 +205,6 @@ DEBUG_ONLY(CodeCache::asserted_non_scavengable_nmethods_do(&assert_code_is_non_scavengable)); } - if (!collecting_perm_gen) { - // All threads perform this; coordination is handled internally. - - rem_set()->younger_refs_iterate(perm_gen(), perm_blk); - } _process_strong_tasks->all_tasks_completed(); } @@ -238,33 +215,6 @@ }; static AlwaysTrueClosure always_true; -class SkipAdjustingSharedStrings: public OopClosure { - OopClosure* _clo; -public: - SkipAdjustingSharedStrings(OopClosure* clo) : _clo(clo) {} - - virtual void do_oop(oop* p) { - oop o = (*p); - if (!o->is_shared_readwrite()) { - _clo->do_oop(p); - } - } - virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); } -}; - -// Unmarked shared Strings in the StringTable (which got there due to -// being in the constant pools of as-yet unloaded shared classes) were -// not marked and therefore did not have their mark words preserved. -// These entries are also deliberately not purged from the string -// table during unloading of unmarked strings. If an identity hash -// code was computed for any of these objects, it will not have been -// cleared to zero during the forwarding process or by the -// RecursiveAdjustSharedObjectClosure, and will be confused by the -// adjusting process as a forwarding pointer. We need to skip -// forwarding StringTable entries which contain unmarked shared -// Strings. Actually, since shared strings won't be moving, we can -// just skip adjusting any shared entries in the string table. - void SharedHeap::process_weak_roots(OopClosure* root_closure, CodeBlobClosure* code_roots, OopClosure* non_root_closure) { @@ -272,13 +222,8 @@ JNIHandles::weak_oops_do(&always_true, root_closure); CodeCache::blobs_do(code_roots); - if (UseSharedSpaces && !DumpSharedSpaces) { - SkipAdjustingSharedStrings skip_closure(root_closure); - StringTable::oops_do(&skip_closure); - } else { StringTable::oops_do(root_closure); } -} void SharedHeap::set_barrier_set(BarrierSet* bs) { _barrier_set = bs; @@ -290,9 +235,7 @@ ref_processing_init(); } -void SharedHeap::ref_processing_init() { - perm_gen()->ref_processor_init(); -} +void SharedHeap::ref_processing_init() {} // Some utilities. void SharedHeap::print_size_transition(outputStream* out,