annotate src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @ 10185:d50cc62e94ff

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