annotate src/share/vm/memory/freeList.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 7baf47cb97cb
children 7848fc12602b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17467
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: 1145
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1145
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: 1145
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: 1777
diff changeset
25 #include "precompiled.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
26 #include "memory/freeBlockDictionary.hpp"
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
27 #include "memory/freeList.hpp"
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
28 #include "memory/metachunk.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
29 #include "memory/sharedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
30 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
31 #include "runtime/mutex.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
32 #include "runtime/vmThread.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6885
diff changeset
33 #include "utilities/macros.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6885
diff changeset
35 #if INCLUDE_ALL_GCS
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
36 #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6885
diff changeset
37 #endif // INCLUDE_ALL_GCS
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
38
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Free list. A FreeList is used to access a linked list of chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // of space in the heap. The head and tail are maintained so that
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // items can be (as in the current implementation) added at the
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // at the tail of the list and removed from the head of the list to
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // maintain a FIFO queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
44
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
45 template <class Chunk>
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
46 FreeList<Chunk>::FreeList() :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _head(NULL), _tail(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
48 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
49 , _protecting_lock(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
51 {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
56 template <class Chunk>
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
57 void FreeList<Chunk>::link_head(Chunk* v) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
58 assert_proper_lock_protection();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
59 set_head(v);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
60 // If this method is not used (just set the head instead),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
61 // this check can be avoided.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
62 if (v != NULL) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
63 v->link_prev(NULL);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
64 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
65 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
66
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
67
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
68
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
69 template <class Chunk>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
70 void FreeList<Chunk>::reset() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
71 // Don't set the _size to 0 because this method is
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
72 // used with a existing list that has a size but which has
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
73 // been emptied.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
74 // Don't clear the _protecting_lock of an existing list.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75 set_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 set_head(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 set_tail(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
80 template <class Chunk>
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
81 void FreeList<Chunk>::initialize() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
82 #ifdef ASSERT
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
83 // Needed early because it might be checked in other initializing code.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
84 set_protecting_lock(NULL);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
85 #endif
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
86 reset();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
87 set_size(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
90 template <class Chunk_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
91 Chunk_t* FreeList<Chunk_t>::get_chunk_at_head() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
93 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
94 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
95 Chunk_t* fc = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 if (fc != NULL) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
97 Chunk_t* nextFC = fc->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (nextFC != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // The chunk fc being removed has a "next". Set the "next" to the
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // "prev" of fc.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
101 nextFC->link_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
102 } else { // removed tail of list
a61af66fc99e Initial load
duke
parents:
diff changeset
103 link_tail(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 link_head(nextFC);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 decrement_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
110 return fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
114 template <class Chunk>
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
115 void FreeList<Chunk>::getFirstNChunksFromList(size_t n, FreeList<Chunk>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 assert(fl->count() == 0, "Precondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (count() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 int k = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 fl->set_head(head()); n--;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
121 Chunk* tl = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 while (tl->next() != NULL && n > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 tl = tl->next(); n--; k++;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 assert(tl != NULL, "Loop Inv.");
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // First, fix up the list we took from.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
128 Chunk* new_head = tl->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 set_head(new_head);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 set_count(count() - k);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (new_head == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 set_tail(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
134 new_head->link_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Now we can fix up the tail.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
137 tl->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // And return the result.
a61af66fc99e Initial load
duke
parents:
diff changeset
139 fl->set_tail(tl);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 fl->set_count(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Remove this chunk from the list
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
145 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
146 void FreeList<Chunk>::remove_chunk(Chunk*fc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 assert(head() != NULL, "Remove from empty list");
a61af66fc99e Initial load
duke
parents:
diff changeset
149 assert(fc != NULL, "Remove a NULL chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 assert(size() == fc->size(), "Wrong list");
a61af66fc99e Initial load
duke
parents:
diff changeset
151 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
153
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
154 Chunk* prevFC = fc->prev();
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
155 Chunk* nextFC = fc->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (nextFC != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // The chunk fc being removed has a "next". Set the "next" to the
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // "prev" of fc.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
159 nextFC->link_prev(prevFC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 } else { // removed tail of list
a61af66fc99e Initial load
duke
parents:
diff changeset
161 link_tail(prevFC);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 if (prevFC == NULL) { // removed head of list
a61af66fc99e Initial load
duke
parents:
diff changeset
164 link_head(nextFC);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 assert(nextFC == NULL || nextFC->prev() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
166 "Prev of head should be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
167 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
168 prevFC->link_next(nextFC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(tail() != prevFC || prevFC->next() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
170 "Next of tail should be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 decrement_count();
1777
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1552
diff changeset
173 assert(((head() == NULL) + (tail() == NULL) + (count() == 0)) % 3 == 0,
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1552
diff changeset
174 "H/T/C Inconsistency");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // clear next and prev fields of fc, debug only
a61af66fc99e Initial load
duke
parents:
diff changeset
176 NOT_PRODUCT(
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
177 fc->link_prev(NULL);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
178 fc->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 )
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
180 assert(fc->is_free(), "Should still be a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
182 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert(head() == NULL || head()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(tail() == NULL || tail()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Add this chunk at the head of the list.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
188 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
189 void FreeList<Chunk>::return_chunk_at_head(Chunk* chunk, bool record_return) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 assert(chunk != NULL, "insert a NULL chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
192 assert(size() == chunk->size(), "Wrong size");
a61af66fc99e Initial load
duke
parents:
diff changeset
193 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
195
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
196 Chunk* oldHead = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 assert(chunk != oldHead, "double insertion");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
198 chunk->link_after(oldHead);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 link_head(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (oldHead == NULL) { // only chunk in list
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert(tail() == NULL, "inconsistent FreeList");
a61af66fc99e Initial load
duke
parents:
diff changeset
202 link_tail(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 increment_count(); // of # of chunks in list
a61af66fc99e Initial load
duke
parents:
diff changeset
205 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
207 assert(head() == NULL || head()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
208 assert(tail() == NULL || tail()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
211 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
212 void FreeList<Chunk>::return_chunk_at_head(Chunk* chunk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert_proper_lock_protection();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
214 return_chunk_at_head(chunk, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Add this chunk at the tail of the list.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
218 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
219 void FreeList<Chunk>::return_chunk_at_tail(Chunk* chunk, bool record_return) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
222 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 assert(chunk != NULL, "insert a NULL chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
224 assert(size() == chunk->size(), "wrong size");
a61af66fc99e Initial load
duke
parents:
diff changeset
225
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
226 Chunk* oldTail = tail();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 assert(chunk != oldTail, "double insertion");
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if (oldTail != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
229 oldTail->link_after(chunk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 } else { // only chunk in list
a61af66fc99e Initial load
duke
parents:
diff changeset
231 assert(head() == NULL, "inconsistent FreeList");
a61af66fc99e Initial load
duke
parents:
diff changeset
232 link_head(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 link_tail(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 increment_count(); // of # of chunks in list
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
237 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
238 assert(head() == NULL || head()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert(tail() == NULL || tail()->size() == size(), "wrong item on list");
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
242 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
243 void FreeList<Chunk>::return_chunk_at_tail(Chunk* chunk) {
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
244 return_chunk_at_tail(chunk, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
247 template <class Chunk>
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
248 void FreeList<Chunk>::prepend(FreeList<Chunk>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert_proper_lock_protection();
a61af66fc99e Initial load
duke
parents:
diff changeset
250 if (fl->count() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if (count() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 set_head(fl->head());
a61af66fc99e Initial load
duke
parents:
diff changeset
253 set_tail(fl->tail());
a61af66fc99e Initial load
duke
parents:
diff changeset
254 set_count(fl->count());
a61af66fc99e Initial load
duke
parents:
diff changeset
255 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Both are non-empty.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
257 Chunk* fl_tail = fl->tail();
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
258 Chunk* this_head = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 assert(fl_tail->next() == NULL, "Well-formedness of fl");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
260 fl_tail->link_next(this_head);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
261 this_head->link_prev(fl_tail);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 set_head(fl->head());
a61af66fc99e Initial load
duke
parents:
diff changeset
263 set_count(count() + fl->count());
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 fl->set_head(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 fl->set_tail(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 fl->set_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
271 // verify_chunk_in_free_lists() is used to verify that an item is in this free list.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // It is used as a debugging aid.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
273 template <class Chunk>
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
274 bool FreeList<Chunk>::verify_chunk_in_free_list(Chunk* fc) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // This is an internal consistency check, not part of the check that the
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // chunk is in the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 guarantee(fc->size() == size(), "Wrong list is being searched");
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
278 Chunk* curFC = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 while (curFC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // This is an internal consistency check.
a61af66fc99e Initial load
duke
parents:
diff changeset
281 guarantee(size() == curFC->size(), "Chunk is in wrong list.");
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (fc == curFC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 curFC = curFC->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 #ifndef PRODUCT
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
291 template <class Chunk>
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
292 void FreeList<Chunk>::assert_proper_lock_protection_work() const {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
293 assert(protecting_lock() != NULL, "Don't call this directly");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
294 assert(ParallelGCThreads > 0, "Don't call this directly");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
295 Thread* thr = Thread::current();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
296 if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
297 // assert that we are holding the freelist lock
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
298 } else if (thr->is_GC_task_thread()) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
299 assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
300 } else if (thr->is_Java_thread()) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
301 assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
302 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 196
diff changeset
303 ShouldNotReachHere(); // unaccounted thread type?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 #endif
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
307
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
308 // Print the "label line" for free list stats.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
309 template <class Chunk>
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
310 void FreeList<Chunk>::print_labels_on(outputStream* st, const char* c) {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
311 st->print("%16s\t", c);
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
312 st->print("%14s\t" "%14s\t" "%14s\t" "%14s\t" "%14s\t"
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
313 "%14s\t" "%14s\t" "%14s\t" "%14s\t" "%14s\t" "\n",
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
314 "bfrsurp", "surplus", "desired", "prvSwep", "bfrSwep",
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
315 "count", "cBirths", "cDeaths", "sBirths", "sDeaths");
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
316 }
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
317
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
318 // Print the AllocationStats for the given free list. If the second argument
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
319 // to the call is a non-null string, it is printed in the first column;
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
320 // otherwise, if the argument is null (the default), then the size of the
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
321 // (free list) block is printed in the first column.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
322 template <class Chunk_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
323 void FreeList<Chunk_t>::print_on(outputStream* st, const char* c) const {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
324 if (c != NULL) {
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
325 st->print("%16s", c);
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
326 } else {
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
327 st->print(SIZE_FORMAT_W(16), size());
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
328 }
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
329 }
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
330
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
331 template class FreeList<Metablock>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
332 template class FreeList<Metachunk>;
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6885
diff changeset
333 #if INCLUDE_ALL_GCS
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 3775
diff changeset
334 template class FreeList<FreeChunk>;
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 6885
diff changeset
335 #endif // INCLUDE_ALL_GCS