annotate src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children 685df3c6f84b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4728
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1521
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1521
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1521
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
28 #include "gc_implementation/concurrentMarkSweep/promotionInfo.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
29 #include "memory/binaryTreeDictionary.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
30 #include "memory/blockOffsetTable.inline.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
31 #include "memory/freeList.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
32 #include "memory/space.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Classes in support of keeping track of promotions into a non-Contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // space, in this case a CompactibleFreeListSpace.
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Forward declarations
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class BlkClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class BlkClosureCareful;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class UpwardsObjectClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class ObjectClosureCareful;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class Klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class LinearAllocBlock VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
47 LinearAllocBlock() : _ptr(0), _word_size(0), _refillSize(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _allocation_size_limit(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
49 void set(HeapWord* ptr, size_t word_size, size_t refill_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
50 size_t allocation_size_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _ptr = ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _word_size = word_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _refillSize = refill_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _allocation_size_limit = allocation_size_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 HeapWord* _ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 size_t _word_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 size_t _refillSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 size_t _allocation_size_limit; // largest size that will be allocated
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
60
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
61 void print_on(outputStream* st) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 };
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Concrete subclass of CompactibleSpace that implements
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // a free list space, such as used in the concurrent mark sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class CompactibleFreeListSpace: public CompactibleSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 friend class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 friend class ASConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Local alloc buffer for promotion into this space.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 friend class CFLS_LAB;
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // "Size" of chunks of work (executed during parallel remark phases
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // of CMS collection); this probably belongs in CMSCollector, although
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // it's cached here because it's used in
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // initialize_sequential_subtasks_for_rescan() which modifies
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // par_seq_tasks which also lives in Space. XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
81 const size_t _rescan_task_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 const size_t _marking_task_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Yet another sequential tasks done structure. This supports
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // CMS GC, where we have threads dynamically
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // claiming sub-tasks from a larger parallel task.
a61af66fc99e Initial load
duke
parents:
diff changeset
87 SequentialSubTasksDone _conc_par_seq_tasks;
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 BlockOffsetArrayNonContigSpace _bt;
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 ConcurrentMarkSweepGeneration* _gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Data structures for free blocks (used during allocation/sweeping)
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Allocation is done linearly from two different blocks depending on
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // whether the request is small or large, in an effort to reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // fragmentation. We assume that any locking for allocation is done
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // by the containing generation. Thus, none of the methods in this
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // space are re-entrant.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 enum SomeConstants {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 SmallForLinearAlloc = 16, // size < this then use _sLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
103 SmallForDictionary = 257, // size < this then use _indexedFreeList
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
104 IndexSetSize = SmallForDictionary // keep this odd-sized
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 };
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
106 static size_t IndexSetStart;
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
107 static size_t IndexSetStride;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 enum FitStrategyOptions {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 FreeBlockStrategyNone = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
112 FreeBlockBestFitFirst
a61af66fc99e Initial load
duke
parents:
diff changeset
113 };
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 PromotionInfo _promoInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // helps to impose a global total order on freelistLock ranks;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // assumes that CFLSpace's are allocated in global total order
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static int _lockRank;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // a lock protecting the free lists and free blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // mutable because of ubiquity of locking even for otherwise const methods
a61af66fc99e Initial load
duke
parents:
diff changeset
123 mutable Mutex _freelistLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // locking verifier convenience function
a61af66fc99e Initial load
duke
parents:
diff changeset
125 void assert_locked() const PRODUCT_RETURN;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
126 void assert_locked(const Mutex* lock) const PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Linear allocation blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
129 LinearAllocBlock _smallLinearAllocBlock;
a61af66fc99e Initial load
duke
parents:
diff changeset
130
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
131 FreeBlockDictionary<FreeChunk>::DictionaryChoice _dictionaryChoice;
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
132 FreeBlockDictionary<FreeChunk>* _dictionary; // ptr to dictionary for large size blocks
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
134 FreeList<FreeChunk> _indexedFreeList[IndexSetSize];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // indexed array for small size blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // allocation stategy
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool _fitStrategy; // Use best fit strategy.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 bool _adaptive_freelists; // Use adaptive freelists
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // This is an address close to the largest free chunk in the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // It is currently assumed to be at the end of the heap. Free
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // chunks with addresses greater than nearLargestChunk are coalesced
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // in an effort to maintain a large chunk at the end of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 HeapWord* _nearLargestChunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Used to keep track of limit of sweep for the space
a61af66fc99e Initial load
duke
parents:
diff changeset
147 HeapWord* _sweep_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Support for compacting cms
a61af66fc99e Initial load
duke
parents:
diff changeset
150 HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 HeapWord* forward(oop q, size_t size, CompactPoint* cp, HeapWord* compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Initialization helpers.
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void initializeIndexedFreeListArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Extra stuff to manage promotion parallelism.
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // a lock protecting the dictionary during par promotion allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
159 mutable Mutex _parDictionaryAllocLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 Mutex* parDictionaryAllocLock() const { return &_parDictionaryAllocLock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Locks protecting the exact lists during par promotion allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 Mutex* _indexedFreeListParLocks[IndexSetSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Attempt to obtain up to "n" blocks of the size "word_sz" (which is
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // required to be smaller than "IndexSetSize".) If successful,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // adds them to "fl", which is required to be an empty free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // If the count of "fl" is negative, it's absolute value indicates a
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // number of free chunks that had been previously "borrowed" from global
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // list of size "word_sz", and must now be decremented.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
171 void par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList<FreeChunk>* fl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Allocation helper functions
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Allocate using a strategy that takes from the indexed free lists
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // first. This allocation strategy assumes a companion sweeping
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // strategy that attempts to keep the needed number of chunks in each
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 HeapWord* allocate_adaptive_freelists(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Allocate from the linear allocation buffers first. This allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // strategy assumes maximal coalescing can maintain chunks large enough
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // to be used as linear allocation buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
182 HeapWord* allocate_non_adaptive_freelists(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Gets a chunk from the linear allocation block (LinAB). If there
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // is not enough space in the LinAB, refills it.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 HeapWord* getChunkFromLinearAllocBlock(LinearAllocBlock* blk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 HeapWord* getChunkFromSmallLinearAllocBlock(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Get a chunk from the space remaining in the linear allocation block. Do
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // not attempt to refill if the space is not available, return NULL. Do the
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // repairs on the linear allocation block as appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 HeapWord* getChunkFromLinearAllocBlockRemainder(LinearAllocBlock* blk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 inline HeapWord* getChunkFromSmallLinearAllocBlockRemainder(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Helper function for getChunkFromIndexedFreeList.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Replenish the indexed free list for this "size". Do not take from an
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // underpopulated size.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
197 FreeChunk* getChunkFromIndexedFreeListHelper(size_t size, bool replenish = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Get a chunk from the indexed free list. If the indexed free list
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // does not have a free chunk, try to replenish the indexed free list
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // then get the free chunk from the replenished indexed free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 inline FreeChunk* getChunkFromIndexedFreeList(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // The returned chunk may be larger than requested (or null).
a61af66fc99e Initial load
duke
parents:
diff changeset
205 FreeChunk* getChunkFromDictionary(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // The returned chunk is the exact size requested (or null).
a61af66fc99e Initial load
duke
parents:
diff changeset
207 FreeChunk* getChunkFromDictionaryExact(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Find a chunk in the indexed free list that is the best
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // fit for size "numWords".
a61af66fc99e Initial load
duke
parents:
diff changeset
211 FreeChunk* bestFitSmall(size_t numWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // For free list "fl" of chunks of size > numWords,
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // remove a chunk, split off a chunk of size numWords
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // and return it. The split off remainder is returned to
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // the free lists. The old name for getFromListGreater
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // was lookInListGreater.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
217 FreeChunk* getFromListGreater(FreeList<FreeChunk>* fl, size_t numWords);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Get a chunk in the indexed free list or dictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // by considering a larger chunk and splitting it.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 FreeChunk* getChunkFromGreater(size_t numWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Verify that the given chunk is in the indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 bool verifyChunkInIndexedFreeLists(FreeChunk* fc) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Remove the specified chunk from the indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void removeChunkFromIndexedFreeList(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Remove the specified chunk from the dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void removeChunkFromDictionary(FreeChunk* fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Split a free chunk into a smaller free chunk of size "new_size".
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Return the smaller free chunk and return the remainder to the
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 FreeChunk* splitChunkAndReturnRemainder(FreeChunk* chunk, size_t new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Add a chunk to the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void addChunkToFreeLists(HeapWord* chunk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Add a chunk to the free lists, preferring to suffix it
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // to the last free chunk at end of space if possible, and
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // updating the block census stats as well as block offset table.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Take any locks as appropriate if we are multithreaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void addChunkToFreeListsAtEndRecordingStats(HeapWord* chunk, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Add a free chunk to the indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void returnChunkToFreeList(FreeChunk* chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // Add a free chunk to the dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void returnChunkToDictionary(FreeChunk* chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Functions for maintaining the linear allocation buffers (LinAB).
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Repairing a linear allocation block refers to operations
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // performed on the remainder of a LinAB after an allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // has been made from it.
a61af66fc99e Initial load
duke
parents:
diff changeset
247 void repairLinearAllocationBlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 void repairLinearAllocBlock(LinearAllocBlock* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void refillLinearAllocBlock(LinearAllocBlock* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void refillLinearAllocBlocksIfNeeded();
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void verify_objects_initialized() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Statistics reporting helper functions
a61af66fc99e Initial load
duke
parents:
diff changeset
256 void reportFreeListStatistics() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 void reportIndexedFreeListStatistics() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 size_t maxChunkSizeInIndexedFreeLists() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 size_t numFreeBlocksInIndexedFreeLists() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Accessor
a61af66fc99e Initial load
duke
parents:
diff changeset
261 HeapWord* unallocated_block() const {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
262 if (BlockOffsetArrayUseUnallocatedBlock) {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
263 HeapWord* ub = _bt.unallocated_block();
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
264 assert(ub >= bottom() &&
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
265 ub <= end(), "space invariant");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
266 return ub;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
267 } else {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
268 return end();
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
269 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void freed(HeapWord* start, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 _bt.freed(start, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // reset the indexed free list to its initial empty condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void resetIndexedFreeListArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // reset to an initial state with a single free block described
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // by the MemRegion parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void reset(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Return the total number of words in the indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
282 size_t totalSizeInIndexedFreeLists() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Constructor...
a61af66fc99e Initial load
duke
parents:
diff changeset
286 CompactibleFreeListSpace(BlockOffsetSharedArray* bs, MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
287 bool use_adaptive_freelists,
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
288 FreeBlockDictionary<FreeChunk>::DictionaryChoice);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool bestFitFirst() { return _fitStrategy == FreeBlockBestFitFirst; }
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
291 FreeBlockDictionary<FreeChunk>* dictionary() const { return _dictionary; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 HeapWord* nearLargestChunk() const { return _nearLargestChunk; }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void set_nearLargestChunk(HeapWord* v) { _nearLargestChunk = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
295 // Set CMS global values
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
296 static void set_cms_values();
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
297
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Return the free chunk at the end of the space. If no such
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // chunk exists, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 FreeChunk* find_chunk_at_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
301
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
302 bool adaptive_freelists() const { return _adaptive_freelists; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 void set_collector(CMSCollector* collector) { _collector = collector; }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Support for parallelization of rescan and marking
a61af66fc99e Initial load
duke
parents:
diff changeset
307 const size_t rescan_task_size() const { return _rescan_task_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 const size_t marking_task_size() const { return _marking_task_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 SequentialSubTasksDone* conc_par_seq_tasks() {return &_conc_par_seq_tasks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 void initialize_sequential_subtasks_for_rescan(int n_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void initialize_sequential_subtasks_for_marking(int n_threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 HeapWord* low = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // Space enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
315 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 size_t free() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 size_t max_alloc_in_words() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // XXX: should have a less conservative used_region() than that of
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Space; we could consider keeping track of highest allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // address and correcting that at each sweep, as the sweeper
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // goes through the entire allocated part of the generation. We
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // could also use that information to keep the sweeper from
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // sweeping more than is necessary. The allocator and sweeper will
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // of course need to synchronize on this, since the sweeper will
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // try to bump down the address and the allocator will try to bump it up.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // For now, however, we'll just use the default used_region()
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // which overestimates the region by returning the entire
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // committed region (this is safe, but inefficient).
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Returns a subregion of the space containing all the objects in
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 MemRegion used_region() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 return MemRegion(bottom(),
a61af66fc99e Initial load
duke
parents:
diff changeset
334 BlockOffsetArrayUseUnallocatedBlock ?
a61af66fc99e Initial load
duke
parents:
diff changeset
335 unallocated_block() : end());
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 bool is_in(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 return used_region().contains(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 virtual bool is_free_block(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Resizing support
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void set_end(HeapWord* value); // override
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // mutual exclusion support
a61af66fc99e Initial load
duke
parents:
diff changeset
348 Mutex* freelistLock() const { return &_freelistLock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Iteration support
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
351 void oop_iterate(MemRegion mr, ExtendedOopClosure* cl);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
352 void oop_iterate(ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 void object_iterate(ObjectClosure* blk);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
355 // Apply the closure to each object in the space whose references
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
356 // point to objects in the heap. The usage of CompactibleFreeListSpace
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
357 // by the ConcurrentMarkSweepGeneration for concurrent GC's allows
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
358 // objects in the space with references to objects that are no longer
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
359 // valid. For example, an object may reference another object
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
360 // that has already been sweep up (collected). This method uses
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
361 // obj_is_alive() to determine whether it is safe to iterate of
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
362 // an object.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
363 void safe_object_iterate(ObjectClosure* blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
364 void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Requires that "mr" be entirely within the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // Apply "cl->do_object" to all objects that intersect with "mr".
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // If the iteration encounters an unparseable portion of the region,
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // terminate the iteration and return the address of the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // subregion that isn't done. Return of "NULL" indicates that the
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // interation completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
372 virtual HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
373 object_iterate_careful_m(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
374 ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 virtual HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
376 object_iterate_careful(ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Override: provides a DCTO_CL specific to this kind of space.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
379 DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
381 HeapWord* boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 void blk_iterate(BlkClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void blk_iterate_careful(BlkClosureCareful* cl);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
385 HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 HeapWord* block_start_careful(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 size_t block_size(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 size_t block_size_no_stall(HeapWord* p, const CMSCollector* c) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 bool block_is_obj(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 bool obj_is_alive(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 size_t block_size_nopar(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 bool block_is_obj_nopar(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // iteration support for promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
395 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
396 bool no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 void object_iterate_since_last_GC(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // iteration support for sweeping
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void save_sweep_limit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 _sweep_limit = BlockOffsetArrayUseUnallocatedBlock ?
a61af66fc99e Initial load
duke
parents:
diff changeset
402 unallocated_block() : end();
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 1972
diff changeset
403 if (CMSTraceSweeper) {
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 1972
diff changeset
404 gclog_or_tty->print_cr(">>>>> Saving sweep limit " PTR_FORMAT
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 1972
diff changeset
405 " for space [" PTR_FORMAT "," PTR_FORMAT ") <<<<<<",
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 1972
diff changeset
406 _sweep_limit, bottom(), end());
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 1972
diff changeset
407 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
410 void clear_sweep_limit() { _sweep_limit = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 )
a61af66fc99e Initial load
duke
parents:
diff changeset
412 HeapWord* sweep_limit() { return _sweep_limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // Apply "blk->do_oop" to the addresses of all reference fields in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // promoted into this generation since the most recent save_marks() call.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // *are* included in the iteration. Thus, when the iteration completes
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // there should be no further such objects remaining.
a61af66fc99e Initial load
duke
parents:
diff changeset
419 #define CFLS_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
420 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 ALL_SINCE_SAVE_MARKS_CLOSURES(CFLS_OOP_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #undef CFLS_OOP_SINCE_SAVE_MARKS_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Allocation support
a61af66fc99e Initial load
duke
parents:
diff changeset
425 HeapWord* allocate(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 HeapWord* par_allocate(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
428 oop promote(oop obj, size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 void gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // This call is used by a containing CMS generation / collector
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // to inform the CFLS space that a sweep has been completed
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // and that the space can do any related house-keeping functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void sweep_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // For an object in this space, the mark-word's two
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // LSB's having the value [11] indicates that it has been
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // promoted since the most recent call to save_marks() on
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // this generation and has not subsequently been iterated
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // over (using oop_since_save_marks_iterate() above).
1521
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
442 // This property holds only for single-threaded collections,
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
443 // and is typically used for Cheney scans; for MT scavenges,
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
444 // the property holds for all objects promoted during that
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
445 // scavenge for the duration of the scavenge and is used
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
446 // by card-scanning to avoid scanning objects (being) promoted
a8127dc669ba 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 1145
diff changeset
447 // during that scavenge.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 bool obj_allocated_since_save_marks(const oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 assert(is_in_reserved(obj), "Wrong space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
450 return ((PromotedObject*)obj)->hasPromotedMark();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // A worst-case estimate of the space required (in HeapWords) to expand the
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // heap when promoting an obj of size obj_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 size_t expansionSpaceRequired(size_t obj_size) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 FreeChunk* allocateScratch(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // returns true if either the small or large linear allocation buffer is empty.
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
460 bool linearAllocationWouldFail() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // Adjust the chunk for the minimum size. This version is called in
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // most cases in CompactibleFreeListSpace methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
464 inline static size_t adjustObjectSize(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 return (size_t) align_object_size(MAX2(size, (size_t)MinChunkSize));
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // This is a virtual version of adjustObjectSize() that is called
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // only occasionally when the compaction space changes and the type
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // of the new compaction space is is only known to be CompactibleSpace.
a61af66fc99e Initial load
duke
parents:
diff changeset
470 size_t adjust_object_size_v(size_t size) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 return adjustObjectSize(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Minimum size of a free block.
a61af66fc99e Initial load
duke
parents:
diff changeset
474 virtual size_t minimum_free_block_size() const { return MinChunkSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 void removeFreeChunkFromFreeLists(FreeChunk* chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 void addChunkAndRepairOffsetTable(HeapWord* chunk, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
477 bool coalesced);
a61af66fc99e Initial load
duke
parents:
diff changeset
478
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
479 // Support for decisions regarding concurrent collection policy
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
480 bool should_concurrent_collect() const;
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
481
0
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // Support for compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
483 void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
484 void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
485 void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // reset the space to reflect the fact that a compaction of the
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // space has been done.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 virtual void reset_after_compaction();
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Debugging support
a61af66fc99e Initial load
duke
parents:
diff changeset
491 void print() const;
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
492 void print_on(outputStream* st) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
493 void prepare_for_verify();
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4728
diff changeset
494 void verify() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void verifyFreeLists() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void verifyIndexedFreeLists() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void verifyIndexedFreeList(size_t size) const;
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
498 // Verify that the given chunk is in the free lists:
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
499 // i.e. either the binary tree dictionary, the indexed free lists
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
500 // or the linear allocation block.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
501 bool verify_chunk_in_free_list(FreeChunk* fc) const;
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
502 // Verify that the given chunk is the linear allocation block
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
503 bool verify_chunk_is_linear_alloc_block(FreeChunk* fc) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // Do some basic checks on the the free lists.
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3746
diff changeset
505 void check_free_list_consistency() const PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
507 // Printing support
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
508 void dump_at_safepoint_with_locks(CMSCollector* c, outputStream* st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
509 void print_indexed_free_lists(outputStream* st) const;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
510 void print_dictionary_free_lists(outputStream* st) const;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
511 void print_promo_info_blocks(outputStream* st) const;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
512
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 NOT_PRODUCT (
a61af66fc99e Initial load
duke
parents:
diff changeset
514 void initializeIndexedFreeListArrayReturnedBytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
515 size_t sumIndexedFreeListArrayReturnedBytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Return the total number of chunks in the indexed free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
517 size_t totalCountInIndexedFreeLists() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // Return the total numberof chunks in the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
519 size_t totalCount();
a61af66fc99e Initial load
duke
parents:
diff changeset
520 )
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // The census consists of counts of the quantities such as
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // the current count of the free chunks, number of chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // created as a result of the split of a larger chunk or
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // coalescing of smaller chucks, etc. The counts in the
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // census is used to make decisions on splitting and
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // coalescing of chunks during the sweep of garbage.
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // Print the statistics for the free lists.
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
530 void printFLCensus(size_t sweep_count) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // Statistics functions
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // Initialize census for lists before the sweep.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
534 void beginSweepFLCensus(float inter_sweep_current,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
535 float inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
536 float intra_sweep_estimate);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Set the surplus for each of the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void setFLSurplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Set the hint for each of the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
540 void setFLHints();
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // Clear the census for each of the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
542 void clearFLCensus();
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // Perform functions for the census after the end of the sweep.
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
544 void endSweepFLCensus(size_t sweep_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Return true if the count of free chunks is greater
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // than the desired number of free chunks.
a61af66fc99e Initial load
duke
parents:
diff changeset
547 bool coalOverPopulated(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Record (for each size):
a61af66fc99e Initial load
duke
parents:
diff changeset
550 //
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // split-births = #chunks added due to splits in (prev-sweep-end,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // this-sweep-start)
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // split-deaths = #chunks removed for splits in (prev-sweep-end,
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // this-sweep-start)
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // num-curr = #chunks at start of this sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // num-prev = #chunks at end of previous sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
557 //
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // The above are quantities that are measured. Now define:
a61af66fc99e Initial load
duke
parents:
diff changeset
559 //
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // num-desired := num-prev + split-births - split-deaths - num-curr
a61af66fc99e Initial load
duke
parents:
diff changeset
561 //
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // Roughly, num-prev + split-births is the supply,
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // split-deaths is demand due to other sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // and num-curr is what we have left.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 //
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // Thus, num-desired is roughly speaking the "legitimate demand"
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // for blocks of this size and what we are striving to reach at the
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // end of the current sweep.
a61af66fc99e Initial load
duke
parents:
diff changeset
569 //
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // For a given list, let num-len be its current population.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // Define, for a free list of a given size:
a61af66fc99e Initial load
duke
parents:
diff changeset
572 //
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // coal-overpopulated := num-len >= num-desired * coal-surplus
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // (coal-surplus is set to 1.05, i.e. we allow a little slop when
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // coalescing -- we do not coalesce unless we think that the current
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // supply has exceeded the estimated demand by more than 5%).
a61af66fc99e Initial load
duke
parents:
diff changeset
577 //
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // For the set of sizes in the binary tree, which is neither dense nor
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // closed, it may be the case that for a particular size we have never
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // had, or do not now have, or did not have at the previous sweep,
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // chunks of that size. We need to extend the definition of
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // coal-overpopulated to such sizes as well:
a61af66fc99e Initial load
duke
parents:
diff changeset
583 //
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // For a chunk in/not in the binary tree, extend coal-overpopulated
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // defined above to include all sizes as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
586 //
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // . a size that is non-existent is coal-overpopulated
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // . a size that has a num-desired <= 0 as defined above is
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // coal-overpopulated.
a61af66fc99e Initial load
duke
parents:
diff changeset
590 //
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Also define, for a chunk heap-offset C and mountain heap-offset M:
a61af66fc99e Initial load
duke
parents:
diff changeset
592 //
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // close-to-mountain := C >= 0.99 * M
a61af66fc99e Initial load
duke
parents:
diff changeset
594 //
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Now, the coalescing strategy is:
a61af66fc99e Initial load
duke
parents:
diff changeset
596 //
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Coalesce left-hand chunk with right-hand chunk if and
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // only if:
a61af66fc99e Initial load
duke
parents:
diff changeset
599 //
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // EITHER
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // . left-hand chunk is of a size that is coal-overpopulated
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // OR
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // . right-hand chunk is close-to-mountain
a61af66fc99e Initial load
duke
parents:
diff changeset
604 void smallCoalBirth(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 void smallCoalDeath(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 void coalBirth(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 void coalDeath(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void smallSplitBirth(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void smallSplitDeath(size_t size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
610 void split_birth(size_t size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void splitDeath(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void split(size_t from, size_t to1);
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 double flsFrag() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // A parallel-GC-thread-local allocation buffer for allocation into a
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // CompactibleFreeListSpace.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6028
diff changeset
619 class CFLS_LAB : public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // The space that this buffer allocates into.
a61af66fc99e Initial load
duke
parents:
diff changeset
621 CompactibleFreeListSpace* _cfls;
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Our local free lists.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
624 FreeList<FreeChunk> _indexedFreeList[CompactibleFreeListSpace::IndexSetSize];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // Initialized from a command-line arg.
a61af66fc99e Initial load
duke
parents:
diff changeset
627
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
628 // Allocation statistics in support of dynamic adjustment of
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
629 // #blocks to claim per get_from_global_pool() call below.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
630 static AdaptiveWeightedAverage
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
631 _blocks_to_claim [CompactibleFreeListSpace::IndexSetSize];
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
632 static size_t _global_num_blocks [CompactibleFreeListSpace::IndexSetSize];
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4708
diff changeset
633 static uint _global_num_workers[CompactibleFreeListSpace::IndexSetSize];
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
634 size_t _num_blocks [CompactibleFreeListSpace::IndexSetSize];
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
635
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
636 // Internal work method
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
637 void get_from_global_pool(size_t word_sz, FreeList<FreeChunk>* fl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
640 CFLS_LAB(CompactibleFreeListSpace* cfls);
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // Allocate and return a block of the given size, or else return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
643 HeapWord* alloc(size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // Return any unused portions of the buffer to the global pool.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
646 void retire(int tid);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
647
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
648 // Dynamic OldPLABSize sizing
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
649 static void compute_desired_plab_size();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
650 // When the settings are modified from default static initialization
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
651 static void modify_initialization(size_t n, unsigned wt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652 };
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 size_t PromotionInfo::refillSize() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 const size_t CMSSpoolBlockSize = 256;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 const size_t sz = heap_word_size(sizeof(SpoolBlock) + sizeof(markOop)
a61af66fc99e Initial load
duke
parents:
diff changeset
657 * CMSSpoolBlockSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
658 return CompactibleFreeListSpace::adjustObjectSize(sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
660
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
661 #endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP