annotate src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @ 20631:a28b7832203a

8060467: CMS: small OldPLABSize and -XX:-ResizePLAB cause assert(ResizePLAB || n_blks == OldPLABSize) failed: Error Reviewed-by: tschatzl, jmasa, kbarrett
author jcoomes
date Fri, 07 Nov 2014 15:34:33 -0800
parents 4001310db3f5
children 9fa3bf3043a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2 * Copyright (c) 2001, 2014, 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: 1959
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
26 #include "gc_implementation/concurrentMarkSweep/cmsLockVerifier.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
27 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
28 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
29 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
30 #include "gc_implementation/shared/liveRange.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
31 #include "gc_implementation/shared/spaceDecorator.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
32 #include "gc_interface/collectedHeap.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
33 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
34 #include "memory/blockOffsetTable.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
35 #include "memory/resourceArea.hpp"
20198
c49dcaf78a65 8042737: Introduce umbrella header prefetch.inline.hpp
goetz
parents: 20197
diff changeset
36 #include "memory/space.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
37 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
38 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
39 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
40 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
41 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
42 #include "runtime/java.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17937
diff changeset
43 #include "runtime/orderAccess.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
44 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1959
diff changeset
45 #include "utilities/copy.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 /////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //// CompactibleFreeListSpace
a61af66fc99e Initial load
duke
parents:
diff changeset
49 /////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // highest ranked free list lock rank
a61af66fc99e Initial load
duke
parents:
diff changeset
52 int CompactibleFreeListSpace::_lockRank = Mutex::leaf + 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
53
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
54 // Defaults are 0 so things will break badly if incorrectly initialized.
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
55 size_t CompactibleFreeListSpace::IndexSetStart = 0;
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
56 size_t CompactibleFreeListSpace::IndexSetStride = 0;
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
57
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
58 size_t MinChunkSize = 0;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
59
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
60 void CompactibleFreeListSpace::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
61 // 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
62 assert(MinChunkSize == 0, "already set");
6104
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
63
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
64 // MinChunkSize should be a multiple of MinObjAlignment and be large enough
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
65 // for chunks to contain a FreeChunk.
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
66 size_t min_chunk_size_in_bytes = align_size_up(sizeof(FreeChunk), MinObjAlignmentInBytes);
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
67 MinChunkSize = min_chunk_size_in_bytes / BytesPerWord;
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
68
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
69 assert(IndexSetStart == 0 && IndexSetStride == 0, "already set");
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
70 IndexSetStart = MinChunkSize;
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
71 IndexSetStride = MinObjAlignment;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
72 }
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1521
diff changeset
73
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
75 CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs,
a61af66fc99e Initial load
duke
parents:
diff changeset
76 MemRegion mr, bool use_adaptive_freelists,
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
77 FreeBlockDictionary<FreeChunk>::DictionaryChoice dictionaryChoice) :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _dictionaryChoice(dictionaryChoice),
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _adaptive_freelists(use_adaptive_freelists),
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _bt(bs, mr),
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // free list locks are in the range of values taken by _lockRank
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // This range currently is [_leaf+2, _leaf+3]
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Note: this requires that CFLspace c'tors
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // are called serially in the order in which the locks are
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // are acquired in the program text. This is true today.
a61af66fc99e Initial load
duke
parents:
diff changeset
86 _freelistLock(_lockRank--, "CompactibleFreeListSpace._lock", true),
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _parDictionaryAllocLock(Mutex::leaf - 1, // == rank(ExpandHeap_lock) - 1
a61af66fc99e Initial load
duke
parents:
diff changeset
88 "CompactibleFreeListSpace._dict_par_lock", true),
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _rescan_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord *
a61af66fc99e Initial load
duke
parents:
diff changeset
90 CMSRescanMultiple),
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _marking_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord *
a61af66fc99e Initial load
duke
parents:
diff changeset
92 CMSConcMarkMultiple),
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _collector(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
94 {
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
95 assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize,
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
96 "FreeChunk is larger than expected");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _bt.set_space(this);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 187
diff changeset
98 initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // We have all of "mr", all of which we place in the dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // as one big chunk. We'll need to decide here which of several
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // possible alternative dictionary implementations to use. For
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // now the choice is easy, since we have only one working
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // implementation, namely, the simple binary tree (splaying
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // temporarily disabled).
a61af66fc99e Initial load
duke
parents:
diff changeset
105 switch (dictionaryChoice) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
106 case FreeBlockDictionary<FreeChunk>::dictionaryBinaryTree:
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
107 _dictionary = new AFLBinaryTreeDictionary(mr);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
108 break;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
109 case FreeBlockDictionary<FreeChunk>::dictionarySplayTree:
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
110 case FreeBlockDictionary<FreeChunk>::dictionarySkipList:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 warning("dictionaryChoice: selected option not understood; using"
a61af66fc99e Initial load
duke
parents:
diff changeset
113 " default BinaryTreeDictionary implementation instead.");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 assert(_dictionary != NULL, "CMS dictionary initialization");
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // The indexed free lists are initially all empty and are lazily
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // filled in on demand. Initialize the array elements to NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 initializeIndexedFreeListArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Not using adaptive free lists assumes that allocation is first
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // from the linAB's. Also a cms perm gen which can be compacted
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // has to have the klass's klassKlass allocated at a lower
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // address in the heap than the klass so that the klassKlass is
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // moved to its new location before the klass is moved.
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Set the _refillSize for the linear allocation blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (!use_adaptive_freelists) {
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
127 FreeChunk* fc = _dictionary->get_chunk(mr.word_size(),
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
128 FreeBlockDictionary<FreeChunk>::atLeast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // The small linAB initially has all the space and will allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // a chunk of any size.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 HeapWord* addr = (HeapWord*) fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _smallLinearAllocBlock.set(addr, fc->size() ,
a61af66fc99e Initial load
duke
parents:
diff changeset
133 1024*SmallForLinearAlloc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Note that _unallocated_block is not updated here.
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Allocations from the linear allocation block should
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // update it.
a61af66fc99e Initial load
duke
parents:
diff changeset
137 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
139 SmallForLinearAlloc);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // CMSIndexedFreeListReplenish should be at least 1
a61af66fc99e Initial load
duke
parents:
diff changeset
142 CMSIndexedFreeListReplenish = MAX2((uintx)1, CMSIndexedFreeListReplenish);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _promoInfo.setSpace(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (UseCMSBestFit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 _fitStrategy = FreeBlockBestFitFirst;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 _fitStrategy = FreeBlockStrategyNone;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
149 check_free_list_consistency();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Initialize locks for parallel case.
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
152
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
153 if (CollectedHeap::use_parallel_gc_threads()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1
a61af66fc99e Initial load
duke
parents:
diff changeset
156 "a freelist par lock",
a61af66fc99e Initial load
duke
parents:
diff changeset
157 true);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 DEBUG_ONLY(
a61af66fc99e Initial load
duke
parents:
diff changeset
159 _indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 )
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 _dictionary->set_par_lock(&_parDictionaryAllocLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Like CompactibleSpace forward() but always calls cross_threshold() to
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // update the block offset table. Removed initialize_threshold call because
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // CFLS does not use a block offset array for contiguous spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
169 HeapWord* CompactibleFreeListSpace::forward(oop q, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
170 CompactPoint* cp, HeapWord* compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // q is alive
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // First check if we should switch compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
173 assert(this == cp->space, "'this' should be current compaction space.");
a61af66fc99e Initial load
duke
parents:
diff changeset
174 size_t compaction_max_size = pointer_delta(end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 assert(adjustObjectSize(size) == cp->space->adjust_object_size_v(size),
a61af66fc99e Initial load
duke
parents:
diff changeset
176 "virtual adjustObjectSize_v() method is not correct");
a61af66fc99e Initial load
duke
parents:
diff changeset
177 size_t adjusted_size = adjustObjectSize(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 assert(compaction_max_size >= MinChunkSize || compaction_max_size == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
179 "no small fragments allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(minimum_free_block_size() == MinChunkSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
181 "for de-virtualized reference below");
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Can't leave a nonzero size, residual fragment smaller than MinChunkSize
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (adjusted_size + MinChunkSize > compaction_max_size &&
a61af66fc99e Initial load
duke
parents:
diff changeset
184 adjusted_size != compaction_max_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // switch to next compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
187 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 cp->space = cp->space->next_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (cp->space == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 cp->gen = GenCollectedHeap::heap()->prev_gen(cp->gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 assert(cp->gen != NULL, "compaction must succeed");
a61af66fc99e Initial load
duke
parents:
diff changeset
192 cp->space = cp->gen->first_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
193 assert(cp->space != NULL, "generation must have a first compaction space");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 compact_top = cp->space->bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // The correct adjusted_size may not be the same as that for this method
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // (i.e., cp->space may no longer be "this" so adjust the size again.
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Use the virtual method which is not used above to save the virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // dispatch.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 adjusted_size = cp->space->adjust_object_size_v(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 compaction_max_size = pointer_delta(cp->space->end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 assert(cp->space->minimum_free_block_size() == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
204 } while (adjusted_size > compaction_max_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // store the forwarding pointer into the mark word
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if ((HeapWord*)q != compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 q->forward_to(oop(compact_top));
a61af66fc99e Initial load
duke
parents:
diff changeset
210 assert(q->is_gc_marked(), "encoding the pointer should preserve the mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // if the object isn't moving we can just set the mark to the default
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // mark and handle it specially later on.
a61af66fc99e Initial load
duke
parents:
diff changeset
214 q->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 assert(q->forwardee() == NULL, "should be forwarded to NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 compact_top += adjusted_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // we need to update the offset table so that the beginnings of objects can be
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // found during scavenge. Note that we are updating the offset table based on
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // where the object will be once the compaction phase finishes.
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Always call cross_threshold(). A contiguous space can only call it when
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // the compaction_top exceeds the current threshold but not for an
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // non-contiguous space.
a61af66fc99e Initial load
duke
parents:
diff changeset
227 cp->threshold =
a61af66fc99e Initial load
duke
parents:
diff changeset
228 cp->space->cross_threshold(compact_top - adjusted_size, compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 return compact_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // A modified copy of OffsetTableContigSpace::cross_threshold() with _offsets -> _bt
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // and use of single_block instead of alloc_block. The name here is not really
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // appropriate - maybe a more general name could be invented for both the
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // contiguous and noncontiguous spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 HeapWord* CompactibleFreeListSpace::cross_threshold(HeapWord* start, HeapWord* the_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 _bt.single_block(start, the_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return end();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Initialize them to NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
243 void CompactibleFreeListSpace::initializeIndexedFreeListArray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 for (size_t i = 0; i < IndexSetSize; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Note that on platforms where objects are double word aligned,
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // the odd array elements are not used. It is convenient, however,
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // to map directly from the object size to the array element.
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _indexedFreeList[i].reset(IndexSetSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 _indexedFreeList[i].set_size(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 assert(_indexedFreeList[i].count() == 0, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
251 assert(_indexedFreeList[i].head() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
252 assert(_indexedFreeList[i].tail() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 void CompactibleFreeListSpace::resetIndexedFreeListArray() {
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
258 for (size_t i = 1; i < IndexSetSize; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 assert(_indexedFreeList[i].size() == (size_t) i,
a61af66fc99e Initial load
duke
parents:
diff changeset
260 "Indexed free list sizes are incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
261 _indexedFreeList[i].reset(IndexSetSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 assert(_indexedFreeList[i].count() == 0, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
263 assert(_indexedFreeList[i].head() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
264 assert(_indexedFreeList[i].tail() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
265 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void CompactibleFreeListSpace::reset(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 resetIndexedFreeListArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 dictionary()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (BlockOffsetArrayUseUnallocatedBlock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 assert(end() == mr.end(), "We are compacting to the bottom of CMS gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Everything's allocated until proven otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _bt.set_unallocated_block(end());
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (!mr.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 assert(mr.word_size() >= MinChunkSize, "Chunk size is too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
279 _bt.single_block(mr.start(), mr.word_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
280 FreeChunk* fc = (FreeChunk*) mr.start();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
281 fc->set_size(mr.word_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (mr.word_size() >= IndexSetSize ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 returnChunkToDictionary(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _bt.verify_not_unallocated((HeapWord*)fc, fc->size());
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
286 _indexedFreeList[mr.word_size()].return_chunk_at_head(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
10331
28e53b8db94f 7066063: CMS: "Conservation Principle" assert failed
brutisso
parents: 7948
diff changeset
288 coalBirth(mr.word_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 _promoInfo.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
291 _smallLinearAllocBlock._ptr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 _smallLinearAllocBlock._word_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void CompactibleFreeListSpace::reset_after_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Reset the space to the new reality - one free chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 MemRegion mr(compaction_top(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
298 reset(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // Now refill the linear allocation block(s) if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (_adaptive_freelists) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 refillLinearAllocBlocksIfNeeded();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // Place as much of mr in the linAB as we can get,
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // provided it was big enough to go into the dictionary.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
305 FreeChunk* fc = dictionary()->find_largest_dict();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 if (fc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 assert(fc->size() == mr.word_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
308 "Why was the chunk broken up?");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 removeChunkFromDictionary(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 HeapWord* addr = (HeapWord*) fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 _smallLinearAllocBlock.set(addr, fc->size() ,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 1024*SmallForLinearAlloc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Note that _unallocated_block is not updated here.
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Walks the entire dictionary, returning a coterminal
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // chunk, if it exists. Use with caution since it involves
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // a potentially complete walk of a potentially large tree.
a61af66fc99e Initial load
duke
parents:
diff changeset
321 FreeChunk* CompactibleFreeListSpace::find_chunk_at_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 assert_lock_strong(&_freelistLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 return dictionary()->find_chunk_ends_at(end());
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
330 void CompactibleFreeListSpace::initializeIndexedFreeListArrayReturnedBytes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
332 _indexedFreeList[i].allocation_stats()->set_returned_bytes(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 size_t CompactibleFreeListSpace::sumIndexedFreeListArrayReturnedBytes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 size_t sum = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
339 sum += _indexedFreeList[i].allocation_stats()->returned_bytes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return sum;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 size_t CompactibleFreeListSpace::totalCountInIndexedFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 size_t count = 0;
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
346 for (size_t i = IndexSetStart; i < IndexSetSize; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 debug_only(
a61af66fc99e Initial load
duke
parents:
diff changeset
348 ssize_t total_list_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 fc = fc->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 total_list_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 assert(total_list_count == _indexedFreeList[i].count(),
a61af66fc99e Initial load
duke
parents:
diff changeset
354 "Count in list is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
355 )
a61af66fc99e Initial load
duke
parents:
diff changeset
356 count += _indexedFreeList[i].count();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 size_t CompactibleFreeListSpace::totalCount() {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 size_t num = totalCountInIndexedFreeLists();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
363 num += dictionary()->total_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if (_smallLinearAllocBlock._word_size != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 num++;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 return num;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool CompactibleFreeListSpace::is_free_block(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 FreeChunk* fc = (FreeChunk*) p;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
373 return fc->is_free();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 size_t CompactibleFreeListSpace::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return capacity() - free();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 size_t CompactibleFreeListSpace::free() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // "MT-safe, but not MT-precise"(TM), if you will: i.e.
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // if you do this while the structures are in flux you
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // may get an approximate answer only; for instance
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // because there is concurrent allocation either
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // directly by mutators or for promotion during a GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // It's "MT-safe", however, in the sense that you are guaranteed
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // not to crash and burn, for instance, because of walking
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // pointers that could disappear as you were walking them.
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // The approximation is because the various components
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // that are read below are not read atomically (and
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // further the computation of totalSizeInIndexedFreeLists()
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // is itself a non-atomic computation. The normal use of
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // this is during a resize operation at the end of GC
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // and at that time you are guaranteed to get the
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // correct actual value. However, for instance, this is
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // also read completely asynchronously by the "perf-sampler"
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // that supports jvmstat, and you are apt to see the values
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // flicker in such cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
399 assert(_dictionary != NULL, "No _dictionary?");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
400 return (_dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())) +
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401 totalSizeInIndexedFreeLists() +
a61af66fc99e Initial load
duke
parents:
diff changeset
402 _smallLinearAllocBlock._word_size) * HeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 size_t CompactibleFreeListSpace::max_alloc_in_words() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 assert(_dictionary != NULL, "No _dictionary?");
a61af66fc99e Initial load
duke
parents:
diff changeset
407 assert_locked();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
408 size_t res = _dictionary->max_chunk_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
409 res = MAX2(res, MIN2(_smallLinearAllocBlock._word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
410 (size_t) SmallForLinearAlloc - 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // XXX the following could potentially be pretty slow;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // should one, pesimally for the rare cases when res
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // caclulated above is less than IndexSetSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // just return res calculated above? My reasoning was that
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // those cases will be so rare that the extra time spent doesn't
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // really matter....
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Note: do not change the loop test i >= res + IndexSetStride
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // to i > res below, because i is unsigned and res may be zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
419 for (size_t i = IndexSetSize - 1; i >= res + IndexSetStride;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 i -= IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (_indexedFreeList[i].head() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList");
a61af66fc99e Initial load
duke
parents:
diff changeset
423 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
429 void LinearAllocBlock::print_on(outputStream* st) const {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
430 st->print_cr(" LinearAllocBlock: ptr = " PTR_FORMAT ", word_size = " SIZE_FORMAT
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
431 ", refillsize = " SIZE_FORMAT ", allocation_size_limit = " SIZE_FORMAT,
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
432 p2i(_ptr), _word_size, _refillSize, _allocation_size_limit);
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
433 }
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
434
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
435 void CompactibleFreeListSpace::print_on(outputStream* st) const {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
436 st->print_cr("COMPACTIBLE FREELIST SPACE");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
437 st->print_cr(" Space:");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
438 Space::print_on(st);
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
439
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
440 st->print_cr("promoInfo:");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
441 _promoInfo.print_on(st);
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
442
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
443 st->print_cr("_smallLinearAllocBlock");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
444 _smallLinearAllocBlock.print_on(st);
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
445
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
446 // dump_memory_block(_smallLinearAllocBlock->_ptr, 128);
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
447
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
448 st->print_cr(" _fitStrategy = %s, _adaptive_freelists = %s",
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
449 _fitStrategy?"true":"false", _adaptive_freelists?"true":"false");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
450 }
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
451
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
452 void CompactibleFreeListSpace::print_indexed_free_lists(outputStream* st)
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
453 const {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
454 reportIndexedFreeListStatistics();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
455 gclog_or_tty->print_cr("Layout of Indexed Freelists");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
456 gclog_or_tty->print_cr("---------------------------");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
457 AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
458 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
459 _indexedFreeList[i].print_on(gclog_or_tty);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
460 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
461 fc = fc->next()) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
462 gclog_or_tty->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
463 p2i(fc), p2i((HeapWord*)fc + i),
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
464 fc->cantCoalesce() ? "\t CC" : "");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
465 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
466 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
467 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
468
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
469 void CompactibleFreeListSpace::print_promo_info_blocks(outputStream* st)
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
470 const {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
471 _promoInfo.print_on(st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
472 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
473
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
474 void CompactibleFreeListSpace::print_dictionary_free_lists(outputStream* st)
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
475 const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
476 _dictionary->report_statistics();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
477 st->print_cr("Layout of Freelists in Tree");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
478 st->print_cr("---------------------------");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
479 _dictionary->print_free_lists(st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
480 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
481
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
482 class BlkPrintingClosure: public BlkClosure {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
483 const CMSCollector* _collector;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
484 const CompactibleFreeListSpace* _sp;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
485 const CMSBitMap* _live_bit_map;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
486 const bool _post_remark;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
487 outputStream* _st;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
488 public:
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
489 BlkPrintingClosure(const CMSCollector* collector,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
490 const CompactibleFreeListSpace* sp,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
491 const CMSBitMap* live_bit_map,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
492 outputStream* st):
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
493 _collector(collector),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
494 _sp(sp),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
495 _live_bit_map(live_bit_map),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
496 _post_remark(collector->abstract_state() > CMSCollector::FinalMarking),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
497 _st(st) { }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
498 size_t do_blk(HeapWord* addr);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
499 };
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
500
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
501 size_t BlkPrintingClosure::do_blk(HeapWord* addr) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
502 size_t sz = _sp->block_size_no_stall(addr, _collector);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
503 assert(sz != 0, "Should always be able to compute a size");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
504 if (_sp->block_is_obj(addr)) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
505 const bool dead = _post_remark && !_live_bit_map->isMarked(addr);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
506 _st->print_cr(PTR_FORMAT ": %s object of size " SIZE_FORMAT "%s",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
507 p2i(addr),
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
508 dead ? "dead" : "live",
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
509 sz,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
510 (!dead && CMSPrintObjectsInDump) ? ":" : ".");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
511 if (CMSPrintObjectsInDump && !dead) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
512 oop(addr)->print_on(_st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
513 _st->print_cr("--------------------------------------");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
514 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
515 } else { // free block
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
516 _st->print_cr(PTR_FORMAT ": free block of size " SIZE_FORMAT "%s",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
517 p2i(addr), sz, CMSPrintChunksInDump ? ":" : ".");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
518 if (CMSPrintChunksInDump) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
519 ((FreeChunk*)addr)->print_on(_st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
520 _st->print_cr("--------------------------------------");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
521 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
522 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
523 return sz;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
524 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
525
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
526 void CompactibleFreeListSpace::dump_at_safepoint_with_locks(CMSCollector* c,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
527 outputStream* st) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
528 st->print_cr("\n=========================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
529 st->print_cr("Block layout in CMS Heap:");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
530 st->print_cr("=========================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
531 BlkPrintingClosure bpcl(c, this, c->markBitMap(), st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
532 blk_iterate(&bpcl);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
533
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
534 st->print_cr("\n=======================================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
535 st->print_cr("Order & Layout of Promotion Info Blocks");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
536 st->print_cr("=======================================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
537 print_promo_info_blocks(st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
538
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
539 st->print_cr("\n===========================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
540 st->print_cr("Order of Indexed Free Lists");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
541 st->print_cr("=========================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
542 print_indexed_free_lists(st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
543
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
544 st->print_cr("\n=================================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
545 st->print_cr("Order of Free Lists in Dictionary");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
546 st->print_cr("=================================");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
547 print_dictionary_free_lists(st);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
548 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
549
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
550
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void CompactibleFreeListSpace::reportFreeListStatistics() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 assert_lock_strong(&_freelistLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 assert(PrintFLSStatistics != 0, "Reporting error");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
554 _dictionary->report_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555 if (PrintFLSStatistics > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 reportIndexedFreeListStatistics();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
557 size_t total_size = totalSizeInIndexedFreeLists() +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
558 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock()));
7623
203f64878aab 7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents: 6885
diff changeset
559 gclog_or_tty->print(" free=" SIZE_FORMAT " frag=%1.4f\n", total_size, flsFrag());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 void CompactibleFreeListSpace::reportIndexedFreeListStatistics() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 assert_lock_strong(&_freelistLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 gclog_or_tty->print("Statistics for IndexedFreeLists:\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
566 "--------------------------------\n");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
567 size_t total_size = totalSizeInIndexedFreeLists();
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
568 size_t free_blocks = numFreeBlocksInIndexedFreeLists();
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
569 gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size);
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
570 gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", maxChunkSizeInIndexedFreeLists());
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
571 gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
572 if (free_blocks != 0) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
573 gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 size_t CompactibleFreeListSpace::numFreeBlocksInIndexedFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 size_t res = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
579 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 debug_only(
a61af66fc99e Initial load
duke
parents:
diff changeset
581 ssize_t recount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 fc = fc->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 recount += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 assert(recount == _indexedFreeList[i].count(),
a61af66fc99e Initial load
duke
parents:
diff changeset
587 "Incorrect count in list");
a61af66fc99e Initial load
duke
parents:
diff changeset
588 )
a61af66fc99e Initial load
duke
parents:
diff changeset
589 res += _indexedFreeList[i].count();
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 size_t CompactibleFreeListSpace::maxChunkSizeInIndexedFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 for (size_t i = IndexSetSize - 1; i != 0; i -= IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if (_indexedFreeList[i].head() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList");
a61af66fc99e Initial load
duke
parents:
diff changeset
598 return (size_t)i;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 void CompactibleFreeListSpace::set_end(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 HeapWord* prevEnd = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
606 assert(prevEnd != value, "unnecessary set_end call");
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
607 assert(prevEnd == NULL || !BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(),
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
608 "New end is below unallocated block");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
609 _end = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (prevEnd != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Resize the underlying block offset table.
a61af66fc99e Initial load
duke
parents:
diff changeset
612 _bt.resize(pointer_delta(value, bottom()));
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
613 if (value <= prevEnd) {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
614 assert(!BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(),
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
615 "New end is below unallocated block");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
616 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
617 // Now, take this new chunk and add it to the free blocks.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
618 // Note that the BOT has not yet been updated for this block.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
619 size_t newFcSize = pointer_delta(value, prevEnd);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
620 // XXX This is REALLY UGLY and should be fixed up. XXX
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
621 if (!_adaptive_freelists && _smallLinearAllocBlock._ptr == NULL) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
622 // Mark the boundary of the new block in BOT
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
623 _bt.mark_block(prevEnd, value);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
624 // put it all in the linAB
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
625 if (ParallelGCThreads == 0) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
626 _smallLinearAllocBlock._ptr = prevEnd;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
627 _smallLinearAllocBlock._word_size = newFcSize;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
628 repairLinearAllocBlock(&_smallLinearAllocBlock);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
629 } else { // ParallelGCThreads > 0
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
630 MutexLockerEx x(parDictionaryAllocLock(),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
631 Mutex::_no_safepoint_check_flag);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
632 _smallLinearAllocBlock._ptr = prevEnd;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
633 _smallLinearAllocBlock._word_size = newFcSize;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
634 repairLinearAllocBlock(&_smallLinearAllocBlock);
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 // Births of chunks put into a LinAB are not recorded. Births
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
637 // of chunks as they are allocated out of a LinAB are.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
638 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
639 // Add the block to the free lists, if possible coalescing it
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
640 // with the last free block, and update the BOT and census data.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
641 addChunkToFreeListsAtEndRecordingStats(prevEnd, newFcSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 class FreeListSpace_DCTOC : public Filtering_DCTOC {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 CompactibleFreeListSpace* _cfls;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
652 #define walk_mem_region_with_cl_DECL(ClosureType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
653 virtual void walk_mem_region_with_cl(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
654 HeapWord* bottom, HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
655 ClosureType* cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
656 void walk_mem_region_with_cl_par(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
657 HeapWord* bottom, HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ClosureType* cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
659 void walk_mem_region_with_cl_nopar(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
660 HeapWord* bottom, HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
661 ClosureType* cl)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
662 walk_mem_region_with_cl_DECL(ExtendedOopClosure);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 walk_mem_region_with_cl_DECL(FilteringClosure);
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
666 FreeListSpace_DCTOC(CompactibleFreeListSpace* sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
667 CMSCollector* collector,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
668 ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
670 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
671 Filtering_DCTOC(sp, cl, precision, boundary),
a61af66fc99e Initial load
duke
parents:
diff changeset
672 _cfls(sp), _collector(collector) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
673 };
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // We de-virtualize the block-related calls below, since we know that our
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // space is a CompactibleFreeListSpace.
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
677
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 #define FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ClosureType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
679 void FreeListSpace_DCTOC::walk_mem_region_with_cl(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
680 HeapWord* bottom, \
a61af66fc99e Initial load
duke
parents:
diff changeset
681 HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
682 ClosureType* cl) { \
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
683 bool is_par = SharedHeap::heap()->n_par_threads() > 0; \
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
684 if (is_par) { \
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
685 assert(SharedHeap::heap()->n_par_threads() == \
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
686 SharedHeap::heap()->workers()->active_workers(), "Mismatch"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 walk_mem_region_with_cl_par(mr, bottom, top, cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
688 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
689 walk_mem_region_with_cl_nopar(mr, bottom, top, cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
690 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
691 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void FreeListSpace_DCTOC::walk_mem_region_with_cl_par(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
693 HeapWord* bottom, \
a61af66fc99e Initial load
duke
parents:
diff changeset
694 HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
695 ClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
696 /* Skip parts that are before "mr", in case "block_start" sent us \
a61af66fc99e Initial load
duke
parents:
diff changeset
697 back too far. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
698 HeapWord* mr_start = mr.start(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
699 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
700 HeapWord* next = bottom + bot_size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
701 while (next < mr_start) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
702 bottom = next; \
a61af66fc99e Initial load
duke
parents:
diff changeset
703 bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
704 next = bottom + bot_size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
705 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
706 \
a61af66fc99e Initial load
duke
parents:
diff changeset
707 while (bottom < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (_cfls->CompactibleFreeListSpace::block_is_obj(bottom) && \
a61af66fc99e Initial load
duke
parents:
diff changeset
709 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \
a61af66fc99e Initial load
duke
parents:
diff changeset
710 oop(bottom)) && \
a61af66fc99e Initial load
duke
parents:
diff changeset
711 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
712 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
713 bottom += _cfls->adjustObjectSize(word_sz); \
a61af66fc99e Initial load
duke
parents:
diff changeset
714 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
715 bottom += _cfls->CompactibleFreeListSpace::block_size(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
716 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
717 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
718 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
719 void FreeListSpace_DCTOC::walk_mem_region_with_cl_nopar(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
720 HeapWord* bottom, \
a61af66fc99e Initial load
duke
parents:
diff changeset
721 HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
722 ClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
723 /* Skip parts that are before "mr", in case "block_start" sent us \
a61af66fc99e Initial load
duke
parents:
diff changeset
724 back too far. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
725 HeapWord* mr_start = mr.start(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
726 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
727 HeapWord* next = bottom + bot_size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
728 while (next < mr_start) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
729 bottom = next; \
a61af66fc99e Initial load
duke
parents:
diff changeset
730 bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
731 next = bottom + bot_size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
732 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
733 \
a61af66fc99e Initial load
duke
parents:
diff changeset
734 while (bottom < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
735 if (_cfls->CompactibleFreeListSpace::block_is_obj_nopar(bottom) && \
a61af66fc99e Initial load
duke
parents:
diff changeset
736 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \
a61af66fc99e Initial load
duke
parents:
diff changeset
737 oop(bottom)) && \
a61af66fc99e Initial load
duke
parents:
diff changeset
738 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
739 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
740 bottom += _cfls->adjustObjectSize(word_sz); \
a61af66fc99e Initial load
duke
parents:
diff changeset
741 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
742 bottom += _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \
a61af66fc99e Initial load
duke
parents:
diff changeset
743 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
744 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // (There are only two of these, rather than N, because the split is due
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // only to the introduction of the FilteringClosure, a local part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // impl of this abstraction.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
750 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ExtendedOopClosure)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(FilteringClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 DirtyCardToOopClosure*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
754 CompactibleFreeListSpace::new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
756 HeapWord* boundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 return new FreeListSpace_DCTOC(this, _collector, cl, precision, boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Note on locking for the space iteration functions:
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // since the collector's iteration activities are concurrent with
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // allocation activities by mutators, absent a suitable mutual exclusion
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // mechanism the iterators may go awry. For instace a block being iterated
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // may suddenly be allocated or divided up and part of it allocated and
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // so on.
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // Apply the given closure to each block in the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
769 void CompactibleFreeListSpace::blk_iterate_careful(BlkClosureCareful* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
771 HeapWord *cur, *limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 for (cur = bottom(), limit = end(); cur < limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 cur += cl->do_blk_careful(cur));
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // Apply the given closure to each block in the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void CompactibleFreeListSpace::blk_iterate(BlkClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
779 HeapWord *cur, *limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 for (cur = bottom(), limit = end(); cur < limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 cur += cl->do_blk(cur));
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784 // Apply the given closure to each oop in the space.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
785 void CompactibleFreeListSpace::oop_iterate(ExtendedOopClosure* cl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
786 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
787 HeapWord *cur, *limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
788 size_t curSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 for (cur = bottom(), limit = end(); cur < limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 cur += curSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
791 curSize = block_size(cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if (block_is_obj(cur)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 oop(cur)->oop_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 // NOTE: In the following methods, in order to safely be able to
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // apply the closure to an object, we need to be sure that the
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // object has been initialized. We are guaranteed that an object
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // is initialized if we are holding the Heap_lock with the
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // world stopped.
a61af66fc99e Initial load
duke
parents:
diff changeset
803 void CompactibleFreeListSpace::verify_objects_initialized() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 if (is_init_completed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 assert_locked_or_safepoint(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
806 if (Universe::is_fully_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
807 guarantee(SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
808 "Required for objects to be initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810 } // else make a concession at vm start-up
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // Apply the given closure to each object in the space
a61af66fc99e Initial load
duke
parents:
diff changeset
814 void CompactibleFreeListSpace::object_iterate(ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
816 NOT_PRODUCT(verify_objects_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
817 HeapWord *cur, *limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 size_t curSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 for (cur = bottom(), limit = end(); cur < limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
820 cur += curSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 curSize = block_size(cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (block_is_obj(cur)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 blk->do_object(oop(cur));
a61af66fc99e Initial load
duke
parents:
diff changeset
824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
828 // Apply the given closure to each live object in the space
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
829 // The usage of CompactibleFreeListSpace
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
830 // by the ConcurrentMarkSweepGeneration for concurrent GC's allows
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
831 // objects in the space with references to objects that are no longer
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
832 // valid. For example, an object may reference another object
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
833 // that has already been sweep up (collected). This method uses
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
834 // obj_is_alive() to determine whether it is safe to apply the closure to
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
835 // an object. See obj_is_alive() for details on how liveness of an
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
836 // object is decided.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
837
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
838 void CompactibleFreeListSpace::safe_object_iterate(ObjectClosure* blk) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
839 assert_lock_strong(freelistLock());
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
840 NOT_PRODUCT(verify_objects_initialized());
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
841 HeapWord *cur, *limit;
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
842 size_t curSize;
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
843 for (cur = bottom(), limit = end(); cur < limit;
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
844 cur += curSize) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
845 curSize = block_size(cur);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
846 if (block_is_obj(cur) && obj_is_alive(cur)) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
847 blk->do_object(oop(cur));
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
848 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
849 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
850 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 360
diff changeset
851
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void CompactibleFreeListSpace::object_iterate_mem(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
853 UpwardsObjectClosure* cl) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
854 assert_locked(freelistLock());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
855 NOT_PRODUCT(verify_objects_initialized());
20265
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
856 assert(!mr.is_empty(), "Should be non-empty");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
857 // We use MemRegion(bottom(), end()) rather than used_region() below
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
858 // because the two are not necessarily equal for some kinds of
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
859 // spaces, in particular, certain kinds of free list spaces.
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
860 // We could use the more complicated but more precise:
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
861 // MemRegion(used_region().start(), round_to(used_region().end(), CardSize))
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
862 // but the slight imprecision seems acceptable in the assertion check.
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
863 assert(MemRegion(bottom(), end()).contains(mr),
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
864 "Should be within used space");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
865 HeapWord* prev = cl->previous(); // max address from last time
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
866 if (prev >= mr.end()) { // nothing to do
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
867 return;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
868 }
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
869 // This assert will not work when we go from cms space to perm
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
870 // space, and use same closure. Easy fix deferred for later. XXX YSR
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
871 // assert(prev == NULL || contains(prev), "Should be within space");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
872
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
873 bool last_was_obj_array = false;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
874 HeapWord *blk_start_addr, *region_start_addr;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
875 if (prev > mr.start()) {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
876 region_start_addr = prev;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
877 blk_start_addr = prev;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
878 // The previous invocation may have pushed "prev" beyond the
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
879 // last allocated block yet there may be still be blocks
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
880 // in this region due to a particular coalescing policy.
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
881 // Relax the assertion so that the case where the unallocated
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
882 // block is maintained and "prev" is beyond the unallocated
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
883 // block does not cause the assertion to fire.
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
884 assert((BlockOffsetArrayUseUnallocatedBlock &&
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
885 (!is_in(prev))) ||
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
886 (blk_start_addr == block_start(region_start_addr)), "invariant");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
887 } else {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
888 region_start_addr = mr.start();
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
889 blk_start_addr = block_start(region_start_addr);
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
890 }
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
891 HeapWord* region_end_addr = mr.end();
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
892 MemRegion derived_mr(region_start_addr, region_end_addr);
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
893 while (blk_start_addr < region_end_addr) {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
894 const size_t size = block_size(blk_start_addr);
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
895 if (block_is_obj(blk_start_addr)) {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
896 last_was_obj_array = cl->do_object_bm(oop(blk_start_addr), derived_mr);
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
897 } else {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
898 last_was_obj_array = false;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
899 }
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
900 blk_start_addr += size;
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
901 }
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
902 if (!last_was_obj_array) {
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
903 assert((bottom() <= blk_start_addr) && (blk_start_addr <= end()),
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
904 "Should be within (closed) used space");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
905 assert(blk_start_addr > prev, "Invariant");
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
906 cl->set_previous(blk_start_addr); // min address for next time
5255b195f828 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 20264
diff changeset
907 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // Callers of this iterator beware: The closure application should
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // be robust in the face of uninitialized objects and should (always)
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // return a correct size so that the next addr + size below gives us a
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // valid block boundary. [See for instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // ScanMarkedObjectsAgainCarefullyClosure::do_object_careful()
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // in ConcurrentMarkSweepGeneration.cpp.]
a61af66fc99e Initial load
duke
parents:
diff changeset
917 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
918 CompactibleFreeListSpace::object_iterate_careful_m(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
919 ObjectClosureCareful* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // Can't use used_region() below because it may not necessarily
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // be the same as [bottom(),end()); although we could
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // use [used_region().start(),round_to(used_region().end(),CardSize)),
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // that appears too cumbersome, so we just do the simpler check
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // in the assertion below.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 assert(!mr.is_empty() && MemRegion(bottom(),end()).contains(mr),
a61af66fc99e Initial load
duke
parents:
diff changeset
927 "mr should be non-empty and within used space");
a61af66fc99e Initial load
duke
parents:
diff changeset
928 HeapWord *addr, *end;
a61af66fc99e Initial load
duke
parents:
diff changeset
929 size_t size;
a61af66fc99e Initial load
duke
parents:
diff changeset
930 for (addr = block_start_careful(mr.start()), end = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
931 addr < end; addr += size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 FreeChunk* fc = (FreeChunk*)addr;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
933 if (fc->is_free()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // Since we hold the free list lock, which protects direct
a61af66fc99e Initial load
duke
parents:
diff changeset
935 // allocation in this generation by mutators, a free object
a61af66fc99e Initial load
duke
parents:
diff changeset
936 // will remain free throughout this iteration code.
a61af66fc99e Initial load
duke
parents:
diff changeset
937 size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
938 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Note that the object need not necessarily be initialized,
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // because (for instance) the free list lock does NOT protect
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // object initialization. The closure application below must
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // therefore be correct in the face of uninitialized objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
943 size = cl->do_object_careful_m(oop(addr), mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
944 if (size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // An unparsable object found. Signal early termination.
a61af66fc99e Initial load
duke
parents:
diff changeset
946 return addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
954 HeapWord* CompactibleFreeListSpace::block_start_const(const void* p) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
955 NOT_PRODUCT(verify_objects_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
956 return _bt.block_start(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
957 }
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 HeapWord* CompactibleFreeListSpace::block_start_careful(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
960 return _bt.block_start_careful(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
962
a61af66fc99e Initial load
duke
parents:
diff changeset
963 size_t CompactibleFreeListSpace::block_size(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
964 NOT_PRODUCT(verify_objects_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // This must be volatile, or else there is a danger that the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // will compile the code below into a sometimes-infinite loop, by keeping
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // the value read the first time in a register.
a61af66fc99e Initial load
duke
parents:
diff changeset
968 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // We must do this until we get a consistent view of the object.
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
970 if (FreeChunk::indicatesFreeChunk(p)) {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
971 volatile FreeChunk* fc = (volatile FreeChunk*)p;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
972 size_t res = fc->size();
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
973
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
974 // Bugfix for systems with weak memory model (PPC64/IA64). The
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
975 // block's free bit was set and we have read the size of the
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
976 // block. Acquire and check the free bit again. If the block is
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
977 // still free, the read size is correct.
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
978 OrderAccess::acquire();
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
979
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
980 // If the object is still a free chunk, return the size, else it
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
981 // has been allocated so try again.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
982 if (FreeChunk::indicatesFreeChunk(p)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
983 assert(res != 0, "Block size should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
984 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
986 } else {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
987 // must read from what 'p' points to in each loop.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
988 Klass* k = ((volatile oopDesc*)p)->klass_or_null();
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
989 if (k != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
990 assert(k->is_klass(), "Should really be klass oop.");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
991 oop o = (oop)p;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
992 assert(o->is_oop(true /* ignore mark word */), "Should be an oop.");
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
993
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
994 // Bugfix for systems with weak memory model (PPC64/IA64).
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
995 // The object o may be an array. Acquire to make sure that the array
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
996 // size (third word) is consistent.
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
997 OrderAccess::acquire();
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
998
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
999 size_t res = o->size_given_klass(k);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1000 res = adjustObjectSize(res);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1001 assert(res != 0, "Block size should not be 0");
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1002 return res;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1003 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1008 // TODO: Now that is_parsable is gone, we should combine these two functions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // A variant of the above that uses the Printezis bits for
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // unparsable but allocated objects. This avoids any possible
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // stalls waiting for mutators to initialize objects, and is
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // thus potentially faster than the variant above. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 // this variant may return a zero size for a block that is
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // under mutation and for which a consistent size cannot be
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // inferred without stalling; see CMSCollector::block_size_if_printezis_bits().
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 size_t CompactibleFreeListSpace::block_size_no_stall(HeapWord* p,
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 const CMSCollector* c)
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 assert(MemRegion(bottom(), end()).contains(p), "p not in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // This must be volatile, or else there is a danger that the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // will compile the code below into a sometimes-infinite loop, by keeping
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // the value read the first time in a register.
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 DEBUG_ONLY(uint loops = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // We must do this until we get a consistent view of the object.
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1026 if (FreeChunk::indicatesFreeChunk(p)) {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1027 volatile FreeChunk* fc = (volatile FreeChunk*)p;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1028 size_t res = fc->size();
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1029
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1030 // Bugfix for systems with weak memory model (PPC64/IA64). The
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1031 // free bit of the block was set and we have read the size of
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1032 // the block. Acquire and check the free bit again. If the
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1033 // block is still free, the read size is correct.
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1034 OrderAccess::acquire();
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1035
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1036 if (FreeChunk::indicatesFreeChunk(p)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 assert(res != 0, "Block size should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 assert(loops == 0, "Should be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 } else {
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1042 // must read from what 'p' points to in each loop.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1043 Klass* k = ((volatile oopDesc*)p)->klass_or_null();
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 1972
diff changeset
1044 // We trust the size of any object that has a non-NULL
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 1972
diff changeset
1045 // klass and (for those in the perm gen) is parsable
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 1972
diff changeset
1046 // -- irrespective of its conc_safe-ty.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1047 if (k != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1048 assert(k->is_klass(), "Should really be klass oop.");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1049 oop o = (oop)p;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1050 assert(o->is_oop(), "Should be an oop");
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1051
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1052 // Bugfix for systems with weak memory model (PPC64/IA64).
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1053 // The object o may be an array. Acquire to make sure that the array
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1054 // size (third word) is consistent.
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1055 OrderAccess::acquire();
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 11096
diff changeset
1056
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1057 size_t res = o->size_given_klass(k);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1058 res = adjustObjectSize(res);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1059 assert(res != 0, "Block size should not be 0");
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1060 return res;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1061 } else {
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 1972
diff changeset
1062 // May return 0 if P-bits not present.
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1063 return c->block_size_if_printezis_bits(p);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1064 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 assert(loops == 0, "Can loop at most once");
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 DEBUG_ONLY(loops++;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 size_t CompactibleFreeListSpace::block_size_nopar(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 NOT_PRODUCT(verify_objects_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 assert(MemRegion(bottom(), end()).contains(p), "p not in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 FreeChunk* fc = (FreeChunk*)p;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1075 if (fc->is_free()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 return fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Ignore mark word because this may be a recently promoted
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // object whose mark word is used to chain together grey
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // objects (the last one would have a null value).
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 assert(oop(p)->is_oop(true), "Should be an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 return adjustObjectSize(oop(p)->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // This implementation assumes that the property of "being an object" is
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // stable. But being a free chunk may not be (because of parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // promotion.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 bool CompactibleFreeListSpace::block_is_obj(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 FreeChunk* fc = (FreeChunk*)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 assert(is_in_reserved(p), "Should be in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // When doing a mark-sweep-compact of the CMS generation, this
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // assertion may fail because prepare_for_compaction() uses
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // space that is garbage to maintain information on ranges of
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // live objects so that these live ranges can be moved as a whole.
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // Comment out this assertion until that problem can be solved
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // (i.e., that the block start calculation may look at objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // at address below "p" in finding the object that contains "p"
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // and those objects (if garbage) may have been modified to hold
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // live range information.
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
1101 // assert(CollectedHeap::use_parallel_gc_threads() || _bt.block_start(p) == p,
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
1102 // "Should be a block boundary");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1103 if (FreeChunk::indicatesFreeChunk(p)) return false;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
1104 Klass* k = oop(p)->klass_or_null();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // Ignore mark word because it may have been used to
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // chain together promoted objects (the last one
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // would have a null value).
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 assert(oop(p)->is_oop(true), "Should be an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 return false; // Was not an object at the start of collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // Check if the object is alive. This fact is checked either by consulting
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // the main marking bitmap in the sweeping phase or, if it's a permanent
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // generation and we're not in the sweeping phase, by checking the
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // perm_gen_verify_bit_map where we store the "deadness" information if
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // we did not sweep the perm gen in the most recent previous GC cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 bool CompactibleFreeListSpace::obj_is_alive(const HeapWord* p) const {
1959
9eecf81a02fb 7000578: CMS: assert(SafepointSynchronize::is_at_safepoint()) failed: Else races are possible
ysr
parents: 1952
diff changeset
1122 assert(SafepointSynchronize::is_at_safepoint() || !is_init_completed(),
9eecf81a02fb 7000578: CMS: assert(SafepointSynchronize::is_at_safepoint()) failed: Else races are possible
ysr
parents: 1952
diff changeset
1123 "Else races are possible");
1951
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1124 assert(block_is_obj(p), "The address should point to an object");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // If we're sweeping, we use object liveness information from the main bit map
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // for both perm gen and old gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 // We don't need to lock the bitmap (live_map or dead_map below), because
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // EITHER we are in the middle of the sweeping phase, and the
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // main marking bit map (live_map below) is locked,
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // OR we're in other phases and perm_gen_verify_bit_map (dead_map below)
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // is stable, because it's mutated only in the sweeping phase.
1951
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1133 // NOTE: This method is also used by jmap where, if class unloading is
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1134 // off, the results can return "false" for legitimate perm objects,
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1135 // when we are not in the midst of a sweeping phase, which can result
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1136 // in jmap not reporting certain perm gen objects. This will be moot
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1137 // if/when the perm gen goes away in the future.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 if (_collector->abstract_state() == CMSCollector::Sweeping) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 CMSBitMap* live_map = _collector->markBitMap();
1951
899bbbdcb6ea 6997298: fatal error: must own lock CMS_markBitMap_lock during heap dump
ysr
parents: 1833
diff changeset
1140 return live_map->par_isMarked((HeapWord*) p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 bool CompactibleFreeListSpace::block_is_obj_nopar(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 FreeChunk* fc = (FreeChunk*)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 assert(is_in_reserved(p), "Should be in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 assert(_bt.block_start(p) == p, "Should be a block boundary");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1149 if (!fc->is_free()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // Ignore mark word because it may have been used to
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // chain together promoted objects (the last one
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // would have a null value).
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 assert(oop(p)->is_oop(true), "Should be an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 // "MT-safe but not guaranteed MT-precise" (TM); you may get an
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // approximate answer if you don't hold the freelistlock when you call this.
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 size_t CompactibleFreeListSpace::totalSizeInIndexedFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 size_t size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 debug_only(
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 // We may be calling here without the lock in which case we
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // won't do this modest sanity check.
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 if (freelistLock()->owned_by_self()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 size_t total_list_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 fc = fc->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 total_list_size += i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 assert(total_list_size == i * _indexedFreeList[i].count(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 "Count in list is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 size += i * _indexedFreeList[i].count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 HeapWord* CompactibleFreeListSpace::par_allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 return allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlockRemainder(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 return getChunkFromLinearAllocBlockRemainder(&_smallLinearAllocBlock, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 HeapWord* CompactibleFreeListSpace::allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 HeapWord* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 assert(size == adjustObjectSize(size),
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 "use adjustObjectSize() before calling into allocate()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 if (_adaptive_freelists) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 res = allocate_adaptive_freelists(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 } else { // non-adaptive free lists
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 res = allocate_non_adaptive_freelists(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 if (res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 // check that res does lie in this space!
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 assert(is_in_reserved(res), "Not in this space!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 assert(is_aligned((void*)res), "alignment check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 FreeChunk* fc = (FreeChunk*)res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 fc->markNotFree();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1211 assert(!fc->is_free(), "shouldn't be marked free");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
1212 assert(oop(fc)->klass_or_null() == NULL, "should look uninitialized");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // Verify that the block offset table shows this to
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // be a single block, but not one which is unallocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 _bt.verify_single_block(res, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 _bt.verify_not_unallocated(res, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // mangle a just allocated object with a distinct pattern.
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 debug_only(fc->mangleAllocated(size));
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 HeapWord* CompactibleFreeListSpace::allocate_non_adaptive_freelists(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 HeapWord* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // try and use linear allocation for smaller blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 if (size < _smallLinearAllocBlock._allocation_size_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // if successful, the following also adjusts block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 res = getChunkFromSmallLinearAllocBlock(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // Else triage to indexed lists for smaller sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 if (res == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 res = (HeapWord*) getChunkFromIndexedFreeList(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // else get it from the big dictionary; if even this doesn't
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // work we are out of luck.
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 res = (HeapWord*)getChunkFromDictionaryExact(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 HeapWord* CompactibleFreeListSpace::allocate_adaptive_freelists(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 assert_lock_strong(freelistLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 HeapWord* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 assert(size == adjustObjectSize(size),
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 "use adjustObjectSize() before calling into allocate()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // Strategy
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // if small
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // exact size from small object indexed list if small
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 // small or large linear allocation block (linAB) as appropriate
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // take from lists of greater sized chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // else
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 // dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 // small or large linear allocation block if it has the space
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 // Try allocating exact size from indexTable first
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 if (size < IndexSetSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 res = (HeapWord*) getChunkFromIndexedFreeList(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 if(res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 assert(res != (HeapWord*)_indexedFreeList[size].head(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 "Not removed from free list");
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 // no block offset table adjustment is necessary on blocks in
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // the indexed lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 // Try allocating from the small LinAB
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 } else if (size < _smallLinearAllocBlock._allocation_size_limit &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 (res = getChunkFromSmallLinearAllocBlock(size)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // if successful, the above also adjusts block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // Note that this call will refill the LinAB to
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // satisfy the request. This is different that
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 // evm.
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // Don't record chunk off a LinAB? smallSplitBirth(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // Raid the exact free lists larger than size, even if they are not
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 // overpopulated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 res = (HeapWord*) getChunkFromGreater(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // Big objects get allocated directly from the dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 res = (HeapWord*) getChunkFromDictionaryExact(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 if (res == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // Try hard not to fail since an allocation failure will likely
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 // trigger a synchronous GC. Try to get the space from the
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 // allocation blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 res = getChunkFromSmallLinearAllocBlockRemainder(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 // A worst-case estimate of the space required (in HeapWords) to expand the heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 // when promoting obj.
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 size_t CompactibleFreeListSpace::expansionSpaceRequired(size_t obj_size) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // Depending on the object size, expansion may require refilling either a
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 // bigLAB or a smallLAB plus refilling a PromotionInfo object. MinChunkSize
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // is added because the dictionary may over-allocate to avoid fragmentation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 size_t space = obj_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 if (!_adaptive_freelists) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 space = MAX2(space, _smallLinearAllocBlock._refillSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 space += _promoInfo.refillSize() + 2 * MinChunkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 return space;
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 FreeChunk* CompactibleFreeListSpace::getChunkFromGreater(size_t numWords) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 FreeChunk* ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1311
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 assert(numWords >= MinChunkSize, "Size is less than minimum");
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 assert(linearAllocationWouldFail() || bestFitFirst(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 "Should not be here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 size_t i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 size_t currSize = numWords + MinChunkSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 assert(currSize % MinObjAlignment == 0, "currSize should be aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 for (i = currSize; i < IndexSetSize; i += IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1320 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 if (fl->head()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 ret = getFromListGreater(fl, numWords);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1323 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1327
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 currSize = MAX2((size_t)SmallForDictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 (size_t)(numWords + MinChunkSize));
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 /* Try to get a chunk that satisfies request, while avoiding
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 fragmentation that can't be handled. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1334 ret = dictionary()->get_chunk(currSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 if (ret != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 assert(ret->size() - numWords >= MinChunkSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 "Chunk is too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 _bt.allocated((HeapWord*)ret, ret->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 /* Carve returned chunk. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 (void) splitChunkAndReturnRemainder(ret, numWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 /* Label this as no longer a free chunk. */
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1342 assert(ret->is_free(), "This chunk should be free");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1343 ret->link_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1345 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1350
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1351 bool CompactibleFreeListSpace::verifyChunkInIndexedFreeLists(FreeChunk* fc) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 assert(fc->size() < IndexSetSize, "Size of chunk is too large");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1353 return _indexedFreeList[fc->size()].verify_chunk_in_free_list(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1356 bool CompactibleFreeListSpace::verify_chunk_is_linear_alloc_block(FreeChunk* fc) const {
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1357 assert((_smallLinearAllocBlock._ptr != (HeapWord*)fc) ||
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1358 (_smallLinearAllocBlock._word_size == fc->size()),
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1359 "Linear allocation block shows incorrect size");
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1360 return ((_smallLinearAllocBlock._ptr == (HeapWord*)fc) &&
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1361 (_smallLinearAllocBlock._word_size == fc->size()));
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1362 }
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1363
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1364 // Check if the purported free chunk is present either as a linear
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1365 // allocation block, the size-indexed table of (smaller) free blocks,
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1366 // or the larger free blocks kept in the binary tree dictionary.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1367 bool CompactibleFreeListSpace::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: 3761
diff changeset
1368 if (verify_chunk_is_linear_alloc_block(fc)) {
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1369 return true;
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1370 } else if (fc->size() < IndexSetSize) {
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1371 return verifyChunkInIndexedFreeLists(fc);
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
1372 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1373 return dictionary()->verify_chunk_in_free_list(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1376
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 void CompactibleFreeListSpace::assert_locked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 CMSLockVerifier::assert_locked(freelistLock(), parDictionaryAllocLock());
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1381
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1382 void CompactibleFreeListSpace::assert_locked(const Mutex* lock) const {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1383 CMSLockVerifier::assert_locked(lock);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1384 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 FreeChunk* CompactibleFreeListSpace::allocateScratch(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // In the parallel case, the main thread holds the free list lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // on behalf the parallel threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 FreeChunk* fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // If GC is parallel, this might be called by several threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // This should be rare enough that the locking overhead won't affect
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // the sequential code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 MutexLockerEx x(parDictionaryAllocLock(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 fc = getChunkFromDictionary(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 if (fc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 fc->dontCoalesce();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1401 assert(fc->is_free(), "Should be free, but not coalescable");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 // Verify that the block offset table shows this to
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 // be a single block, but not one which is unallocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 _bt.verify_single_block((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 _bt.verify_not_unallocated((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
1410 oop CompactibleFreeListSpace::promote(oop obj, size_t obj_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // if we are tracking promotions, then first ensure space for
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // promotion (including spooling space for saving header if necessary).
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 // then allocate and copy, then track promoted info if needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // When tracking (see PromotionInfo::track()), the mark word may
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // be displaced and in this case restoration of the mark word
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // occurs in the (oop_since_save_marks_)iterate phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 if (_promoInfo.tracking() && !_promoInfo.ensure_spooling_space()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // Call the allocate(size_t, bool) form directly to avoid the
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 // additional call through the allocate(size_t) form. Having
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 // the compile inline the call is problematic because allocate(size_t)
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // is a virtual method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 HeapWord* res = allocate(adjustObjectSize(obj_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 if (res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 Copy::aligned_disjoint_words((HeapWord*)obj, res, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 // if we should be tracking promotions, do so.
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 if (_promoInfo.tracking()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 _promoInfo.track((PromotedObject*)res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 return oop(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlock(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 assert(size >= MinChunkSize, "minimum chunk size");
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 assert(size < _smallLinearAllocBlock._allocation_size_limit,
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 "maximum from smallLinearAllocBlock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 return getChunkFromLinearAllocBlock(&_smallLinearAllocBlock, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 CompactibleFreeListSpace::getChunkFromLinearAllocBlock(LinearAllocBlock *blk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 assert(size >= MinChunkSize, "too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 HeapWord* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 // Try to do linear allocation from blk, making sure that
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 if (blk->_word_size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 // We have probably been unable to fill this either in the prologue or
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // when it was exhausted at the last linear allocation. Bail out until
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // next time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 assert(blk->_ptr == NULL, "consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 assert(blk->_word_size != 0 && blk->_ptr != NULL, "consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 res = getChunkFromLinearAllocBlockRemainder(blk, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 if (res != NULL) return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 // about to exhaust this linear allocation block
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 if (blk->_word_size == size) { // exactly satisfied
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 res = blk->_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 _bt.allocated(res, blk->_word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 } else if (size + MinChunkSize <= blk->_refillSize) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1470 size_t sz = blk->_word_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 // Update _unallocated_block if the size is such that chunk would be
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 // returned to the indexed free list. All other chunks in the indexed
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 // free lists are allocated from the dictionary so that _unallocated_block
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // has already been adjusted for them. Do it here so that the cost
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 // for all chunks added back to the indexed free lists.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1476 if (sz < SmallForDictionary) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1477 _bt.allocated(blk->_ptr, sz);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 // Return the chunk that isn't big enough, and then refill below.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1480 addChunkToFreeLists(blk->_ptr, sz);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1481 split_birth(sz);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 // Don't keep statistics on adding back chunk from a LinAB.
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 // A refilled block would not satisfy the request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 blk->_ptr = NULL; blk->_word_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 refillLinearAllocBlock(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 assert(blk->_ptr == NULL || blk->_word_size >= size + MinChunkSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 "block was replenished");
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 if (res != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1493 split_birth(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 repairLinearAllocBlock(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 } else if (blk->_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 res = blk->_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 size_t blk_size = blk->_word_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 blk->_word_size -= size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 blk->_ptr += size;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1500 split_birth(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 repairLinearAllocBlock(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // Update BOT last so that other (parallel) GC threads see a consistent
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // view of the BOT and free blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // Above must occur before BOT is updated below.
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
1505 OrderAccess::storestore();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 _bt.split_block(res, blk_size, size); // adjust block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 HeapWord* CompactibleFreeListSpace::getChunkFromLinearAllocBlockRemainder(
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 LinearAllocBlock* blk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 assert(size >= MinChunkSize, "too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1516
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 HeapWord* res = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 // This is the common case. Keep it simple.
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 if (blk->_word_size >= size + MinChunkSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 assert(blk->_ptr != NULL, "consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 res = blk->_ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // Note that the BOT is up-to-date for the linAB before allocation. It
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 // indicates the start of the linAB. The split_block() updates the
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 // BOT for the linAB after the allocation (indicates the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // next chunk to be allocated).
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 size_t blk_size = blk->_word_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 blk->_word_size -= size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 blk->_ptr += size;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1529 split_birth(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 repairLinearAllocBlock(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 // Update BOT last so that other (parallel) GC threads see a consistent
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 // view of the BOT and free blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // Above must occur before BOT is updated below.
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
1534 OrderAccess::storestore();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 _bt.split_block(res, blk_size, size); // adjust block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 _bt.allocated(res, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 FreeChunk*
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 CompactibleFreeListSpace::getChunkFromIndexedFreeList(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 assert(size < SmallForDictionary, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 FreeChunk* res;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1546 res = _indexedFreeList[size].get_chunk_at_head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 if (res == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 res = getChunkFromIndexedFreeListHelper(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 _bt.verify_not_unallocated((HeapWord*) res, size);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1551 assert(res == NULL || res->size() == size, "Incorrect block size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 FreeChunk*
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1556 CompactibleFreeListSpace::getChunkFromIndexedFreeListHelper(size_t size,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1557 bool replenish) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 FreeChunk* fc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 assert(_indexedFreeList[size].head() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 _indexedFreeList[size].surplus() <= 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 "List for this size should be empty or under populated");
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 // Try best fit in exact lists before replenishing the list
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 if (!bestFitFirst() || (fc = bestFitSmall(size)) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 // Replenish list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // Things tried that failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // Tried allocating out of the two LinAB's first before
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // replenishing lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 // Tried small linAB of size 256 (size in indexed list)
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 // and replenishing indexed lists from the small linAB.
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 FreeChunk* newFc = NULL;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1575 const size_t replenish_size = CMSIndexedFreeListReplenish * size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 if (replenish_size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // Do not replenish from an underpopulated size.
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 if (_indexedFreeList[replenish_size].surplus() > 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 _indexedFreeList[replenish_size].head() != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1580 newFc = _indexedFreeList[replenish_size].get_chunk_at_head();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1581 } else if (bestFitFirst()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 newFc = bestFitSmall(replenish_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1585 if (newFc == NULL && replenish_size > size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 assert(CMSIndexedFreeListReplenish > 1, "ctl pt invariant");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1587 newFc = getChunkFromIndexedFreeListHelper(replenish_size, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1589 // Note: The stats update re split-death of block obtained above
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1590 // will be recorded below precisely when we know we are going to
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1591 // be actually splitting it into more than one pieces below.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 if (newFc != NULL) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1593 if (replenish || CMSReplenishIntermediate) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1594 // Replenish this list and return one block to caller.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1595 size_t i;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1596 FreeChunk *curFc, *nextFc;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1597 size_t num_blk = newFc->size() / size;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1598 assert(num_blk >= 1, "Smaller than requested?");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1599 assert(newFc->size() % size == 0, "Should be integral multiple of request");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1600 if (num_blk > 1) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1601 // we are sure we will be splitting the block just obtained
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1602 // into multiple pieces; record the split-death of the original
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1603 splitDeath(replenish_size);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1604 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1605 // carve up and link blocks 0, ..., num_blk - 2
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1606 // The last chunk is not added to the lists but is returned as the
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1607 // free chunk.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1608 for (curFc = newFc, nextFc = (FreeChunk*)((HeapWord*)curFc + size),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1609 i = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1610 i < (num_blk - 1);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1611 curFc = nextFc, nextFc = (FreeChunk*)((HeapWord*)nextFc + size),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1612 i++) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1613 curFc->set_size(size);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1614 // Don't record this as a return in order to try and
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1615 // determine the "returns" from a GC.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1616 _bt.verify_not_unallocated((HeapWord*) fc, size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1617 _indexedFreeList[size].return_chunk_at_tail(curFc, false);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1618 _bt.mark_block((HeapWord*)curFc, size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1619 split_birth(size);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1620 // Don't record the initial population of the indexed list
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1621 // as a split birth.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1622 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1623
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1624 // check that the arithmetic was OK above
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1625 assert((HeapWord*)nextFc == (HeapWord*)newFc + num_blk*size,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1626 "inconsistency in carving newFc");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1627 curFc->set_size(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 _bt.mark_block((HeapWord*)curFc, size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1629 split_birth(size);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1630 fc = curFc;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1631 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1632 // Return entire block to caller
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1633 fc = newFc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // Get a free chunk from the free chunk dictionary to be returned to
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 // replenish the indexed free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 fc = getChunkFromDictionaryExact(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1642 // assert(fc == NULL || fc->is_free(), "Should be returning a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1645
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 FreeChunk*
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 CompactibleFreeListSpace::getChunkFromDictionary(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 assert_locked();
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1649 FreeChunk* fc = _dictionary->get_chunk(size,
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1650 FreeBlockDictionary<FreeChunk>::atLeast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 if (fc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 _bt.allocated((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 if (fc->size() >= size + MinChunkSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 fc = splitChunkAndReturnRemainder(fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 assert(fc->size() >= size, "chunk too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 assert(fc->size() < size + MinChunkSize, "chunk too big");
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 _bt.verify_single_block((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1663
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 FreeChunk*
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 CompactibleFreeListSpace::getChunkFromDictionaryExact(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 assert_locked();
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1667 FreeChunk* fc = _dictionary->get_chunk(size,
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1668 FreeBlockDictionary<FreeChunk>::atLeast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 if (fc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 _bt.allocated((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 if (fc->size() == size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 _bt.verify_single_block((HeapWord*)fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1677 assert(fc->size() > size, "get_chunk() guarantee");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 if (fc->size() < size + MinChunkSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 // Return the chunk to the dictionary and go get a bigger one.
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 returnChunkToDictionary(fc);
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1681 fc = _dictionary->get_chunk(size + MinChunkSize,
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7448
diff changeset
1682 FreeBlockDictionary<FreeChunk>::atLeast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 if (fc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 _bt.allocated((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 assert(fc->size() >= size + MinChunkSize, "tautology");
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 fc = splitChunkAndReturnRemainder(fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 assert(fc->size() == size, "chunk is wrong size");
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 _bt.verify_single_block((HeapWord*)fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1694
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 CompactibleFreeListSpace::returnChunkToDictionary(FreeChunk* chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1698
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 size_t size = chunk->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 _bt.verify_single_block((HeapWord*)chunk, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 // adjust _unallocated_block downward, as necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 _bt.freed((HeapWord*)chunk, size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1703 _dictionary->return_chunk(chunk);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1704 #ifndef PRODUCT
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1705 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) {
17695
ab36007d6358 8034171: Remove use of template template parameters from binaryTreeDictionary.
goetz
parents: 11096
diff changeset
1706 TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >* tc = TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::as_TreeChunk(chunk);
ab36007d6358 8034171: Remove use of template template parameters from binaryTreeDictionary.
goetz
parents: 11096
diff changeset
1707 TreeList<FreeChunk, AdaptiveFreeList<FreeChunk> >* tl = tc->list();
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1708 tl->verify_stats();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1709 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1710 #endif // PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1712
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 CompactibleFreeListSpace::returnChunkToFreeList(FreeChunk* fc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 size_t size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 _bt.verify_single_block((HeapWord*) fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 _bt.verify_not_unallocated((HeapWord*) fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 if (_adaptive_freelists) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1720 _indexedFreeList[size].return_chunk_at_tail(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1722 _indexedFreeList[size].return_chunk_at_head(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1724 #ifndef PRODUCT
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1725 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1726 _indexedFreeList[size].verify_stats();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1727 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
1728 #endif // PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 // Add chunk to end of last block -- if it's the largest
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 // block -- and update BOT and census data. We would
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 // of course have preferred to coalesce it with the
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 // last block, but it's currently less expensive to find the
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 // largest block than it is to find the last.
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats(
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 HeapWord* chunk, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 // check that the chunk does lie in this space!
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 // One of the parallel gc task threads may be here
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // whilst others are allocating.
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 Mutex* lock = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 if (ParallelGCThreads != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 lock = &_parDictionaryAllocLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 FreeChunk* ec;
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1750 ec = dictionary()->find_largest_dict(); // get largest block
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1751 if (ec != NULL && ec->end() == (uintptr_t*) chunk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 // It's a coterminal block - we can coalesce.
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 size_t old_size = ec->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 coalDeath(old_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 removeChunkFromDictionary(ec);
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 size += old_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 ec = (FreeChunk*)chunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1761 ec->set_size(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 debug_only(ec->mangleFreed(size));
10334
7c5a1b62f53d 8014971: Minor code cleanup of the freelist management
brutisso
parents: 10331
diff changeset
1763 if (size < SmallForDictionary && ParallelGCThreads != 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 lock = _indexedFreeListParLocks[size];
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 addChunkAndRepairOffsetTable((HeapWord*)ec, size, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 // record the birth under the lock since the recording involves
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 // manipulation of the list on which the chunk lives and
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 // if the chunk is allocated and is the last on the list,
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 // the list can go away.
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 coalBirth(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1774
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 CompactibleFreeListSpace::addChunkToFreeLists(HeapWord* chunk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // check that the chunk does lie in this space!
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 _bt.verify_single_block(chunk, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 FreeChunk* fc = (FreeChunk*) chunk;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1784 fc->set_size(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 debug_only(fc->mangleFreed(size));
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 returnChunkToFreeList(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 returnChunkToDictionary(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1792
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 CompactibleFreeListSpace::addChunkAndRepairOffsetTable(HeapWord* chunk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 size_t size, bool coalesced) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 assert(chunk != NULL, "null chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 if (coalesced) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 // repair BOT
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 _bt.single_block(chunk, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 addChunkToFreeLists(chunk, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1804
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // We _must_ find the purported chunk on our free lists;
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 // we assert if we don't.
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 CompactibleFreeListSpace::removeFreeChunkFromFreeLists(FreeChunk* fc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 size_t size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 debug_only(verifyFreeLists());
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 removeChunkFromIndexedFreeList(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 removeChunkFromDictionary(fc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 _bt.verify_single_block((HeapWord*)fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 debug_only(verifyFreeLists());
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1820
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 CompactibleFreeListSpace::removeChunkFromDictionary(FreeChunk* fc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 size_t size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 assert(fc != NULL, "null chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 _bt.verify_single_block((HeapWord*)fc, size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1827 _dictionary->remove_chunk(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 // adjust _unallocated_block upward, as necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 _bt.allocated((HeapWord*)fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1831
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 CompactibleFreeListSpace::removeChunkFromIndexedFreeList(FreeChunk* fc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 size_t size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 _bt.verify_single_block((HeapWord*)fc, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 if (FLSVerifyIndexTable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 verifyIndexedFreeList(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 )
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1842 _indexedFreeList[size].remove_chunk(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 if (FLSVerifyIndexTable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 verifyIndexedFreeList(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1849
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 /* A hint is the next larger size that has a surplus.
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 Start search at a size large enough to guarantee that
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 the excess is >= MIN_CHUNK. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 size_t start = align_object_size(numWords + MinChunkSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 if (start < IndexSetSize) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1856 AdaptiveFreeList<FreeChunk>* it = _indexedFreeList;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 size_t hint = _indexedFreeList[start].hint();
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 while (hint < IndexSetSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 assert(hint % MinObjAlignment == 0, "hint should be aligned");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1860 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[hint];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 if (fl->surplus() > 0 && fl->head() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 // Found a list with surplus, reset original hint
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 // and split out a free chunk which is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 _indexedFreeList[start].set_hint(hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 FreeChunk* res = getFromListGreater(fl, numWords);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1866 assert(res == NULL || res->is_free(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 "Should be returning a free chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 hint = fl->hint(); /* keep looking */
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 /* None found. */
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 it[start].set_hint(IndexSetSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1877
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 /* Requires fl->size >= numWords + MinChunkSize */
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
1879 FreeChunk* CompactibleFreeListSpace::getFromListGreater(AdaptiveFreeList<FreeChunk>* fl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 size_t numWords) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 FreeChunk *curr = fl->head();
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 size_t oldNumWords = curr->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 assert(numWords >= MinChunkSize, "Word size is too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 assert(curr != NULL, "List is empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 assert(oldNumWords >= numWords + MinChunkSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 "Size of chunks in the list is too small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1887
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1888 fl->remove_chunk(curr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 // recorded indirectly by splitChunkAndReturnRemainder -
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 // smallSplit(oldNumWords, numWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 FreeChunk* new_chunk = splitChunkAndReturnRemainder(curr, numWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 // Does anything have to be done for the remainder in terms of
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 // fixing the card table?
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1894 assert(new_chunk == NULL || new_chunk->is_free(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 "Should be returning a free chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 return new_chunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1898
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 FreeChunk*
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 CompactibleFreeListSpace::splitChunkAndReturnRemainder(FreeChunk* chunk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 size_t new_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 size_t size = chunk->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 assert(size > new_size, "Split from a smaller block?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 assert(is_aligned(chunk), "alignment problem");
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 assert(size == adjustObjectSize(size), "alignment problem");
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 size_t rem_size = size - new_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 assert(rem_size == adjustObjectSize(rem_size), "alignment problem");
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 assert(rem_size >= MinChunkSize, "Free chunk smaller than minimum");
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 FreeChunk* ffc = (FreeChunk*)((HeapWord*)chunk + new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 assert(is_aligned(ffc), "alignment problem");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1912 ffc->set_size(rem_size);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1913 ffc->link_next(NULL);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1914 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 // Above must occur before BOT is updated below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // adjust block offset table
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
1917 OrderAccess::storestore();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1918 assert(chunk->is_free() && ffc->is_free(), "Error");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 _bt.split_block((HeapWord*)chunk, chunk->size(), new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 if (rem_size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 bool is_par = (SharedHeap::heap()->n_par_threads() > 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 if (is_par) _indexedFreeListParLocks[rem_size]->lock();
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
1923 assert(!is_par ||
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
1924 (SharedHeap::heap()->n_par_threads() ==
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4068
diff changeset
1925 SharedHeap::heap()->workers()->active_workers()), "Mismatch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 returnChunkToFreeList(ffc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 split(size, rem_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 if (is_par) _indexedFreeListParLocks[rem_size]->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 returnChunkToDictionary(ffc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 split(size ,rem_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1933 chunk->set_size(new_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 return chunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1936
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 CompactibleFreeListSpace::sweep_completed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 // Now that space is probably plentiful, refill linear
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 // allocation blocks as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 refillLinearAllocBlocksIfNeeded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 CompactibleFreeListSpace::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 if (PrintFLSStatistics != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 gclog_or_tty->print("Before GC:\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 reportFreeListStatistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 refillLinearAllocBlocksIfNeeded();
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1953
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 void
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 CompactibleFreeListSpace::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 if (PrintGCDetails && Verbose && !_adaptive_freelists) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 if (_smallLinearAllocBlock._word_size == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 warning("CompactibleFreeListSpace(epilogue):: Linear allocation failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 _promoInfo.stopTrackingPromotions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 repairLinearAllocationBlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 // Print Space's stats
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 if (PrintFLSStatistics != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 gclog_or_tty->print("After GC:\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 reportFreeListStatistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 // Iteration support, mostly delegated from a CMS generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1972
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 void CompactibleFreeListSpace::save_marks() {
3293
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1974 assert(Thread::current()->is_VM_thread(),
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1975 "Global variable should only be set when single-threaded");
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1976 // Mark the "end" of the used space at the time of this call;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 // note, however, that promoted objects from this point
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 // on are tracked in the _promoInfo below.
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
1979 set_saved_mark_word(unallocated_block());
3293
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1980 #ifdef ASSERT
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1981 // Check the sanity of save_marks() etc.
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1982 MemRegion ur = used_region();
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1983 MemRegion urasm = used_region_at_save_marks();
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1984 assert(ur.contains(urasm),
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1985 err_msg(" Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")"
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1986 " should contain [" PTR_FORMAT "," PTR_FORMAT ")",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
1987 p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end())));
3293
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 2426
diff changeset
1988 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // inform allocator that promotions should be tracked.
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 _promoInfo.startTrackingPromotions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1993
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 bool CompactibleFreeListSpace::no_allocs_since_save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 assert(_promoInfo.tracking(), "No preceding save_marks?");
1777
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1716
diff changeset
1996 assert(SharedHeap::heap()->n_par_threads() == 0,
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1716
diff changeset
1997 "Shouldn't be called if using parallel gc.");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 return _promoInfo.noPromotions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2000
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 #define CFLS_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 void CompactibleFreeListSpace:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 assert(SharedHeap::heap()->n_par_threads() == 0, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 "Shouldn't be called (yet) during parallel part of gc."); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 _promoInfo.promoted_oops_iterate##nv_suffix(blk); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 /* \
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 * This also restores any displaced headers and removes the elements from \
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 * the iteration set as they are processed, so that we have a clean slate \
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 * at the end of the iteration. Note, thus, that if new objects are \
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 * promoted as a result of the iteration they are iterated over as well. \
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2016
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 ALL_SINCE_SAVE_MARKS_CLOSURES(CFLS_OOP_SINCE_SAVE_MARKS_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
2018
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2019 bool CompactibleFreeListSpace::linearAllocationWouldFail() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 return _smallLinearAllocBlock._word_size == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2022
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 void CompactibleFreeListSpace::repairLinearAllocationBlocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 // Fix up linear allocation blocks to look like free blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 repairLinearAllocBlock(&_smallLinearAllocBlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2027
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 void CompactibleFreeListSpace::repairLinearAllocBlock(LinearAllocBlock* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 if (blk->_ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 assert(blk->_word_size != 0 && blk->_word_size >= MinChunkSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 "Minimum block size requirement");
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 FreeChunk* fc = (FreeChunk*)(blk->_ptr);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2034 fc->set_size(blk->_word_size);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2035 fc->link_prev(NULL); // mark as free
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 fc->dontCoalesce();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2037 assert(fc->is_free(), "just marked it free");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 assert(fc->cantCoalesce(), "just marked it uncoalescable");
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2041
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 void CompactibleFreeListSpace::refillLinearAllocBlocksIfNeeded() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 if (_smallLinearAllocBlock._ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 assert(_smallLinearAllocBlock._word_size == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 "Size of linAB should be zero if the ptr is NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 // Reset the linAB refill and allocation size limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc, SmallForLinearAlloc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 refillLinearAllocBlockIfNeeded(&_smallLinearAllocBlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2052
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 void
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 CompactibleFreeListSpace::refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 assert((blk->_ptr == NULL && blk->_word_size == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 (blk->_ptr != NULL && blk->_word_size >= MinChunkSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 "blk invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 if (blk->_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 refillLinearAllocBlock(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 if (PrintMiscellaneous && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 if (blk->_word_size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 warning("CompactibleFreeListSpace(prologue):: Linear allocation failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2068
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 void
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 CompactibleFreeListSpace::refillLinearAllocBlock(LinearAllocBlock* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 assert(blk->_word_size == 0 && blk->_ptr == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 "linear allocation block should be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 FreeChunk* fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 if (blk->_refillSize < SmallForDictionary &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 (fc = getChunkFromIndexedFreeList(blk->_refillSize)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // A linAB's strategy might be to use small sizes to reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // fragmentation but still get the benefits of allocation from a
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // linAB.
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 fc = getChunkFromDictionary(blk->_refillSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 if (fc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 blk->_ptr = (HeapWord*)fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 blk->_word_size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 fc->dontCoalesce(); // to prevent sweeper from sweeping us up
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2089
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2090 // Support for concurrent collection policy decisions.
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2091 bool CompactibleFreeListSpace::should_concurrent_collect() const {
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2092 // In the future we might want to add in frgamentation stats --
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2093 // including erosion of the "mountain" into this decision as well.
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2094 return !adaptive_freelists() && linearAllocationWouldFail();
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2095 }
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2096
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // Support for compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
2098
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 SCAN_AND_FORWARD(cp,end,block_is_obj,block_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 // prepare_for_compaction() uses the space between live objects
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 // so that later phase can skip dead space quickly. So verification
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 // of the free lists doesn't work after.
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2105
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 #define obj_size(q) adjustObjectSize(oop(q)->size())
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 #define adjust_obj_size(s) adjustObjectSize(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
2108
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 void CompactibleFreeListSpace::adjust_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 // In other versions of adjust_pointers(), a bail out
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 // based on the amount of live data in the generation
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 // (i.e., if 0, bail out) may be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 // Cannot test used() == 0 here because the free lists have already
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 // been mangled by the compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
2115
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 SCAN_AND_ADJUST_POINTERS(adjust_obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 // See note about verification in prepare_for_compaction().
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 void CompactibleFreeListSpace::compact() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 SCAN_AND_COMPACT(obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2123
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 // fragmentation_metric = 1 - [sum of (fbs**2) / (sum of fbs)**2]
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 // where fbs is free block sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 double CompactibleFreeListSpace::flsFrag() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 size_t itabFree = totalSizeInIndexedFreeLists();
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 double frag = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 size_t i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2130
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 double sz = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 frag += _indexedFreeList[i].count() * (sz * sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2135
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 double totFree = itabFree +
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2137 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 if (totFree > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 frag = ((frag + _dictionary->sum_of_squared_block_sizes()) /
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 (totFree * totFree));
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 frag = (double)1.0 - frag;
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 assert(frag == 0.0, "Follows from totFree == 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 return frag;
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2147
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 void CompactibleFreeListSpace::beginSweepFLCensus(
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 float inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2150 float inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2151 float intra_sweep_estimate) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 size_t i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2155 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i];
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2156 if (PrintFLSStatistics > 1) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2157 gclog_or_tty->print("size[" SIZE_FORMAT "] : ", i);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2158 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2159 fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2160 fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent));
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2161 fl->set_before_sweep(fl->count());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2162 fl->set_bfr_surp(fl->surplus());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2164 _dictionary->begin_sweep_dict_census(CMSLargeCoalSurplusPercent,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2166 inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2167 intra_sweep_estimate);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2169
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 void CompactibleFreeListSpace::setFLSurplus() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 size_t i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2174 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 fl->set_surplus(fl->count() -
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2176 (ssize_t)((double)fl->desired() * CMSSmallSplitSurplusPercent));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 void CompactibleFreeListSpace::setFLHints() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 size_t i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 size_t h = IndexSetSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 for (i = IndexSetSize - 1; i != 0; i -= IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2185 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 fl->set_hint(h);
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 if (fl->surplus() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 h = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2192
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 void CompactibleFreeListSpace::clearFLCensus() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 assert_locked();
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
2195 size_t i;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2197 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2198 fl->set_prev_sweep(fl->count());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2199 fl->set_coal_births(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2200 fl->set_coal_deaths(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2201 fl->set_split_births(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2202 fl->set_split_deaths(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2205
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2206 void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2207 if (PrintFLSStatistics > 0) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2208 HeapWord* largestAddr = (HeapWord*) dictionary()->find_largest_dict();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2209 gclog_or_tty->print_cr("CMS: Large block " PTR_FORMAT,
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2210 p2i(largestAddr));
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2211 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 setFLSurplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 setFLHints();
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 if (PrintGC && PrintFLSCensus > 0) {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2215 printFLCensus(sweep_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 clearFLCensus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 assert_locked();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2219 _dictionary->end_sweep_dict_census(CMSLargeSplitSurplusPercent);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2221
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 bool CompactibleFreeListSpace::coalOverPopulated(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 if (size < SmallForDictionary) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2224 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2225 return (fl->coal_desired() < 0) ||
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2226 ((int)fl->count() > fl->coal_desired());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2228 return dictionary()->coal_dict_over_populated(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2231
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 void CompactibleFreeListSpace::smallCoalBirth(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 assert(size < SmallForDictionary, "Size too large for indexed list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2234 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2235 fl->increment_coal_births();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 fl->increment_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 void CompactibleFreeListSpace::smallCoalDeath(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 assert(size < SmallForDictionary, "Size too large for indexed list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2241 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2242 fl->increment_coal_deaths();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 fl->decrement_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2245
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 void CompactibleFreeListSpace::coalBirth(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 smallCoalBirth(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2250 dictionary()->dict_census_update(size,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 false /* split */,
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 true /* birth */);
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2255
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 void CompactibleFreeListSpace::coalDeath(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 if(size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 smallCoalDeath(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2260 dictionary()->dict_census_update(size,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 false /* split */,
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 false /* birth */);
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2265
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 void CompactibleFreeListSpace::smallSplitBirth(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 assert(size < SmallForDictionary, "Size too large for indexed list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2268 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2269 fl->increment_split_births();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 fl->increment_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2272
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 void CompactibleFreeListSpace::smallSplitDeath(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 assert(size < SmallForDictionary, "Size too large for indexed list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2275 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2276 fl->increment_split_deaths();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 fl->decrement_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2279
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2280 void CompactibleFreeListSpace::split_birth(size_t size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 smallSplitBirth(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2284 dictionary()->dict_census_update(size,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 true /* split */,
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 true /* birth */);
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2289
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 void CompactibleFreeListSpace::splitDeath(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 if (size < SmallForDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 smallSplitDeath(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2294 dictionary()->dict_census_update(size,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 true /* split */,
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 false /* birth */);
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2299
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 void CompactibleFreeListSpace::split(size_t from, size_t to1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 size_t to2 = from - to1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 splitDeath(from);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2303 split_birth(to1);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2304 split_birth(to2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2306
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 void CompactibleFreeListSpace::print() const {
1952
4df7f8cba524 6996613: CompactibleFreeListSpace::print should call CompactibleFreeListSpace::print_on, not Space::print_on
ysr
parents: 1951
diff changeset
2308 print_on(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2310
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 void CompactibleFreeListSpace::prepare_for_verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 repairLinearAllocationBlocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 // Verify that the SpoolBlocks look like free blocks of
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 // appropriate sizes... To be done ...
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2317
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 class VerifyAllBlksClosure: public BlkClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2319 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 const CompactibleFreeListSpace* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 const MemRegion _span;
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2322 HeapWord* _last_addr;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2323 size_t _last_size;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2324 bool _last_was_obj;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2325 bool _last_was_live;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2326
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 VerifyAllBlksClosure(const CompactibleFreeListSpace* sp,
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2329 MemRegion span) : _sp(sp), _span(span),
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2330 _last_addr(NULL), _last_size(0),
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2331 _last_was_obj(false), _last_was_live(false) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2332
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2333 virtual size_t do_blk(HeapWord* addr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 size_t res;
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2335 bool was_obj = false;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2336 bool was_live = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 if (_sp->block_is_obj(addr)) {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2338 was_obj = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 oop p = oop(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 guarantee(p->is_oop(), "Should be an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 res = _sp->adjustObjectSize(p->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 if (_sp->obj_is_alive(addr)) {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2343 was_live = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 p->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 FreeChunk* fc = (FreeChunk*)addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 res = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 if (FLSVerifyLists && !fc->cantCoalesce()) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2350 guarantee(_sp->verify_chunk_in_free_list(fc),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 "Chunk should be on a free list");
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 }
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2354 if (res == 0) {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2355 gclog_or_tty->print_cr("Livelock: no rank reduction!");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2356 gclog_or_tty->print_cr(
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2357 " Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n"
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2358 " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2359 p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false",
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2360 p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false");
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2361 _sp->print_on(gclog_or_tty);
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2362 guarantee(false, "Seppuku!");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2363 }
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2364 _last_addr = addr;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2365 _last_size = res;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2366 _last_was_obj = was_obj;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2367 _last_was_live = was_live;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2371
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 class VerifyAllOopsClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2373 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 const CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 const CompactibleFreeListSpace* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 const MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 const bool _past_remark;
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 const CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
2379
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2380 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2381 void do_oop(void* p, oop obj) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2382 if (_span.contains(obj)) { // the interior oop points into CMS heap
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2383 if (!_span.contains(p)) { // reference from outside CMS heap
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2384 // Should be a valid object; the first disjunct below allows
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2385 // us to sidestep an assertion in block_is_obj() that insists
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2386 // that p be in _sp. Note that several generations (and spaces)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2387 // are spanned by _span (CMS heap) above.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2388 guarantee(!_sp->is_in_reserved(obj) ||
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2389 _sp->block_is_obj((HeapWord*)obj),
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2390 "Should be an object");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2391 guarantee(obj->is_oop(), "Should be an oop");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2392 obj->verify();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2393 if (_past_remark) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2394 // Remark has been completed, the object should be marked
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2395 _bit_map->isMarked((HeapWord*)obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2396 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2397 } else { // reference within CMS heap
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2398 if (_past_remark) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2399 // Remark has been completed -- so the referent should have
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2400 // been marked, if referring object is.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2401 if (_bit_map->isMarked(_collector->block_start(p))) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2402 guarantee(_bit_map->isMarked((HeapWord*)obj), "Marking error?");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2403 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2404 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2405 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2406 } else if (_sp->is_in_reserved(p)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2407 // the reference is from FLS, and points out of FLS
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2408 guarantee(obj->is_oop(), "Should be an oop");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2409 obj->verify();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2410 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2411 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2412
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2413 template <class T> void do_oop_work(T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2414 T heap_oop = oopDesc::load_heap_oop(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2415 if (!oopDesc::is_null(heap_oop)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2416 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2417 do_oop(p, obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2418 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2419 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2420
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 VerifyAllOopsClosure(const CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 const CompactibleFreeListSpace* sp, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 bool past_remark, CMSBitMap* bit_map) :
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
2425 _collector(collector), _sp(sp), _span(span),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 _past_remark(past_remark), _bit_map(bit_map) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2428 virtual void do_oop(oop* p) { VerifyAllOopsClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 12
diff changeset
2429 virtual void do_oop(narrowOop* p) { VerifyAllOopsClosure::do_oop_work(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2431
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4728
diff changeset
2432 void CompactibleFreeListSpace::verify() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 assert_lock_strong(&_freelistLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 verify_objects_initialized();
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 MemRegion span = _collector->_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 bool past_remark = (_collector->abstract_state() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 CMSCollector::Sweeping);
a61af66fc99e Initial load
duke
parents:
diff changeset
2438
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2441
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 // Check integrity of CFL data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 _promoInfo.verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 _dictionary->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 if (FLSVerifyIndexTable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 verifyIndexedFreeLists();
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 // Check integrity of all objects and free blocks in space
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 VerifyAllBlksClosure cl(this, span);
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 ((CompactibleFreeListSpace*)this)->blk_iterate(&cl); // cast off const
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 // Check that all references in the heap to FLS
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 // are to valid objects in FLS or that references in
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 // FLS are to valid objects elsewhere in the heap
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 if (FLSVerifyAllHeapReferences)
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 VerifyAllOopsClosure cl(_collector, this, span, past_remark,
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 _collector->markBitMap());
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 CollectedHeap* ch = Universe::heap();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
2461
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
2462 // Iterate over all oops in the heap. Uses the _no_header version
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
2463 // since we are not interested in following the klass pointers.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6104
diff changeset
2464 ch->oop_iterate_no_header(&cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2466
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 if (VerifyObjectStartArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 // Verify the block offset table
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 _bt.verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2472
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 void CompactibleFreeListSpace::verifyFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 if (FLSVerifyLists) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 _dictionary->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 verifyIndexedFreeLists();
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 if (FLSVerifyDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 _dictionary->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 if (FLSVerifyIndexTable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 verifyIndexedFreeLists();
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2488
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 void CompactibleFreeListSpace::verifyIndexedFreeLists() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 size_t i = 0;
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
2491 for (; i < IndexSetStart; i++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 guarantee(_indexedFreeList[i].head() == NULL, "should be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 for (; i < IndexSetSize; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 verifyIndexedFreeList(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2498
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 void CompactibleFreeListSpace::verifyIndexedFreeList(size_t size) const {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2500 FreeChunk* fc = _indexedFreeList[size].head();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2501 FreeChunk* tail = _indexedFreeList[size].tail();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2502 size_t num = _indexedFreeList[size].count();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2503 size_t n = 0;
4068
5a5ed80bea5b 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 4024
diff changeset
2504 guarantee(((size >= IndexSetStart) && (size % IndexSetStride == 0)) || fc == NULL,
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2505 "Slot should have been empty");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2506 for (; fc != NULL; fc = fc->next(), n++) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 guarantee(fc->size() == size, "Size inconsistency");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2508 guarantee(fc->is_free(), "!free?");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 guarantee(fc->next() == NULL || fc->next()->prev() == fc, "Broken list");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2510 guarantee((fc->next() == NULL) == (fc == tail), "Incorrect tail");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2512 guarantee(n == num, "Incorrect count");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2514
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 #ifndef PRODUCT
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2516 void CompactibleFreeListSpace::check_free_list_consistency() const {
17695
ab36007d6358 8034171: Remove use of template template parameters from binaryTreeDictionary.
goetz
parents: 11096
diff changeset
2517 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size() <= IndexSetSize),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 "Some sizes can't be allocated without recourse to"
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 " linear allocation buffers");
17695
ab36007d6358 8034171: Remove use of template template parameters from binaryTreeDictionary.
goetz
parents: 11096
diff changeset
2520 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size()*HeapWordSize == sizeof(TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >)),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 "else MIN_TREE_CHUNK_SIZE is wrong");
6104
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
2522 assert(IndexSetStart != 0, "IndexSetStart not initialized");
c92a79900986 7169062: CMS: Assertion failed with -XX:+ObjectAlignmentInBytes=64
brutisso
parents: 6028
diff changeset
2523 assert(IndexSetStride != 0, "IndexSetStride not initialized");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2526
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2527 void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 assert_lock_strong(&_freelistLock);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2529 AdaptiveFreeList<FreeChunk> total;
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2530 gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2531 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2532 size_t total_free = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2534 const AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i];
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2535 total_free += fl->count() * fl->size();
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2536 if (i % (40*IndexSetStride) == 0) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2537 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size");
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2538 }
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2539 fl->print_on(gclog_or_tty);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2540 total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() );
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2541 total.set_surplus( total.surplus() + fl->surplus() );
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2542 total.set_desired( total.desired() + fl->desired() );
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2543 total.set_prev_sweep( total.prev_sweep() + fl->prev_sweep() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2544 total.set_before_sweep(total.before_sweep() + fl->before_sweep());
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2545 total.set_count( total.count() + fl->count() );
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2546 total.set_coal_births( total.coal_births() + fl->coal_births() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2547 total.set_coal_deaths( total.coal_deaths() + fl->coal_deaths() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2548 total.set_split_births(total.split_births() + fl->split_births());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2549 total.set_split_deaths(total.split_deaths() + fl->split_deaths());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 }
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2551 total.print_on(gclog_or_tty, "TOTAL");
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2552 gclog_or_tty->print_cr("Total free in indexed lists "
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2553 SIZE_FORMAT " words", total_free);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n",
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2555 (double)(total.split_births()+total.coal_births()-total.split_deaths()-total.coal_deaths())/
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2556 (total.prev_sweep() != 0 ? (double)total.prev_sweep() : 1.0),
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
2557 (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0));
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2558 _dictionary->print_dict_census();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2560
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2561 ///////////////////////////////////////////////////////////////////////////
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2562 // CFLS_LAB
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2563 ///////////////////////////////////////////////////////////////////////////
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2564
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2565 #define VECTOR_257(x) \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2566 /* 1 2 3 4 5 6 7 8 9 1x 11 12 13 14 15 16 17 18 19 2x 21 22 23 24 25 26 27 28 29 3x 31 32 */ \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2567 { x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2568 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2569 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2570 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2571 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2572 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2573 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2574 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2575 x }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2576
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2577 // Initialize with default setting of CMSParPromoteBlocksToClaim, _not_
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2578 // OldPLABSize, whose static default is different; if overridden at the
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2579 // command-line, this will get reinitialized via a call to
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2580 // modify_initialization() below.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2581 AdaptiveWeightedAverage CFLS_LAB::_blocks_to_claim[] =
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2582 VECTOR_257(AdaptiveWeightedAverage(OldPLABWeight, (float)CMSParPromoteBlocksToClaim));
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2583 size_t CFLS_LAB::_global_num_blocks[] = VECTOR_257(0);
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4095
diff changeset
2584 uint CFLS_LAB::_global_num_workers[] = VECTOR_257(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 CFLS_LAB::CFLS_LAB(CompactibleFreeListSpace* cfls) :
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 _cfls(cfls)
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2589 assert(CompactibleFreeListSpace::IndexSetSize == 257, "Modify VECTOR_257() macro above");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 for (size_t i = CompactibleFreeListSpace::IndexSetStart;
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 i < CompactibleFreeListSpace::IndexSetSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 i += CompactibleFreeListSpace::IndexSetStride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 _indexedFreeList[i].set_size(i);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2594 _num_blocks[i] = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2595 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2596 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2597
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2598 static bool _CFLS_LAB_modified = false;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2599
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2600 void CFLS_LAB::modify_initialization(size_t n, unsigned wt) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2601 assert(!_CFLS_LAB_modified, "Call only once");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2602 _CFLS_LAB_modified = true;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2603 for (size_t i = CompactibleFreeListSpace::IndexSetStart;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2604 i < CompactibleFreeListSpace::IndexSetSize;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2605 i += CompactibleFreeListSpace::IndexSetStride) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2606 _blocks_to_claim[i].modify(n, wt, true /* force */);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2609
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 HeapWord* CFLS_LAB::alloc(size_t word_sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 FreeChunk* res;
1777
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1716
diff changeset
2612 assert(word_sz == _cfls->adjustObjectSize(word_sz), "Error");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 if (word_sz >= CompactibleFreeListSpace::IndexSetSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 // This locking manages sync with other large object allocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 MutexLockerEx x(_cfls->parDictionaryAllocLock(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 res = _cfls->getChunkFromDictionaryExact(word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 if (res == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2620 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[word_sz];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 if (fl->count() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 // Attempt to refill this local free list.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2623 get_from_global_pool(word_sz, fl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 // If it didn't work, give up.
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 if (fl->count() == 0) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2627 res = fl->get_chunk_at_head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 assert(res != NULL, "Why was count non-zero?");
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 res->markNotFree();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2631 assert(!res->is_free(), "shouldn't be marked free");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
2632 assert(oop(res)->klass_or_null() == NULL, "should look uninitialized");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 // mangle a just allocated object with a distinct pattern.
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 debug_only(res->mangleAllocated(word_sz));
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 return (HeapWord*)res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2637
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2638 // Get a chunk of blocks of the right size and update related
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2639 // book-keeping stats
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2640 void CFLS_LAB::get_from_global_pool(size_t word_sz, AdaptiveFreeList<FreeChunk>* fl) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2641 // Get the #blocks we want to claim
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2642 size_t n_blks = (size_t)_blocks_to_claim[word_sz].average();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2643 assert(n_blks > 0, "Error");
20631
a28b7832203a 8060467: CMS: small OldPLABSize and -XX:-ResizePLAB cause assert(ResizePLAB || n_blks == OldPLABSize) failed: Error
jcoomes
parents: 20520
diff changeset
2644 assert(ResizeOldPLAB || n_blks == OldPLABSize, "Error");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2645 // In some cases, when the application has a phase change,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2646 // there may be a sudden and sharp shift in the object survival
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2647 // profile, and updating the counts at the end of a scavenge
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2648 // may not be quick enough, giving rise to large scavenge pauses
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2649 // during these phase changes. It is beneficial to detect such
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2650 // changes on-the-fly during a scavenge and avoid such a phase-change
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2651 // pothole. The following code is a heuristic attempt to do that.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2652 // It is protected by a product flag until we have gained
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2653 // enough experience with this heuristic and fine-tuned its behaviour.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2654 // WARNING: This might increase fragmentation if we overreact to
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2655 // small spikes, so some kind of historical smoothing based on
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2656 // previous experience with the greater reactivity might be useful.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2657 // Lacking sufficient experience, CMSOldPLABResizeQuicker is disabled by
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2658 // default.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2659 if (ResizeOldPLAB && CMSOldPLABResizeQuicker) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2660 size_t multiple = _num_blocks[word_sz]/(CMSOldPLABToleranceFactor*CMSOldPLABNumRefills*n_blks);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2661 n_blks += CMSOldPLABReactivityFactor*multiple*n_blks;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2662 n_blks = MIN2(n_blks, CMSOldPLABMax);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2663 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2664 assert(n_blks > 0, "Error");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2665 _cfls->par_get_chunk_of_blocks(word_sz, n_blks, fl);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2666 // Update stats table entry for this block size
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2667 _num_blocks[word_sz] += fl->count();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2668 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2669
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2670 void CFLS_LAB::compute_desired_plab_size() {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2671 for (size_t i = CompactibleFreeListSpace::IndexSetStart;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 i < CompactibleFreeListSpace::IndexSetSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 i += CompactibleFreeListSpace::IndexSetStride) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2674 assert((_global_num_workers[i] == 0) == (_global_num_blocks[i] == 0),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2675 "Counter inconsistency");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2676 if (_global_num_workers[i] > 0) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2677 // Need to smooth wrt historical average
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2678 if (ResizeOldPLAB) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2679 _blocks_to_claim[i].sample(
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2680 MAX2((size_t)CMSOldPLABMin,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2681 MIN2((size_t)CMSOldPLABMax,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2682 _global_num_blocks[i]/(_global_num_workers[i]*CMSOldPLABNumRefills))));
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2683 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2684 // Reset counters for next round
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2685 _global_num_workers[i] = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2686 _global_num_blocks[i] = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2687 if (PrintOldPLAB) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2688 gclog_or_tty->print_cr("[" SIZE_FORMAT "]: " SIZE_FORMAT, i, (size_t)_blocks_to_claim[i].average());
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2689 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2693
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2694 // If this is changed in the future to allow parallel
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2695 // access, one would need to take the FL locks and,
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2696 // depending on how it is used, stagger access from
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2697 // parallel threads to reduce contention.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2698 void CFLS_LAB::retire(int tid) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2699 // We run this single threaded with the world stopped;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2700 // so no need for locks and such.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2701 NOT_PRODUCT(Thread* t = Thread::current();)
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2702 assert(Thread::current()->is_VM_thread(), "Error");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2703 for (size_t i = CompactibleFreeListSpace::IndexSetStart;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2704 i < CompactibleFreeListSpace::IndexSetSize;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2705 i += CompactibleFreeListSpace::IndexSetStride) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2706 assert(_num_blocks[i] >= (size_t)_indexedFreeList[i].count(),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2707 "Can't retire more than what we obtained");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2708 if (_num_blocks[i] > 0) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2709 size_t num_retire = _indexedFreeList[i].count();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2710 assert(_num_blocks[i] > num_retire, "Should have used at least one");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2711 {
4024
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2712 // MutexLockerEx x(_cfls->_indexedFreeListParLocks[i],
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2713 // Mutex::_no_safepoint_check_flag);
c08412904149 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 3761
diff changeset
2714
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2715 // Update globals stats for num_blocks used
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2716 _global_num_blocks[i] += (_num_blocks[i] - num_retire);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2717 _global_num_workers[i]++;
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4095
diff changeset
2718 assert(_global_num_workers[i] <= ParallelGCThreads, "Too big");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2719 if (num_retire > 0) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2720 _cfls->_indexedFreeList[i].prepend(&_indexedFreeList[i]);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2721 // Reset this list.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2722 _indexedFreeList[i] = AdaptiveFreeList<FreeChunk>();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2723 _indexedFreeList[i].set_size(i);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2724 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2725 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2726 if (PrintOldPLAB) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17805
diff changeset
2727 gclog_or_tty->print_cr("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2728 tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average());
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2729 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2730 // Reset stats for next round
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2731 _num_blocks[i] = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2732 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2733 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2734 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2735
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2736 // Used by par_get_chunk_of_blocks() for the chunks from the
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2737 // indexed_free_lists. Looks for a chunk with size that is a multiple
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2738 // of "word_sz" and if found, splits it into "word_sz" chunks and add
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2739 // to the free list "fl". "n" is the maximum number of chunks to
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2740 // be added to "fl".
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2741 bool CompactibleFreeListSpace:: par_get_chunk_of_blocks_IFL(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2742
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2743 // We'll try all multiples of word_sz in the indexed set, starting with
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2744 // word_sz itself and, if CMSSplitIndexedFreeListBlocks, try larger multiples,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2745 // then try getting a big chunk and splitting it.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2746 {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2747 bool found;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2748 int k;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2749 size_t cur_sz;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2750 for (k = 1, cur_sz = k * word_sz, found = false;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2751 (cur_sz < CompactibleFreeListSpace::IndexSetSize) &&
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2752 (CMSSplitIndexedFreeListBlocks || k <= 1);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2753 k++, cur_sz = k * word_sz) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2754 AdaptiveFreeList<FreeChunk> fl_for_cur_sz; // Empty.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2755 fl_for_cur_sz.set_size(cur_sz);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2756 {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2757 MutexLockerEx x(_indexedFreeListParLocks[cur_sz],
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2758 Mutex::_no_safepoint_check_flag);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2759 AdaptiveFreeList<FreeChunk>* gfl = &_indexedFreeList[cur_sz];
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2760 if (gfl->count() != 0) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2761 // nn is the number of chunks of size cur_sz that
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2762 // we'd need to split k-ways each, in order to create
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2763 // "n" chunks of size word_sz each.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2764 const size_t nn = MAX2(n/k, (size_t)1);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2765 gfl->getFirstNChunksFromList(nn, &fl_for_cur_sz);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2766 found = true;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2767 if (k > 1) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2768 // Update split death stats for the cur_sz-size blocks list:
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2769 // we increment the split death count by the number of blocks
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2770 // we just took from the cur_sz-size blocks list and which
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2771 // we will be splitting below.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2772 ssize_t deaths = gfl->split_deaths() +
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2773 fl_for_cur_sz.count();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2774 gfl->set_split_deaths(deaths);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2775 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2776 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2777 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2778 // Now transfer fl_for_cur_sz to fl. Common case, we hope, is k = 1.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2779 if (found) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2780 if (k == 1) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2781 fl->prepend(&fl_for_cur_sz);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2782 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2783 // Divide each block on fl_for_cur_sz up k ways.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2784 FreeChunk* fc;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2785 while ((fc = fl_for_cur_sz.get_chunk_at_head()) != NULL) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2786 // Must do this in reverse order, so that anybody attempting to
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2787 // access the main chunk sees it as a single free block until we
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2788 // change it.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2789 size_t fc_size = fc->size();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2790 assert(fc->is_free(), "Error");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2791 for (int i = k-1; i >= 0; i--) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2792 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz);
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2793 assert((i != 0) ||
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2794 ((fc == ffc) && ffc->is_free() &&
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2795 (ffc->size() == k*word_sz) && (fc_size == word_sz)),
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2796 "Counting error");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2797 ffc->set_size(word_sz);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2798 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads.
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2799 ffc->link_next(NULL);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2800 // Above must occur before BOT is updated below.
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2801 OrderAccess::storestore();
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2802 // splitting from the right, fc_size == i * word_sz
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2803 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2804 fc_size -= word_sz;
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2805 assert(fc_size == i*word_sz, "Error");
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2806 _bt.verify_not_unallocated((HeapWord*)ffc, word_sz);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2807 _bt.verify_single_block((HeapWord*)fc, fc_size);
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2808 _bt.verify_single_block((HeapWord*)ffc, word_sz);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2809 // Push this on "fl".
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2810 fl->return_chunk_at_head(ffc);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2811 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2812 // TRAP
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2813 assert(fl->tail()->next() == NULL, "List invariant.");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2814 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2815 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2816 // Update birth stats for this block size.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2817 size_t num = fl->count();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2818 MutexLockerEx x(_indexedFreeListParLocks[word_sz],
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2819 Mutex::_no_safepoint_check_flag);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2820 ssize_t births = _indexedFreeList[word_sz].split_births() + num;
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2821 _indexedFreeList[word_sz].set_split_births(births);
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2822 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 }
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2825 return found;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 }
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2827 }
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2828
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2829 FreeChunk* CompactibleFreeListSpace::get_n_way_chunk_to_split(size_t word_sz, size_t n) {
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2830
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 FreeChunk* fc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 FreeChunk* rem_fc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 size_t rem;
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 MutexLockerEx x(parDictionaryAllocLock(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 while (n > 0) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2838 fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()),
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
2839 FreeBlockDictionary<FreeChunk>::atLeast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 if (fc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 n--;
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 }
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2846 if (fc == NULL) return NULL;
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2847 // Otherwise, split up that block.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2848 assert((ssize_t)n >= 1, "Control point invariant");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2849 assert(fc->is_free(), "Error: should be a free block");
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2850 _bt.verify_single_block((HeapWord*)fc, fc->size());
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2851 const size_t nn = fc->size() / word_sz;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 n = MIN2(nn, n);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2853 assert((ssize_t)n >= 1, "Control point invariant");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 rem = fc->size() - n * word_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 // If there is a remainder, and it's too small, allocate one fewer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 if (rem > 0 && rem < MinChunkSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 n--; rem += word_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 }
1148
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2859 // Note that at this point we may have n == 0.
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2860 assert((ssize_t)n >= 0, "Control point invariant");
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2861
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2862 // If n is 0, the chunk fc that was found is not large
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2863 // enough to leave a viable remainder. We are unable to
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2864 // allocate even one block. Return fc to the
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2865 // dictionary and return, leaving "fl" empty.
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2866 if (n == 0) {
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2867 returnChunkToDictionary(fc);
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2868 return NULL;
1148
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2869 }
05b775309e59 6912018: CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
jmasa
parents: 1145
diff changeset
2870
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2871 _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2872 dictionary()->dict_census_update(fc->size(),
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2873 true /*split*/,
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2874 false /*birth*/);
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2875
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 // First return the remainder, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 // Note that we hold the lock until we decide if we're going to give
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2878 // back the remainder to the dictionary, since a concurrent allocation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 // may otherwise see the heap as empty. (We're willing to take that
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 // hit if the block is a small block.)
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 if (rem > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 size_t prefix_size = n * word_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 rem_fc = (FreeChunk*)((HeapWord*)fc + prefix_size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2884 rem_fc->set_size(rem);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2885 rem_fc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads.
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2886 rem_fc->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 // Above must occur before BOT is updated below.
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2888 assert((ssize_t)n > 0 && prefix_size > 0 && rem_fc > fc, "Error");
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2889 OrderAccess::storestore();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 _bt.split_block((HeapWord*)fc, fc->size(), prefix_size);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2891 assert(fc->is_free(), "Error");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2892 fc->set_size(prefix_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 if (rem >= IndexSetSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 returnChunkToDictionary(rem_fc);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6725
diff changeset
2895 dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 rem_fc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 // Otherwise, return it to the small list below.
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 if (rem_fc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 MutexLockerEx x(_indexedFreeListParLocks[rem],
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 _bt.verify_not_unallocated((HeapWord*)rem_fc, rem_fc->size());
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2905 _indexedFreeList[rem].return_chunk_at_head(rem_fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 smallSplitBirth(rem);
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 }
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2908 assert(n * word_sz == fc->size(),
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2909 err_msg("Chunk size " SIZE_FORMAT " is not exactly splittable by "
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2910 SIZE_FORMAT " sized chunks of size " SIZE_FORMAT,
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2911 fc->size(), n, word_sz));
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2912 return fc;
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2913 }
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2914
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2915 void CompactibleFreeListSpace:: par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t targetted_number_of_chunks, AdaptiveFreeList<FreeChunk>* fl) {
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2916
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2917 FreeChunk* fc = get_n_way_chunk_to_split(word_sz, targetted_number_of_chunks);
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2918
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2919 if (fc == NULL) {
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2920 return;
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2921 }
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2922
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2923 size_t n = fc->size() / word_sz;
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2924
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2925 assert((ssize_t)n > 0, "Consistency");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 // Now do the splitting up.
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 // Must do this in reverse order, so that anybody attempting to
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 // access the main chunk sees it as a single free block until we
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // change it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 size_t fc_size = n * word_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 // All but first chunk in this loop
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 for (ssize_t i = n-1; i > 0; i--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2934 ffc->set_size(word_sz);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2935 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads.
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2936 ffc->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 // Above must occur before BOT is updated below.
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2938 OrderAccess::storestore();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 // splitting from the right, fc_size == (n - i + 1) * wordsize
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2940 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 fc_size -= word_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 _bt.verify_not_unallocated((HeapWord*)ffc, ffc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 _bt.verify_single_block((HeapWord*)ffc, ffc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 _bt.verify_single_block((HeapWord*)fc, fc_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 // Push this on "fl".
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2946 fl->return_chunk_at_head(ffc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 // First chunk
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2949 assert(fc->is_free() && fc->size() == n*word_sz, "Error: should still be a free block");
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
2950 // The blocks above should show their new sizes before the first block below
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2951 fc->set_size(word_sz);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2952 fc->link_prev(NULL); // idempotent wrt free-ness, see assert above
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2953 fc->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 _bt.verify_not_unallocated((HeapWord*)fc, fc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 _bt.verify_single_block((HeapWord*)fc, fc->size());
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2956 fl->return_chunk_at_head(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2957
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2958 assert((ssize_t)n > 0 && (ssize_t)n == fl->count(), "Incorrect number of blocks");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2960 // Update the stats for this block size.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 MutexLockerEx x(_indexedFreeListParLocks[word_sz],
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 Mutex::_no_safepoint_check_flag);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2963 const ssize_t births = _indexedFreeList[word_sz].split_births() + n;
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
2964 _indexedFreeList[word_sz].set_split_births(births);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2965 // ssize_t new_surplus = _indexedFreeList[word_sz].surplus() + n;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
2966 // _indexedFreeList[word_sz].set_surplus(new_surplus);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 // TRAP
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 assert(fl->tail()->next() == NULL, "List invariant.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2972
20520
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2973 void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl) {
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2974 assert(fl->count() == 0, "Precondition.");
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2975 assert(word_sz < CompactibleFreeListSpace::IndexSetSize,
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2976 "Precondition");
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2977
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2978 if (par_get_chunk_of_blocks_IFL(word_sz, n, fl)) {
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2979 // Got it
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2980 return;
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2981 }
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2982
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2983 // Otherwise, we'll split a block from the dictionary.
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2984 par_get_chunk_of_blocks_dictionary(word_sz, n, fl);
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2985 }
4001310db3f5 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 20266
diff changeset
2986
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 // Set up the space's par_seq_tasks structure for work claiming
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 // for parallel rescan. See CMSParRemarkTask where this is currently used.
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 // XXX Need to suitably abstract and generalize this and the next
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 // method into one.
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 void
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 CompactibleFreeListSpace::
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 initialize_sequential_subtasks_for_rescan(int n_threads) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 // The "size" of each task is fixed according to rescan_task_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 assert(n_threads > 0, "Unexpected n_threads argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 const size_t task_size = rescan_task_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 size_t n_tasks = (used_region().word_size() + task_size - 1)/task_size;
340
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
2998 assert((n_tasks == 0) == used_region().is_empty(), "n_tasks incorrect");
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
2999 assert(n_tasks == 0 ||
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
3000 ((used_region().start() + (n_tasks - 1)*task_size < used_region().end()) &&
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
3001 (used_region().start() + n_tasks*task_size >= used_region().end())),
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
3002 "n_tasks calculation incorrect");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 SequentialSubTasksDone* pst = conc_par_seq_tasks();
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 assert(!pst->valid(), "Clobbering existing data?");
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3005 // Sets the condition for completion of the subtask (how many threads
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3006 // need to finish in order to be done).
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3007 pst->set_n_threads(n_threads);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 pst->set_n_tasks((int)n_tasks);
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3010
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 // Set up the space's par_seq_tasks structure for work claiming
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 // for parallel concurrent marking. See CMSConcMarkTask where this is currently used.
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 void
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 CompactibleFreeListSpace::
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 initialize_sequential_subtasks_for_marking(int n_threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 HeapWord* low) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 // The "size" of each task is fixed according to rescan_task_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 assert(n_threads > 0, "Unexpected n_threads argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 const size_t task_size = marking_task_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 assert(task_size > CardTableModRefBS::card_size_in_words &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 (task_size % CardTableModRefBS::card_size_in_words == 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 "Otherwise arithmetic below would be incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 MemRegion span = _gen->reserved();
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 if (low != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 if (span.contains(low)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 // Align low down to a card boundary so that
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 // we can use block_offset_careful() on span boundaries.
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 HeapWord* aligned_low = (HeapWord*)align_size_down((uintptr_t)low,
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 CardTableModRefBS::card_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 // Clip span prefix at aligned_low
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 span = span.intersection(MemRegion(aligned_low, span.end()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 } else if (low > span.end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 span = MemRegion(low, low); // Null region
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 } // else use entire span
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 assert(span.is_empty() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 ((uintptr_t)span.start() % CardTableModRefBS::card_size == 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 "span should start at a card boundary");
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 size_t n_tasks = (span.word_size() + task_size - 1)/task_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 assert((n_tasks == 0) == span.is_empty(), "Inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 assert(n_tasks == 0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 ((span.start() + (n_tasks - 1)*task_size < span.end()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 (span.start() + n_tasks*task_size >= span.end())),
340
ebeb6490b814 6722116: CMS: Incorrect overflow handling when using parallel concurrent marking
ysr
parents: 269
diff changeset
3044 "n_tasks calculation incorrect");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 SequentialSubTasksDone* pst = conc_par_seq_tasks();
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 assert(!pst->valid(), "Clobbering existing data?");
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3047 // Sets the condition for completion of the subtask (how many threads
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3048 // need to finish in order to be done).
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1777
diff changeset
3049 pst->set_n_threads(n_threads);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3050 pst->set_n_tasks((int)n_tasks);
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 }