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 };