Mercurial > hg > truffle
diff src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @ 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 | ab4422d0ed59 |
children | aed758eda82a |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Sat Sep 01 13:25:18 2012 -0400 @@ -38,7 +38,6 @@ class PSAdaptiveSizePolicy; class PSYoungGen; class PSOldGen; -class PSPermGen; class ParCompactionManager; class ParallelTaskTerminator; class PSParallelCompact; @@ -405,9 +404,6 @@ return calc_new_pointer((HeapWord*) p); } - // Return the updated address for the given klass - klassOop calc_new_klass(klassOop); - #ifdef ASSERT void verify_clear(const PSVirtualSpace* vspace); void verify_clear(); @@ -779,7 +775,7 @@ typedef ParallelCompactData::RegionData RegionData; typedef enum { - perm_space_id, old_space_id, eden_space_id, + old_space_id, eden_space_id, from_space_id, to_space_id, last_space_id } SpaceId; @@ -821,7 +817,7 @@ virtual void do_void(); }; - class AdjustPointerClosure: public OopsInGenClosure { + class AdjustPointerClosure: public OopClosure { private: bool _is_root; public: @@ -832,11 +828,18 @@ virtual void do_code_blob(CodeBlob* cb) const { } }; + class AdjustKlassClosure : public KlassClosure { + public: + void do_klass(Klass* klass); + }; + friend class KeepAliveClosure; friend class FollowStackClosure; friend class AdjustPointerClosure; + friend class AdjustKlassClosure; + friend class FollowKlassClosure; friend class FollowRootClosure; - friend class instanceKlassKlass; + friend class instanceClassLoaderKlass; friend class RefProcTaskProxy; private: @@ -852,12 +855,13 @@ static bool _print_phases; static AdjustPointerClosure _adjust_root_pointer_closure; static AdjustPointerClosure _adjust_pointer_closure; + static AdjustKlassClosure _adjust_klass_closure; // Reference processing (used in ...follow_contents) static ReferenceProcessor* _ref_processor; // Updated location of intArrayKlassObj. - static klassOop _updated_int_array_klass_obj; + static Klass* _updated_int_array_klass_obj; // Values computed at initialization and used by dead_wood_limiter(). static double _dwl_mean; @@ -869,10 +873,6 @@ #endif // #ifdef ASSERT private: - // Closure accessors - static OopClosure* adjust_pointer_closure() { return (OopClosure*)&_adjust_pointer_closure; } - static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; } - static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&_is_alive_closure; } static void initialize_space_info(); @@ -888,8 +888,6 @@ // Mark live objects static void marking_phase(ParCompactionManager* cm, bool maximum_heap_compaction); - static void follow_weak_klass_links(); - static void follow_mdo_weak_refs(); template <class T> static inline void adjust_pointer(T* p, bool is_root); static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); } @@ -981,9 +979,6 @@ // Adjust addresses in roots. Does not adjust addresses in heap. static void adjust_roots(); - // Serial code executed in preparation for the compaction phase. - static void compact_prologue(); - // Move objects to new locations. static void compact_perm(ParCompactionManager* cm); static void compact(); @@ -1049,6 +1044,17 @@ virtual void do_oop(narrowOop* p); }; + // The one and only place to start following the classes. + // Should only be applied to the ClassLoaderData klasses list. + class FollowKlassClosure : public KlassClosure { + private: + MarkAndPushClosure* _mark_and_push_closure; + public: + FollowKlassClosure(MarkAndPushClosure* mark_and_push_closure) : + _mark_and_push_closure(mark_and_push_closure) { } + void do_klass(Klass* klass); + }; + PSParallelCompact(); // Convenient accessor for Universe::heap(). @@ -1066,6 +1072,12 @@ // in the event of a failure. static bool initialize(); + // Closure accessors + static OopClosure* adjust_pointer_closure() { return (OopClosure*)&_adjust_pointer_closure; } + static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; } + static KlassClosure* adjust_klass_closure() { return (KlassClosure*)&_adjust_klass_closure; } + static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&_is_alive_closure; } + // Public accessors static elapsedTimer* accumulated_time() { return &_accumulated_time; } static unsigned int total_invocations() { return _total_invocations; } @@ -1073,16 +1085,25 @@ // Used to add tasks static GCTaskManager* const gc_task_manager(); - static klassOop updated_int_array_klass_obj() { + static Klass* updated_int_array_klass_obj() { return _updated_int_array_klass_obj; } // Marking support static inline bool mark_obj(oop obj); + static inline bool is_marked(oop obj); // Check mark and maybe push on marking stack template <class T> static inline void mark_and_push(ParCompactionManager* cm, T* p); + static void follow_klass(ParCompactionManager* cm, Klass* klass); + static void adjust_klass(ParCompactionManager* cm, Klass* klass); + + static void follow_class_loader(ParCompactionManager* cm, + ClassLoaderData* klass); + static void adjust_class_loader(ParCompactionManager* cm, + ClassLoaderData* klass); + // Compaction support. // Return true if p is in the range [beg_addr, end_addr). static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr); @@ -1094,9 +1115,6 @@ static inline HeapWord* dense_prefix(SpaceId space_id); static inline ObjectStartArray* start_array(SpaceId space_id); - // Return true if the klass should be updated. - static inline bool should_update_klass(klassOop k); - // Move and update the live objects in the specified space. static void move_and_update(ParCompactionManager* cm, SpaceId space_id); @@ -1179,7 +1197,7 @@ static void track_interior_pointers(oop obj); static void check_interior_pointers(); - static void reset_live_oop_tracking(bool at_perm); + static void reset_live_oop_tracking(); static void register_live_oop(oop p, size_t size); static void validate_live_oop(oop p, size_t size); static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top); @@ -1192,13 +1210,6 @@ static void print_new_location_of_heap_address(HeapWord* q); #endif // #ifdef VALIDATE_MARK_SWEEP - // Call backs for class unloading - // Update subklass/sibling/implementor links at end of marking. - static void revisit_weak_klass_link(ParCompactionManager* cm, Klass* k); - - // Clear unmarked oops in MDOs at the end of marking. - static void revisit_mdo(ParCompactionManager* cm, DataLayout* p); - #ifndef PRODUCT // Debugging support. static const char* space_names[last_space_id]; @@ -1231,6 +1242,10 @@ } } +inline bool PSParallelCompact::is_marked(oop obj) { + return mark_bitmap()->is_marked(obj); +} + template <class T> inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) { assert(!Universe::heap()->is_in_reserved(p), @@ -1270,8 +1285,7 @@ if (!oopDesc::is_null(heap_oop)) { oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); oop new_obj = (oop)summary_data().calc_new_pointer(obj); - assert(new_obj != NULL || // is forwarding ptr? - obj->is_shared(), // never forwarded? + assert(new_obj != NULL, // is forwarding ptr? "should be forwarded"); // Just always do the update unconditionally? if (new_obj != NULL) { @@ -1353,10 +1367,6 @@ return _space_info[id].start_array(); } -inline bool PSParallelCompact::should_update_klass(klassOop k) { - return ((HeapWord*) k) >= dense_prefix(perm_space_id); -} - #ifdef ASSERT inline void PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr) @@ -1448,8 +1458,7 @@ ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm), _start_array(PSParallelCompact::start_array(space_id)) { - assert(space_id == PSParallelCompact::perm_space_id || - space_id == PSParallelCompact::old_space_id, + assert(space_id == PSParallelCompact::old_space_id, "cannot use FillClosure in the young gen"); }