Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a61af66fc99e |
children | d1605aabd0a1 12eea04c8b06 |
comparison
equal
deleted
inserted
replaced
110:a49a647afe9a | 113:ba764ed4b6f2 |
---|---|
78 // Sizes are in HeapWords, unless indicated otherwise. | 78 // Sizes are in HeapWords, unless indicated otherwise. |
79 static const size_t Log2ChunkSize; | 79 static const size_t Log2ChunkSize; |
80 static const size_t ChunkSize; | 80 static const size_t ChunkSize; |
81 static const size_t ChunkSizeBytes; | 81 static const size_t ChunkSizeBytes; |
82 | 82 |
83 // Mask for the bits in a size_t to get an offset within a chunk. | 83 // Mask for the bits in a size_t to get an offset within a chunk. |
84 static const size_t ChunkSizeOffsetMask; | 84 static const size_t ChunkSizeOffsetMask; |
85 // Mask for the bits in a pointer to get an offset within a chunk. | 85 // Mask for the bits in a pointer to get an offset within a chunk. |
86 static const size_t ChunkAddrOffsetMask; | 86 static const size_t ChunkAddrOffsetMask; |
87 // Mask for the bits in a pointer to get the address of the start of a chunk. | 87 // Mask for the bits in a pointer to get the address of the start of a chunk. |
88 static const size_t ChunkAddrMask; | 88 static const size_t ChunkAddrMask; |
89 | 89 |
90 static const size_t Log2BlockSize; | 90 static const size_t Log2BlockSize; |
91 static const size_t BlockSize; | 91 static const size_t BlockSize; |
92 static const size_t BlockOffsetMask; | 92 static const size_t BlockOffsetMask; |
227 // 'parity' of the first 1 bit in the Block: a positive offset means the | 227 // 'parity' of the first 1 bit in the Block: a positive offset means the |
228 // first 1 bit marks the start of an object, a negative offset means the first | 228 // first 1 bit marks the start of an object, a negative offset means the first |
229 // 1 bit marks the end of an object. | 229 // 1 bit marks the end of an object. |
230 class BlockData | 230 class BlockData |
231 { | 231 { |
232 public: | 232 public: |
233 typedef short int blk_ofs_t; | 233 typedef short int blk_ofs_t; |
234 | 234 |
235 blk_ofs_t offset() const { return _offset >= 0 ? _offset : -_offset; } | 235 blk_ofs_t offset() const { return _offset >= 0 ? _offset : -_offset; } |
236 blk_ofs_t raw_offset() const { return _offset; } | 236 blk_ofs_t raw_offset() const { return _offset; } |
237 void set_first_is_start_bit(bool v) { _first_is_start_bit = v; } | 237 void set_first_is_start_bit(bool v) { _first_is_start_bit = v; } |
267 bool first_is_end_bit() { | 267 bool first_is_end_bit() { |
268 assert(_set_phase > 0, "Not initialized"); | 268 assert(_set_phase > 0, "Not initialized"); |
269 return !_first_is_start_bit; | 269 return !_first_is_start_bit; |
270 } | 270 } |
271 | 271 |
272 private: | 272 private: |
273 blk_ofs_t _offset; | 273 blk_ofs_t _offset; |
274 // This is temporary until the mark_bitmap is separated into | 274 // This is temporary until the mark_bitmap is separated into |
275 // a start bit array and an end bit array. | 275 // a start bit array and an end bit array. |
276 bool _first_is_start_bit; | 276 bool _first_is_start_bit; |
277 #ifdef ASSERT | 277 #ifdef ASSERT |
278 short _set_phase; | 278 short _set_phase; |
279 static short _cur_phase; | 279 static short _cur_phase; |
280 public: | 280 public: |
281 static void set_cur_phase(short v) { _cur_phase = v; } | 281 static void set_cur_phase(short v) { _cur_phase = v; } |
282 #endif | 282 #endif |
283 }; | 283 }; |
284 | 284 |
285 public: | 285 public: |
727 perm_space_id, old_space_id, eden_space_id, | 727 perm_space_id, old_space_id, eden_space_id, |
728 from_space_id, to_space_id, last_space_id | 728 from_space_id, to_space_id, last_space_id |
729 } SpaceId; | 729 } SpaceId; |
730 | 730 |
731 public: | 731 public: |
732 // In line closure decls | 732 // Inline closure decls |
733 // | 733 // |
734 | |
735 class IsAliveClosure: public BoolObjectClosure { | 734 class IsAliveClosure: public BoolObjectClosure { |
736 public: | 735 public: |
737 void do_object(oop p) { assert(false, "don't call"); } | 736 virtual void do_object(oop p); |
738 bool do_object_b(oop p) { return mark_bitmap()->is_marked(p); } | 737 virtual bool do_object_b(oop p); |
739 }; | 738 }; |
740 | 739 |
741 class KeepAliveClosure: public OopClosure { | 740 class KeepAliveClosure: public OopClosure { |
741 private: | |
742 ParCompactionManager* _compaction_manager; | |
743 protected: | |
744 template <class T> inline void do_oop_work(T* p); | |
745 public: | |
746 KeepAliveClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } | |
747 virtual void do_oop(oop* p); | |
748 virtual void do_oop(narrowOop* p); | |
749 }; | |
750 | |
751 // Current unused | |
752 class FollowRootClosure: public OopsInGenClosure { | |
753 private: | |
742 ParCompactionManager* _compaction_manager; | 754 ParCompactionManager* _compaction_manager; |
743 public: | 755 public: |
744 KeepAliveClosure(ParCompactionManager* cm) { | 756 FollowRootClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } |
745 _compaction_manager = cm; | 757 virtual void do_oop(oop* p); |
746 } | 758 virtual void do_oop(narrowOop* p); |
747 void do_oop(oop* p); | 759 virtual const bool do_nmethods() const { return true; } |
748 }; | 760 }; |
749 | 761 |
750 class FollowRootClosure: public OopsInGenClosure{ | 762 class FollowStackClosure: public VoidClosure { |
763 private: | |
751 ParCompactionManager* _compaction_manager; | 764 ParCompactionManager* _compaction_manager; |
752 public: | 765 public: |
753 FollowRootClosure(ParCompactionManager* cm) { | 766 FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } |
754 _compaction_manager = cm; | 767 virtual void do_void(); |
755 } | |
756 void do_oop(oop* p) { follow_root(_compaction_manager, p); } | |
757 virtual const bool do_nmethods() const { return true; } | |
758 }; | 768 }; |
759 | 769 |
760 class FollowStackClosure: public VoidClosure { | |
761 ParCompactionManager* _compaction_manager; | |
762 public: | |
763 FollowStackClosure(ParCompactionManager* cm) { | |
764 _compaction_manager = cm; | |
765 } | |
766 void do_void() { follow_stack(_compaction_manager); } | |
767 }; | |
768 | |
769 class AdjustPointerClosure: public OopsInGenClosure { | 770 class AdjustPointerClosure: public OopsInGenClosure { |
771 private: | |
770 bool _is_root; | 772 bool _is_root; |
771 public: | 773 public: |
772 AdjustPointerClosure(bool is_root) : _is_root(is_root) {} | 774 AdjustPointerClosure(bool is_root) : _is_root(is_root) { } |
773 void do_oop(oop* p) { adjust_pointer(p, _is_root); } | 775 virtual void do_oop(oop* p); |
776 virtual void do_oop(narrowOop* p); | |
774 }; | 777 }; |
775 | 778 |
776 // Closure for verifying update of pointers. Does not | 779 // Closure for verifying update of pointers. Does not |
777 // have any side effects. | 780 // have any side effects. |
778 class VerifyUpdateClosure: public ParMarkBitMapClosure { | 781 class VerifyUpdateClosure: public ParMarkBitMapClosure { |
802 friend class FollowStackClosure; | 805 friend class FollowStackClosure; |
803 friend class AdjustPointerClosure; | 806 friend class AdjustPointerClosure; |
804 friend class FollowRootClosure; | 807 friend class FollowRootClosure; |
805 friend class instanceKlassKlass; | 808 friend class instanceKlassKlass; |
806 friend class RefProcTaskProxy; | 809 friend class RefProcTaskProxy; |
807 | |
808 static void mark_and_push_internal(ParCompactionManager* cm, oop* p); | |
809 | 810 |
810 private: | 811 private: |
811 static elapsedTimer _accumulated_time; | 812 static elapsedTimer _accumulated_time; |
812 static unsigned int _total_invocations; | 813 static unsigned int _total_invocations; |
813 static unsigned int _maximum_compaction_gc_num; | 814 static unsigned int _maximum_compaction_gc_num; |
836 static bool _dwl_initialized; | 837 static bool _dwl_initialized; |
837 #endif // #ifdef ASSERT | 838 #endif // #ifdef ASSERT |
838 | 839 |
839 private: | 840 private: |
840 // Closure accessors | 841 // Closure accessors |
841 static OopClosure* adjust_pointer_closure() { return (OopClosure*)&_adjust_pointer_closure; } | 842 static OopClosure* adjust_pointer_closure() { return (OopClosure*)&_adjust_pointer_closure; } |
842 static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; } | 843 static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; } |
843 static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&_is_alive_closure; } | 844 static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&_is_alive_closure; } |
844 | 845 |
845 static void initialize_space_info(); | 846 static void initialize_space_info(); |
846 | 847 |
847 // Return true if details about individual phases should be printed. | 848 // Return true if details about individual phases should be printed. |
848 static inline bool print_phases(); | 849 static inline bool print_phases(); |
857 static void marking_phase(ParCompactionManager* cm, | 858 static void marking_phase(ParCompactionManager* cm, |
858 bool maximum_heap_compaction); | 859 bool maximum_heap_compaction); |
859 static void follow_stack(ParCompactionManager* cm); | 860 static void follow_stack(ParCompactionManager* cm); |
860 static void follow_weak_klass_links(ParCompactionManager* cm); | 861 static void follow_weak_klass_links(ParCompactionManager* cm); |
861 | 862 |
862 static void adjust_pointer(oop* p, bool is_root); | 863 template <class T> static inline void adjust_pointer(T* p, bool is_root); |
863 static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); } | 864 static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); } |
864 | 865 |
865 static void follow_root(ParCompactionManager* cm, oop* p); | 866 template <class T> |
867 static inline void follow_root(ParCompactionManager* cm, T* p); | |
866 | 868 |
867 // Compute the dense prefix for the designated space. This is an experimental | 869 // Compute the dense prefix for the designated space. This is an experimental |
868 // implementation currently not used in production. | 870 // implementation currently not used in production. |
869 static HeapWord* compute_dense_prefix_via_density(const SpaceId id, | 871 static HeapWord* compute_dense_prefix_via_density(const SpaceId id, |
870 bool maximum_compaction); | 872 bool maximum_compaction); |
969 // Reset time since last full gc | 971 // Reset time since last full gc |
970 static void reset_millis_since_last_gc(); | 972 static void reset_millis_since_last_gc(); |
971 | 973 |
972 protected: | 974 protected: |
973 #ifdef VALIDATE_MARK_SWEEP | 975 #ifdef VALIDATE_MARK_SWEEP |
974 static GrowableArray<oop*>* _root_refs_stack; | 976 static GrowableArray<void*>* _root_refs_stack; |
975 static GrowableArray<oop> * _live_oops; | 977 static GrowableArray<oop> * _live_oops; |
976 static GrowableArray<oop> * _live_oops_moved_to; | 978 static GrowableArray<oop> * _live_oops_moved_to; |
977 static GrowableArray<size_t>* _live_oops_size; | 979 static GrowableArray<size_t>* _live_oops_size; |
978 static size_t _live_oops_index; | 980 static size_t _live_oops_index; |
979 static size_t _live_oops_index_at_perm; | 981 static size_t _live_oops_index_at_perm; |
980 static GrowableArray<oop*>* _other_refs_stack; | 982 static GrowableArray<void*>* _other_refs_stack; |
981 static GrowableArray<oop*>* _adjusted_pointers; | 983 static GrowableArray<void*>* _adjusted_pointers; |
982 static bool _pointer_tracking; | 984 static bool _pointer_tracking; |
983 static bool _root_tracking; | 985 static bool _root_tracking; |
984 | 986 |
985 // The following arrays are saved since the time of the last GC and | 987 // The following arrays are saved since the time of the last GC and |
986 // assist in tracking down problems where someone has done an errant | 988 // assist in tracking down problems where someone has done an errant |
997 static GrowableArray<size_t>* _last_gc_live_oops_size; | 999 static GrowableArray<size_t>* _last_gc_live_oops_size; |
998 #endif | 1000 #endif |
999 | 1001 |
1000 public: | 1002 public: |
1001 class MarkAndPushClosure: public OopClosure { | 1003 class MarkAndPushClosure: public OopClosure { |
1004 private: | |
1002 ParCompactionManager* _compaction_manager; | 1005 ParCompactionManager* _compaction_manager; |
1003 public: | 1006 public: |
1004 MarkAndPushClosure(ParCompactionManager* cm) { | 1007 MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } |
1005 _compaction_manager = cm; | 1008 virtual void do_oop(oop* p); |
1006 } | 1009 virtual void do_oop(narrowOop* p); |
1007 void do_oop(oop* p) { mark_and_push(_compaction_manager, p); } | |
1008 virtual const bool do_nmethods() const { return true; } | 1010 virtual const bool do_nmethods() const { return true; } |
1009 }; | 1011 }; |
1010 | 1012 |
1011 PSParallelCompact(); | 1013 PSParallelCompact(); |
1012 | 1014 |
1036 return _updated_int_array_klass_obj; | 1038 return _updated_int_array_klass_obj; |
1037 } | 1039 } |
1038 | 1040 |
1039 // Marking support | 1041 // Marking support |
1040 static inline bool mark_obj(oop obj); | 1042 static inline bool mark_obj(oop obj); |
1041 static bool mark_obj(oop* p) { | 1043 // Check mark and maybe push on marking stack |
1042 if (*p != NULL) { | 1044 template <class T> static inline void mark_and_push(ParCompactionManager* cm, |
1043 return mark_obj(*p); | 1045 T* p); |
1044 } else { | |
1045 return false; | |
1046 } | |
1047 } | |
1048 static void mark_and_push(ParCompactionManager* cm, oop* p) { | |
1049 // Check mark and maybe push on | |
1050 // marking stack | |
1051 oop m = *p; | |
1052 if (m != NULL && mark_bitmap()->is_unmarked(m)) { | |
1053 mark_and_push_internal(cm, p); | |
1054 } | |
1055 } | |
1056 | 1046 |
1057 // Compaction support. | 1047 // Compaction support. |
1058 // Return true if p is in the range [beg_addr, end_addr). | 1048 // Return true if p is in the range [beg_addr, end_addr). |
1059 static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr); | 1049 static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr); |
1060 static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr); | 1050 static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr); |
1125 | 1115 |
1126 // Update the deferred objects in the space. | 1116 // Update the deferred objects in the space. |
1127 static void update_deferred_objects(ParCompactionManager* cm, SpaceId id); | 1117 static void update_deferred_objects(ParCompactionManager* cm, SpaceId id); |
1128 | 1118 |
1129 // Mark pointer and follow contents. | 1119 // Mark pointer and follow contents. |
1130 static void mark_and_follow(ParCompactionManager* cm, oop* p); | 1120 template <class T> |
1121 static inline void mark_and_follow(ParCompactionManager* cm, T* p); | |
1131 | 1122 |
1132 static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; } | 1123 static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; } |
1133 static ParallelCompactData& summary_data() { return _summary_data; } | 1124 static ParallelCompactData& summary_data() { return _summary_data; } |
1134 | 1125 |
1135 static inline void adjust_pointer(oop* p) { adjust_pointer(p, false); } | 1126 static inline void adjust_pointer(oop* p) { adjust_pointer(p, false); } |
1136 static inline void adjust_pointer(oop* p, | 1127 static inline void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); } |
1128 | |
1129 template <class T> | |
1130 static inline void adjust_pointer(T* p, | |
1137 HeapWord* beg_addr, | 1131 HeapWord* beg_addr, |
1138 HeapWord* end_addr); | 1132 HeapWord* end_addr); |
1139 | 1133 |
1140 // Reference Processing | 1134 // Reference Processing |
1141 static ReferenceProcessor* const ref_processor() { return _ref_processor; } | 1135 static ReferenceProcessor* const ref_processor() { return _ref_processor; } |
1145 | 1139 |
1146 // Time since last full gc (in milliseconds). | 1140 // Time since last full gc (in milliseconds). |
1147 static jlong millis_since_last_gc(); | 1141 static jlong millis_since_last_gc(); |
1148 | 1142 |
1149 #ifdef VALIDATE_MARK_SWEEP | 1143 #ifdef VALIDATE_MARK_SWEEP |
1150 static void track_adjusted_pointer(oop* p, oop newobj, bool isroot); | 1144 static void track_adjusted_pointer(void* p, bool isroot); |
1151 static void check_adjust_pointer(oop* p); // Adjust this pointer | 1145 static void check_adjust_pointer(void* p); |
1152 static void track_interior_pointers(oop obj); | 1146 static void track_interior_pointers(oop obj); |
1153 static void check_interior_pointers(); | 1147 static void check_interior_pointers(); |
1154 | 1148 |
1155 static void reset_live_oop_tracking(bool at_perm); | 1149 static void reset_live_oop_tracking(bool at_perm); |
1156 static void register_live_oop(oop p, size_t size); | 1150 static void register_live_oop(oop p, size_t size); |
1183 // Verify that all the chunks have been emptied. | 1177 // Verify that all the chunks have been emptied. |
1184 static void verify_complete(SpaceId space_id); | 1178 static void verify_complete(SpaceId space_id); |
1185 #endif // #ifdef ASSERT | 1179 #endif // #ifdef ASSERT |
1186 }; | 1180 }; |
1187 | 1181 |
1188 bool PSParallelCompact::mark_obj(oop obj) { | 1182 inline bool PSParallelCompact::mark_obj(oop obj) { |
1189 const int obj_size = obj->size(); | 1183 const int obj_size = obj->size(); |
1190 if (mark_bitmap()->mark_obj(obj, obj_size)) { | 1184 if (mark_bitmap()->mark_obj(obj, obj_size)) { |
1191 _summary_data.add_obj(obj, obj_size); | 1185 _summary_data.add_obj(obj, obj_size); |
1192 return true; | 1186 return true; |
1193 } else { | 1187 } else { |
1194 return false; | 1188 return false; |
1195 } | 1189 } |
1196 } | 1190 } |
1197 | 1191 |
1198 inline bool PSParallelCompact::print_phases() | 1192 template <class T> |
1199 { | 1193 inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) { |
1194 assert(!Universe::heap()->is_in_reserved(p), | |
1195 "roots shouldn't be things within the heap"); | |
1196 #ifdef VALIDATE_MARK_SWEEP | |
1197 if (ValidateMarkSweep) { | |
1198 guarantee(!_root_refs_stack->contains(p), "should only be in here once"); | |
1199 _root_refs_stack->push(p); | |
1200 } | |
1201 #endif | |
1202 T heap_oop = oopDesc::load_heap_oop(p); | |
1203 if (!oopDesc::is_null(heap_oop)) { | |
1204 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
1205 if (mark_bitmap()->is_unmarked(obj)) { | |
1206 if (mark_obj(obj)) { | |
1207 obj->follow_contents(cm); | |
1208 } | |
1209 } | |
1210 } | |
1211 follow_stack(cm); | |
1212 } | |
1213 | |
1214 template <class T> | |
1215 inline void PSParallelCompact::mark_and_follow(ParCompactionManager* cm, | |
1216 T* p) { | |
1217 T heap_oop = oopDesc::load_heap_oop(p); | |
1218 if (!oopDesc::is_null(heap_oop)) { | |
1219 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
1220 if (mark_bitmap()->is_unmarked(obj)) { | |
1221 if (mark_obj(obj)) { | |
1222 obj->follow_contents(cm); | |
1223 } | |
1224 } | |
1225 } | |
1226 } | |
1227 | |
1228 template <class T> | |
1229 inline void PSParallelCompact::mark_and_push(ParCompactionManager* cm, T* p) { | |
1230 T heap_oop = oopDesc::load_heap_oop(p); | |
1231 if (!oopDesc::is_null(heap_oop)) { | |
1232 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
1233 if (mark_bitmap()->is_unmarked(obj)) { | |
1234 if (mark_obj(obj)) { | |
1235 // This thread marked the object and owns the subsequent processing of it. | |
1236 cm->save_for_scanning(obj); | |
1237 } | |
1238 } | |
1239 } | |
1240 } | |
1241 | |
1242 template <class T> | |
1243 inline void PSParallelCompact::adjust_pointer(T* p, bool isroot) { | |
1244 T heap_oop = oopDesc::load_heap_oop(p); | |
1245 if (!oopDesc::is_null(heap_oop)) { | |
1246 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
1247 oop new_obj = (oop)summary_data().calc_new_pointer(obj); | |
1248 assert(new_obj != NULL || // is forwarding ptr? | |
1249 obj->is_shared(), // never forwarded? | |
1250 "should be forwarded"); | |
1251 // Just always do the update unconditionally? | |
1252 if (new_obj != NULL) { | |
1253 assert(Universe::heap()->is_in_reserved(new_obj), | |
1254 "should be in object space"); | |
1255 oopDesc::encode_store_heap_oop_not_null(p, new_obj); | |
1256 } | |
1257 } | |
1258 VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot)); | |
1259 } | |
1260 | |
1261 template <class T> | |
1262 inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) { | |
1263 #ifdef VALIDATE_MARK_SWEEP | |
1264 if (ValidateMarkSweep) { | |
1265 if (!Universe::heap()->is_in_reserved(p)) { | |
1266 _root_refs_stack->push(p); | |
1267 } else { | |
1268 _other_refs_stack->push(p); | |
1269 } | |
1270 } | |
1271 #endif | |
1272 mark_and_push(_compaction_manager, p); | |
1273 } | |
1274 | |
1275 inline bool PSParallelCompact::print_phases() { | |
1200 return _print_phases; | 1276 return _print_phases; |
1201 } | 1277 } |
1202 | 1278 |
1203 inline double PSParallelCompact::normal_distribution(double density) | 1279 inline double PSParallelCompact::normal_distribution(double density) { |
1204 { | |
1205 assert(_dwl_initialized, "uninitialized"); | 1280 assert(_dwl_initialized, "uninitialized"); |
1206 const double squared_term = (density - _dwl_mean) / _dwl_std_dev; | 1281 const double squared_term = (density - _dwl_mean) / _dwl_std_dev; |
1207 return _dwl_first_term * exp(-0.5 * squared_term * squared_term); | 1282 return _dwl_first_term * exp(-0.5 * squared_term * squared_term); |
1208 } | 1283 } |
1209 | 1284 |
1255 | 1330 |
1256 inline bool PSParallelCompact::should_update_klass(klassOop k) { | 1331 inline bool PSParallelCompact::should_update_klass(klassOop k) { |
1257 return ((HeapWord*) k) >= dense_prefix(perm_space_id); | 1332 return ((HeapWord*) k) >= dense_prefix(perm_space_id); |
1258 } | 1333 } |
1259 | 1334 |
1260 inline void PSParallelCompact::adjust_pointer(oop* p, | 1335 template <class T> |
1336 inline void PSParallelCompact::adjust_pointer(T* p, | |
1261 HeapWord* beg_addr, | 1337 HeapWord* beg_addr, |
1262 HeapWord* end_addr) { | 1338 HeapWord* end_addr) { |
1263 if (is_in(p, beg_addr, end_addr)) { | 1339 if (is_in((HeapWord*)p, beg_addr, end_addr)) { |
1264 adjust_pointer(p); | 1340 adjust_pointer(p); |
1265 } | 1341 } |
1266 } | 1342 } |
1267 | 1343 |
1268 class MoveAndUpdateClosure: public ParMarkBitMapClosure { | 1344 class MoveAndUpdateClosure: public ParMarkBitMapClosure { |
1330 virtual IterationStatus do_addr(HeapWord* addr, size_t words); | 1406 virtual IterationStatus do_addr(HeapWord* addr, size_t words); |
1331 | 1407 |
1332 inline void do_addr(HeapWord* addr); | 1408 inline void do_addr(HeapWord* addr); |
1333 }; | 1409 }; |
1334 | 1410 |
1335 inline void UpdateOnlyClosure::do_addr(HeapWord* addr) { | 1411 inline void UpdateOnlyClosure::do_addr(HeapWord* addr) |
1412 { | |
1336 _start_array->allocate_block(addr); | 1413 _start_array->allocate_block(addr); |
1337 oop(addr)->update_contents(compaction_manager()); | 1414 oop(addr)->update_contents(compaction_manager()); |
1338 } | 1415 } |
1339 | 1416 |
1340 class FillClosure: public ParMarkBitMapClosure { | 1417 class FillClosure: public ParMarkBitMapClosure { |
1341 public: | 1418 public: |
1342 FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id): | 1419 FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) : |
1343 ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm), | 1420 ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm), |
1344 _space_id(space_id), | 1421 _space_id(space_id), |
1345 _start_array(PSParallelCompact::start_array(space_id)) | 1422 _start_array(PSParallelCompact::start_array(space_id)) { |
1346 { | |
1347 assert(_space_id == PSParallelCompact::perm_space_id || | 1423 assert(_space_id == PSParallelCompact::perm_space_id || |
1348 _space_id == PSParallelCompact::old_space_id, | 1424 _space_id == PSParallelCompact::old_space_id, |
1349 "cannot use FillClosure in the young gen"); | 1425 "cannot use FillClosure in the young gen"); |
1350 assert(bitmap() != NULL, "need a bitmap"); | 1426 assert(bitmap() != NULL, "need a bitmap"); |
1351 assert(_start_array != NULL, "need a start array"); | 1427 assert(_start_array != NULL, "need a start array"); |