< prev index next >

src/share/vm/gc/parallel/psParallelCompact.hpp

Print this page
rev 9846 : [mq]: par-scav-patch
rev 9847 : 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value.
Reviewed-by: tschatzl, mgerdin
Contributed-by: ray alex <sky1young@gmail.com>

*** 1,7 **** /* ! * Copyright (c) 2005, 2015, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2005, 2016, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 449,462 **** // Return the address one past the end of the partial object. HeapWord* partial_obj_end(size_t region_idx) const; // Return the location of the object after compaction. ! HeapWord* calc_new_pointer(HeapWord* addr); ! HeapWord* calc_new_pointer(oop p) { ! return calc_new_pointer((HeapWord*) p); } #ifdef ASSERT void verify_clear(const PSVirtualSpace* vspace); void verify_clear(); --- 449,462 ---- // Return the address one past the end of the partial object. HeapWord* partial_obj_end(size_t region_idx) const; // Return the location of the object after compaction. ! HeapWord* calc_new_pointer(HeapWord* addr, ParCompactionManager* cm); ! HeapWord* calc_new_pointer(oop p, ParCompactionManager* cm) { ! return calc_new_pointer((HeapWord*) p, cm); } #ifdef ASSERT void verify_clear(const PSVirtualSpace* vspace); void verify_clear();
*** 935,955 **** --- 935,967 ---- virtual bool do_object_b(oop p); }; class AdjustPointerClosure: public ExtendedOopClosure { public: + AdjustPointerClosure(ParCompactionManager* cm) { + assert(cm != NULL, "associate ParCompactionManage should not be NULL"); + _cm = cm; + } template <typename T> void do_oop_nv(T* p); virtual void do_oop(oop* p); virtual void do_oop(narrowOop* p); // This closure provides its own oop verification code. debug_only(virtual bool should_verify_oops() { return false; }) + private: + ParCompactionManager* _cm; }; class AdjustKlassClosure : public KlassClosure { public: + AdjustKlassClosure(ParCompactionManager* cm) { + assert(cm != NULL, "associate ParCompactionManage should not be NULL"); + _cm = cm; + } void do_klass(Klass* klass); + private: + ParCompactionManager* _cm; }; friend class AdjustPointerClosure; friend class AdjustKlassClosure; friend class RefProcTaskProxy;
*** 964,975 **** static CollectorCounters* _counters; static ParMarkBitMap _mark_bitmap; static ParallelCompactData _summary_data; static IsAliveClosure _is_alive_closure; static SpaceInfo _space_info[last_space_id]; - static AdjustPointerClosure _adjust_pointer_closure; - static AdjustKlassClosure _adjust_klass_closure; // Reference processing (used in ...follow_contents) static ReferenceProcessor* _ref_processor; // Values computed at initialization and used by dead_wood_limiter(). --- 976,985 ----
*** 1061,1071 **** static void summarize_spaces_quick(); static void summarize_space(SpaceId id, bool maximum_compaction); static void summary_phase(ParCompactionManager* cm, bool maximum_compaction); // Adjust addresses in roots. Does not adjust addresses in heap. ! static void adjust_roots(); DEBUG_ONLY(static void write_block_fill_histogram();) // Move objects to new locations. static void compact_perm(ParCompactionManager* cm); --- 1071,1081 ---- static void summarize_spaces_quick(); static void summarize_space(SpaceId id, bool maximum_compaction); static void summary_phase(ParCompactionManager* cm, bool maximum_compaction); // Adjust addresses in roots. Does not adjust addresses in heap. ! static void adjust_roots(ParCompactionManager* cm); DEBUG_ONLY(static void write_block_fill_histogram();) // Move objects to new locations. static void compact_perm(ParCompactionManager* cm);
*** 1107,1120 **** // at a pointer where it would be appropriate to return a JNI_ENOMEM // in the event of a failure. static bool initialize(); // Closure accessors - static PSParallelCompact::AdjustPointerClosure* adjust_pointer_closure() { - return &_adjust_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; } --- 1117,1126 ----
*** 1125,1135 **** // Marking support static inline bool mark_obj(oop obj); static inline bool is_marked(oop obj); ! template <class T> static inline void adjust_pointer(T* p); // 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); static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr); --- 1131,1141 ---- // Marking support static inline bool mark_obj(oop obj); static inline bool is_marked(oop obj); ! template <class T> static inline void adjust_pointer(T* p, ParCompactionManager* cm); // 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); static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr);
< prev index next >