Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp @ 1145:e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa
author | ysr |
---|---|
date | Wed, 23 Dec 2009 09:23:54 -0800 |
parents | d1605aabd0a1 |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1111:44f61c24ddab | 1145:e018e6884bd8 |
---|---|
33 // | 33 // |
34 // See the corresponding .cpp file for a description of the specifics | 34 // See the corresponding .cpp file for a description of the specifics |
35 // for that implementation. | 35 // for that implementation. |
36 | 36 |
37 class Mutex; | 37 class Mutex; |
38 class TreeList; | |
38 | 39 |
39 class FreeList VALUE_OBJ_CLASS_SPEC { | 40 class FreeList VALUE_OBJ_CLASS_SPEC { |
40 friend class CompactibleFreeListSpace; | 41 friend class CompactibleFreeListSpace; |
41 friend class VMStructs; | 42 friend class VMStructs; |
42 friend class printTreeCensusClosure; | 43 friend class PrintTreeCensusClosure; |
43 FreeChunk* _head; // List of free chunks | 44 |
45 protected: | |
46 TreeList* _parent; | |
47 TreeList* _left; | |
48 TreeList* _right; | |
49 | |
50 private: | |
51 FreeChunk* _head; // Head of list of free chunks | |
44 FreeChunk* _tail; // Tail of list of free chunks | 52 FreeChunk* _tail; // Tail of list of free chunks |
45 size_t _size; // Size in Heap words of each chunks | 53 size_t _size; // Size in Heap words of each chunk |
46 ssize_t _count; // Number of entries in list | 54 ssize_t _count; // Number of entries in list |
47 size_t _hint; // next larger size list with a positive surplus | 55 size_t _hint; // next larger size list with a positive surplus |
48 | 56 |
49 AllocationStats _allocation_stats; // statistics for smart allocation | 57 AllocationStats _allocation_stats; // allocation-related statistics |
50 | 58 |
51 #ifdef ASSERT | 59 #ifdef ASSERT |
52 Mutex* _protecting_lock; | 60 Mutex* _protecting_lock; |
53 #endif | 61 #endif |
54 | 62 |
61 #endif | 69 #endif |
62 } | 70 } |
63 | 71 |
64 // Initialize the allocation statistics. | 72 // Initialize the allocation statistics. |
65 protected: | 73 protected: |
66 void init_statistics(); | 74 void init_statistics(bool split_birth = false); |
67 void set_count(ssize_t v) { _count = v;} | 75 void set_count(ssize_t v) { _count = v;} |
68 void increment_count() { _count++; } | 76 void increment_count() { |
77 _count++; | |
78 } | |
79 | |
69 void decrement_count() { | 80 void decrement_count() { |
70 _count--; | 81 _count--; |
71 assert(_count >= 0, "Count should not be negative"); | 82 assert(_count >= 0, "Count should not be negative"); |
72 } | 83 } |
73 | 84 |
165 void set_desired(ssize_t v) { | 176 void set_desired(ssize_t v) { |
166 assert_proper_lock_protection(); | 177 assert_proper_lock_protection(); |
167 _allocation_stats.set_desired(v); | 178 _allocation_stats.set_desired(v); |
168 } | 179 } |
169 void compute_desired(float inter_sweep_current, | 180 void compute_desired(float inter_sweep_current, |
170 float inter_sweep_estimate) { | 181 float inter_sweep_estimate, |
182 float intra_sweep_estimate) { | |
171 assert_proper_lock_protection(); | 183 assert_proper_lock_protection(); |
172 _allocation_stats.compute_desired(_count, | 184 _allocation_stats.compute_desired(_count, |
173 inter_sweep_current, | 185 inter_sweep_current, |
174 inter_sweep_estimate); | 186 inter_sweep_estimate, |
187 intra_sweep_estimate); | |
175 } | 188 } |
176 ssize_t coalDesired() const { | 189 ssize_t coalDesired() const { |
177 return _allocation_stats.coalDesired(); | 190 return _allocation_stats.coalDesired(); |
178 } | 191 } |
179 void set_coalDesired(ssize_t v) { | 192 void set_coalDesired(ssize_t v) { |
304 | 317 |
305 // Verify that the chunk is in the list. | 318 // Verify that the chunk is in the list. |
306 // found. Return NULL if "fc" is not found. | 319 // found. Return NULL if "fc" is not found. |
307 bool verifyChunkInFreeLists(FreeChunk* fc) const; | 320 bool verifyChunkInFreeLists(FreeChunk* fc) const; |
308 | 321 |
322 // Stats verification | |
323 void verify_stats() const PRODUCT_RETURN; | |
324 | |
309 // Printing support | 325 // Printing support |
310 static void print_labels_on(outputStream* st, const char* c); | 326 static void print_labels_on(outputStream* st, const char* c); |
311 void print_on(outputStream* st, const char* c = NULL) const; | 327 void print_on(outputStream* st, const char* c = NULL) const; |
312 }; | 328 }; |