Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 23569:f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
Summary: The crash was caused by a faulty eager humongous reclaim. The reason for reclaiming a live object was that the call to cleanupHRRS was done after dirtying cards and clearing the remembered sets for the humongous object. This could lead to one or many cards being missed.
Reviewed-by: tbenson, kbarrett, tschatzl
author | dbuck |
---|---|
date | Tue, 19 Jan 2016 18:16:40 +0000 |
parents | 047a642c9729 |
children | 8daf136b3218 |
rev | line source |
---|---|
342 | 1 /* |
22936 | 2 * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1547
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1547
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:
1547
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
25 #if !defined(__clang_major__) && defined(__GNUC__) |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
26 #define ATTRIBUTE_PRINTF(x,y) // FIXME, formats are a mess. |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
27 #endif |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
28 |
1972 | 29 #include "precompiled.hpp" |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
30 #include "classfile/metadataOnStackMark.hpp" |
12080 | 31 #include "code/codeCache.hpp" |
1972 | 32 #include "code/icBuffer.hpp" |
33 #include "gc_implementation/g1/bufferingOopClosure.hpp" | |
34 #include "gc_implementation/g1/concurrentG1Refine.hpp" | |
35 #include "gc_implementation/g1/concurrentG1RefineThread.hpp" | |
36 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp" | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
37 #include "gc_implementation/g1/g1AllocRegion.inline.hpp" |
1972 | 38 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" |
39 #include "gc_implementation/g1/g1CollectorPolicy.hpp" | |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
40 #include "gc_implementation/g1/g1ErgoVerbose.hpp" |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
41 #include "gc_implementation/g1/g1EvacFailure.hpp" |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
42 #include "gc_implementation/g1/g1GCPhaseTimes.hpp" |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
43 #include "gc_implementation/g1/g1Log.hpp" |
1972 | 44 #include "gc_implementation/g1/g1MarkSweep.hpp" |
45 #include "gc_implementation/g1/g1OopClosures.inline.hpp" | |
20223
b0c374311c4e
8035400: Move G1ParScanThreadState into its own files
tschatzl
parents:
20217
diff
changeset
|
46 #include "gc_implementation/g1/g1ParScanThreadState.inline.hpp" |
20337 | 47 #include "gc_implementation/g1/g1RegionToSpaceMapper.hpp" |
1972 | 48 #include "gc_implementation/g1/g1RemSet.inline.hpp" |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
49 #include "gc_implementation/g1/g1RootProcessor.hpp" |
17764 | 50 #include "gc_implementation/g1/g1StringDedup.hpp" |
10405 | 51 #include "gc_implementation/g1/g1YCTypes.hpp" |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
52 #include "gc_implementation/g1/heapRegion.inline.hpp" |
1972 | 53 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
54 #include "gc_implementation/g1/heapRegionSet.inline.hpp" |
1972 | 55 #include "gc_implementation/g1/vm_operations_g1.hpp" |
10405 | 56 #include "gc_implementation/shared/gcHeapSummary.hpp" |
57 #include "gc_implementation/shared/gcTimer.hpp" | |
58 #include "gc_implementation/shared/gcTrace.hpp" | |
59 #include "gc_implementation/shared/gcTraceTime.hpp" | |
1972 | 60 #include "gc_implementation/shared/isGCActiveMark.hpp" |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
61 #include "memory/allocation.hpp" |
1972 | 62 #include "memory/gcLocker.inline.hpp" |
63 #include "memory/generationSpec.hpp" | |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
64 #include "memory/iterator.hpp" |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
65 #include "memory/referenceProcessor.hpp" |
1972 | 66 #include "oops/oop.inline.hpp" |
67 #include "oops/oop.pcgc.inline.hpp" | |
20197
ce8f6bb717c9
8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents:
20192
diff
changeset
|
68 #include "runtime/orderAccess.inline.hpp" |
1972 | 69 #include "runtime/vmThread.hpp" |
342 | 70 |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
71 size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0; |
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
72 |
342 | 73 // turn it on so that the contents of the young list (scan-only / |
74 // to-be-collected) are printed at "strategic" points before / during | |
75 // / after the collection --- this is useful for debugging | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
76 #define YOUNG_LIST_VERBOSE 0 |
342 | 77 // CURRENT STATUS |
78 // This file is under construction. Search for "FIXME". | |
79 | |
80 // INVARIANTS/NOTES | |
81 // | |
82 // All allocation activity covered by the G1CollectedHeap interface is | |
1973 | 83 // serialized by acquiring the HeapLock. This happens in mem_allocate |
84 // and allocate_new_tlab, which are the "entry" points to the | |
85 // allocation code from the rest of the JVM. (Note that this does not | |
86 // apply to TLAB allocation, which is not part of this interface: it | |
87 // is done by clients of this interface.) | |
342 | 88 |
89 // Local to this file. | |
90 | |
91 class RefineCardTableEntryClosure: public CardTableEntryClosure { | |
92 bool _concurrent; | |
93 public: | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
94 RefineCardTableEntryClosure() : _concurrent(true) { } |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
95 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
96 bool do_card_ptr(jbyte* card_ptr, uint worker_i) { |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
97 bool oops_into_cset = G1CollectedHeap::heap()->g1_rem_set()->refine_card(card_ptr, worker_i, false); |
1705 | 98 // This path is executed by the concurrent refine or mutator threads, |
99 // concurrently, and so we do not care if card_ptr contains references | |
100 // that point into the collection set. | |
101 assert(!oops_into_cset, "should be"); | |
102 | |
20192 | 103 if (_concurrent && SuspendibleThreadSet::should_yield()) { |
342 | 104 // Caller will actually yield. |
105 return false; | |
106 } | |
107 // Otherwise, we finished successfully; return true. | |
108 return true; | |
109 } | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
110 |
342 | 111 void set_concurrent(bool b) { _concurrent = b; } |
112 }; | |
113 | |
114 | |
115 class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure { | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
116 size_t _num_processed; |
342 | 117 CardTableModRefBS* _ctbs; |
118 int _histo[256]; | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
119 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
120 public: |
342 | 121 ClearLoggedCardTableEntryClosure() : |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
122 _num_processed(0), _ctbs(G1CollectedHeap::heap()->g1_barrier_set()) |
342 | 123 { |
124 for (int i = 0; i < 256; i++) _histo[i] = 0; | |
125 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
126 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
127 bool do_card_ptr(jbyte* card_ptr, uint worker_i) { |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
128 unsigned char* ujb = (unsigned char*)card_ptr; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
129 int ind = (int)(*ujb); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
130 _histo[ind]++; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
131 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
132 *card_ptr = (jbyte)CardTableModRefBS::clean_card_val(); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
133 _num_processed++; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
134 |
342 | 135 return true; |
136 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
137 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
138 size_t num_processed() { return _num_processed; } |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
139 |
342 | 140 void print_histo() { |
141 gclog_or_tty->print_cr("Card table value histogram:"); | |
142 for (int i = 0; i < 256; i++) { | |
143 if (_histo[i] != 0) { | |
144 gclog_or_tty->print_cr(" %d: %d", i, _histo[i]); | |
145 } | |
146 } | |
147 } | |
148 }; | |
149 | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
150 class RedirtyLoggedCardTableEntryClosure : public CardTableEntryClosure { |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
151 private: |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
152 size_t _num_processed; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
153 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
154 public: |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
155 RedirtyLoggedCardTableEntryClosure() : CardTableEntryClosure(), _num_processed(0) { } |
12343 | 156 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
157 bool do_card_ptr(jbyte* card_ptr, uint worker_i) { |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
158 *card_ptr = CardTableModRefBS::dirty_card_val(); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
159 _num_processed++; |
342 | 160 return true; |
161 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
162 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
163 size_t num_processed() const { return _num_processed; } |
342 | 164 }; |
165 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
166 YoungList::YoungList(G1CollectedHeap* g1h) : |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
167 _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0), |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
168 _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
169 guarantee(check_list_empty(false), "just making sure..."); |
342 | 170 } |
171 | |
172 void YoungList::push_region(HeapRegion *hr) { | |
173 assert(!hr->is_young(), "should not already be young"); | |
174 assert(hr->get_next_young_region() == NULL, "cause it should!"); | |
175 | |
176 hr->set_next_young_region(_head); | |
177 _head = hr; | |
178 | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
179 _g1h->g1_policy()->set_region_eden(hr, (int) _length); |
342 | 180 ++_length; |
181 } | |
182 | |
183 void YoungList::add_survivor_region(HeapRegion* hr) { | |
545 | 184 assert(hr->is_survivor(), "should be flagged as survivor region"); |
342 | 185 assert(hr->get_next_young_region() == NULL, "cause it should!"); |
186 | |
187 hr->set_next_young_region(_survivor_head); | |
188 if (_survivor_head == NULL) { | |
545 | 189 _survivor_tail = hr; |
342 | 190 } |
191 _survivor_head = hr; | |
192 ++_survivor_length; | |
193 } | |
194 | |
195 void YoungList::empty_list(HeapRegion* list) { | |
196 while (list != NULL) { | |
197 HeapRegion* next = list->get_next_young_region(); | |
198 list->set_next_young_region(NULL); | |
199 list->uninstall_surv_rate_group(); | |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
200 // This is called before a Full GC and all the non-empty / |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
201 // non-humongous regions at the end of the Full GC will end up as |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
202 // old anyway. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
203 list->set_old(); |
342 | 204 list = next; |
205 } | |
206 } | |
207 | |
208 void YoungList::empty_list() { | |
209 assert(check_list_well_formed(), "young list should be well formed"); | |
210 | |
211 empty_list(_head); | |
212 _head = NULL; | |
213 _length = 0; | |
214 | |
215 empty_list(_survivor_head); | |
216 _survivor_head = NULL; | |
545 | 217 _survivor_tail = NULL; |
342 | 218 _survivor_length = 0; |
219 | |
220 _last_sampled_rs_lengths = 0; | |
221 | |
222 assert(check_list_empty(false), "just making sure..."); | |
223 } | |
224 | |
225 bool YoungList::check_list_well_formed() { | |
226 bool ret = true; | |
227 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
228 uint length = 0; |
342 | 229 HeapRegion* curr = _head; |
230 HeapRegion* last = NULL; | |
231 while (curr != NULL) { | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
232 if (!curr->is_young()) { |
342 | 233 gclog_or_tty->print_cr("### YOUNG REGION "PTR_FORMAT"-"PTR_FORMAT" " |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
234 "incorrectly tagged (y: %d, surv: %d)", |
342 | 235 curr->bottom(), curr->end(), |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
236 curr->is_young(), curr->is_survivor()); |
342 | 237 ret = false; |
238 } | |
239 ++length; | |
240 last = curr; | |
241 curr = curr->get_next_young_region(); | |
242 } | |
243 ret = ret && (length == _length); | |
244 | |
245 if (!ret) { | |
246 gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!"); | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
247 gclog_or_tty->print_cr("### list has %u entries, _length is %u", |
342 | 248 length, _length); |
249 } | |
250 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
251 return ret; |
342 | 252 } |
253 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
254 bool YoungList::check_list_empty(bool check_sample) { |
342 | 255 bool ret = true; |
256 | |
257 if (_length != 0) { | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
258 gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u", |
342 | 259 _length); |
260 ret = false; | |
261 } | |
262 if (check_sample && _last_sampled_rs_lengths != 0) { | |
263 gclog_or_tty->print_cr("### YOUNG LIST has non-zero last sampled RS lengths"); | |
264 ret = false; | |
265 } | |
266 if (_head != NULL) { | |
267 gclog_or_tty->print_cr("### YOUNG LIST does not have a NULL head"); | |
268 ret = false; | |
269 } | |
270 if (!ret) { | |
271 gclog_or_tty->print_cr("### YOUNG LIST does not seem empty"); | |
272 } | |
273 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
274 return ret; |
342 | 275 } |
276 | |
277 void | |
278 YoungList::rs_length_sampling_init() { | |
279 _sampled_rs_lengths = 0; | |
280 _curr = _head; | |
281 } | |
282 | |
283 bool | |
284 YoungList::rs_length_sampling_more() { | |
285 return _curr != NULL; | |
286 } | |
287 | |
288 void | |
289 YoungList::rs_length_sampling_next() { | |
290 assert( _curr != NULL, "invariant" ); | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
291 size_t rs_length = _curr->rem_set()->occupied(); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
292 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
293 _sampled_rs_lengths += rs_length; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
294 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
295 // The current region may not yet have been added to the |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
296 // incremental collection set (it gets added when it is |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
297 // retired as the current allocation region). |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
298 if (_curr->in_collection_set()) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
299 // Update the collection set policy information for this region |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
300 _g1h->g1_policy()->update_incremental_cset_info(_curr, rs_length); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
301 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
302 |
342 | 303 _curr = _curr->get_next_young_region(); |
304 if (_curr == NULL) { | |
305 _last_sampled_rs_lengths = _sampled_rs_lengths; | |
306 // gclog_or_tty->print_cr("last sampled RS lengths = %d", _last_sampled_rs_lengths); | |
307 } | |
308 } | |
309 | |
310 void | |
311 YoungList::reset_auxilary_lists() { | |
312 guarantee( is_empty(), "young list should be empty" ); | |
313 assert(check_list_well_formed(), "young list should be well formed"); | |
314 | |
315 // Add survivor regions to SurvRateGroup. | |
316 _g1h->g1_policy()->note_start_adding_survivor_regions(); | |
545 | 317 _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
318 |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
319 int young_index_in_cset = 0; |
342 | 320 for (HeapRegion* curr = _survivor_head; |
321 curr != NULL; | |
322 curr = curr->get_next_young_region()) { | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
323 _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
324 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
325 // The region is a non-empty survivor so let's add it to |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
326 // the incremental collection set for the next evacuation |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
327 // pause. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
328 _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr); |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
329 young_index_in_cset += 1; |
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
330 } |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
331 assert((uint) young_index_in_cset == _survivor_length, "post-condition"); |
342 | 332 _g1h->g1_policy()->note_stop_adding_survivor_regions(); |
333 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
334 _head = _survivor_head; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
335 _length = _survivor_length; |
342 | 336 if (_survivor_head != NULL) { |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
337 assert(_survivor_tail != NULL, "cause it shouldn't be"); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
338 assert(_survivor_length > 0, "invariant"); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
339 _survivor_tail->set_next_young_region(NULL); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
340 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
341 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
342 // Don't clear the survivor list handles until the start of |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
343 // the next evacuation pause - we need it in order to re-tag |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
344 // the survivor regions from this evacuation pause as 'young' |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
345 // at the start of the next. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
346 |
545 | 347 _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */); |
342 | 348 |
349 assert(check_list_well_formed(), "young list should be well formed"); | |
350 } | |
351 | |
352 void YoungList::print() { | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
353 HeapRegion* lists[] = {_head, _survivor_head}; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
354 const char* names[] = {"YOUNG", "SURVIVOR"}; |
342 | 355 |
22936 | 356 for (uint list = 0; list < ARRAY_SIZE(lists); ++list) { |
342 | 357 gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]); |
358 HeapRegion *curr = lists[list]; | |
359 if (curr == NULL) | |
360 gclog_or_tty->print_cr(" empty"); | |
361 while (curr != NULL) { | |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
362 gclog_or_tty->print_cr(" "HR_FORMAT", P: "PTR_FORMAT ", N: "PTR_FORMAT", age: %4d", |
6027
8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents:
6011
diff
changeset
|
363 HR_FORMAT_PARAMS(curr), |
342 | 364 curr->prev_top_at_mark_start(), |
365 curr->next_top_at_mark_start(), | |
6027
8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents:
6011
diff
changeset
|
366 curr->age_in_surv_rate_group_cond()); |
342 | 367 curr = curr->get_next_young_region(); |
368 } | |
369 } | |
370 | |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
371 gclog_or_tty->cr(); |
342 | 372 } |
373 | |
20337 | 374 void G1RegionMappingChangedListener::reset_from_card_cache(uint start_idx, size_t num_regions) { |
375 OtherRegionsTable::invalidate(start_idx, num_regions); | |
376 } | |
377 | |
20543 | 378 void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_regions, bool zero_filled) { |
379 // The from card cache is not the memory that is actually committed. So we cannot | |
380 // take advantage of the zero_filled parameter. | |
20337 | 381 reset_from_card_cache(start_idx, num_regions); |
382 } | |
383 | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
384 void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
385 { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
386 // Claim the right to put the region on the dirty cards region list |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
387 // by installing a self pointer. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
388 HeapRegion* next = hr->get_next_dirty_cards_region(); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
389 if (next == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
390 HeapRegion* res = (HeapRegion*) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
391 Atomic::cmpxchg_ptr(hr, hr->next_dirty_cards_region_addr(), |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
392 NULL); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
393 if (res == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
394 HeapRegion* head; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
395 do { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
396 // Put the region to the dirty cards region list. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
397 head = _dirty_cards_region_list; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
398 next = (HeapRegion*) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
399 Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
400 if (next == head) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
401 assert(hr->get_next_dirty_cards_region() == hr, |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
402 "hr->get_next_dirty_cards_region() != hr"); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
403 if (next == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
404 // The last region in the list points to itself. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
405 hr->set_next_dirty_cards_region(hr); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
406 } else { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
407 hr->set_next_dirty_cards_region(next); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
408 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
409 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
410 } while (next != head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
411 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
412 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
413 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
414 |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
415 HeapRegion* G1CollectedHeap::pop_dirty_cards_region() |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
416 { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
417 HeapRegion* head; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
418 HeapRegion* hr; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
419 do { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
420 head = _dirty_cards_region_list; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
421 if (head == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
422 return NULL; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
423 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
424 HeapRegion* new_head = head->get_next_dirty_cards_region(); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
425 if (head == new_head) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
426 // The last region. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
427 new_head = NULL; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
428 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
429 hr = (HeapRegion*)Atomic::cmpxchg_ptr(new_head, &_dirty_cards_region_list, |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
430 head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
431 } while (hr != head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
432 assert(hr != NULL, "invariant"); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
433 hr->set_next_dirty_cards_region(NULL); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
434 return hr; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
435 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
436 |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
437 #ifdef ASSERT |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
438 // A region is added to the collection set as it is retired |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
439 // so an address p can point to a region which will be in the |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
440 // collection set but has not yet been retired. This method |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
441 // therefore is only accurate during a GC pause after all |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
442 // regions have been retired. It is used for debugging |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
443 // to check if an nmethod has references to objects that can |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
444 // be move during a partial collection. Though it can be |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
445 // inaccurate, it is sufficient for G1 because the conservative |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
446 // implementation of is_scavengable() for G1 will indicate that |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
447 // all nmethods must be scanned during a partial collection. |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
448 bool G1CollectedHeap::is_in_partial_collection(const void* p) { |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
449 if (p == NULL) { |
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
450 return false; |
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
451 } |
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
452 return heap_region_containing(p)->in_collection_set(); |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
453 } |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
454 #endif |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
455 |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
456 // Returns true if the reference points to an object that |
10405 | 457 // can move in an incremental collection. |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
458 bool G1CollectedHeap::is_scavengable(const void* p) { |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
459 HeapRegion* hr = heap_region_containing(p); |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
460 return !hr->isHumongous(); |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
461 } |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
462 |
342 | 463 void G1CollectedHeap::check_ct_logs_at_safepoint() { |
464 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); | |
12343 | 465 CardTableModRefBS* ct_bs = g1_barrier_set(); |
342 | 466 |
467 // Count the dirty cards at the start. | |
468 CountNonCleanMemRegionClosure count1(this); | |
469 ct_bs->mod_card_iterate(&count1); | |
470 int orig_count = count1.n(); | |
471 | |
472 // First clear the logged cards. | |
473 ClearLoggedCardTableEntryClosure clear; | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
474 dcqs.apply_closure_to_all_completed_buffers(&clear); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
475 dcqs.iterate_closure_all_threads(&clear, false); |
342 | 476 clear.print_histo(); |
477 | |
478 // Now ensure that there's no dirty cards. | |
479 CountNonCleanMemRegionClosure count2(this); | |
480 ct_bs->mod_card_iterate(&count2); | |
481 if (count2.n() != 0) { | |
482 gclog_or_tty->print_cr("Card table has %d entries; %d originally", | |
483 count2.n(), orig_count); | |
484 } | |
485 guarantee(count2.n() == 0, "Card table should be clean."); | |
486 | |
487 RedirtyLoggedCardTableEntryClosure redirty; | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
488 dcqs.apply_closure_to_all_completed_buffers(&redirty); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
489 dcqs.iterate_closure_all_threads(&redirty, false); |
342 | 490 gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.", |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
491 clear.num_processed(), orig_count); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
492 guarantee(redirty.num_processed() == clear.num_processed(), |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
493 err_msg("Redirtied "SIZE_FORMAT" cards, bug cleared "SIZE_FORMAT, |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
494 redirty.num_processed(), clear.num_processed())); |
342 | 495 |
496 CountNonCleanMemRegionClosure count3(this); | |
497 ct_bs->mod_card_iterate(&count3); | |
498 if (count3.n() != orig_count) { | |
499 gclog_or_tty->print_cr("Should have restored them all: orig = %d, final = %d.", | |
500 orig_count, count3.n()); | |
501 guarantee(count3.n() >= orig_count, "Should have restored them all."); | |
502 } | |
503 } | |
504 | |
505 // Private class members. | |
506 | |
507 G1CollectedHeap* G1CollectedHeap::_g1h; | |
508 | |
509 // Private methods. | |
510 | |
2152 | 511 HeapRegion* |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
512 G1CollectedHeap::new_region_try_secondary_free_list(bool is_old) { |
2152 | 513 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); |
514 while (!_secondary_free_list.is_empty() || free_regions_coming()) { | |
515 if (!_secondary_free_list.is_empty()) { | |
516 if (G1ConcRegionFreeingVerbose) { | |
517 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
518 "secondary_free_list has %u entries", |
2152 | 519 _secondary_free_list.length()); |
520 } | |
521 // It looks as if there are free regions available on the | |
522 // secondary_free_list. Let's move them to the free_list and try | |
523 // again to allocate from it. | |
524 append_secondary_free_list(); | |
525 | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
526 assert(_hrm.num_free_regions() > 0, "if the secondary_free_list was not " |
2152 | 527 "empty we should have moved at least one entry to the free_list"); |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
528 HeapRegion* res = _hrm.allocate_free_region(is_old); |
2152 | 529 if (G1ConcRegionFreeingVerbose) { |
530 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
531 "allocated "HR_FORMAT" from secondary_free_list", | |
532 HR_FORMAT_PARAMS(res)); | |
533 } | |
534 return res; | |
535 } | |
536 | |
10405 | 537 // Wait here until we get notified either when (a) there are no |
2152 | 538 // more free regions coming or (b) some regions have been moved on |
539 // the secondary_free_list. | |
540 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag); | |
541 } | |
542 | |
543 if (G1ConcRegionFreeingVerbose) { | |
544 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
545 "could not allocate from secondary_free_list"); | |
546 } | |
547 return NULL; | |
548 } | |
549 | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
550 HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool is_old, bool do_expand) { |
3986
65a8ff39a6da
7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents:
3983
diff
changeset
|
551 assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords, |
2152 | 552 "the only time we use this to allocate a humongous region is " |
553 "when we are allocating a single humongous region"); | |
554 | |
555 HeapRegion* res; | |
556 if (G1StressConcRegionFreeing) { | |
557 if (!_secondary_free_list.is_empty()) { | |
558 if (G1ConcRegionFreeingVerbose) { | |
559 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
560 "forced to look at the secondary_free_list"); | |
561 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
562 res = new_region_try_secondary_free_list(is_old); |
2152 | 563 if (res != NULL) { |
564 return res; | |
565 } | |
566 } | |
567 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
568 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
569 res = _hrm.allocate_free_region(is_old); |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
570 |
2152 | 571 if (res == NULL) { |
572 if (G1ConcRegionFreeingVerbose) { | |
573 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
574 "res == NULL, trying the secondary_free_list"); | |
575 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
576 res = new_region_try_secondary_free_list(is_old); |
2152 | 577 } |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
578 if (res == NULL && do_expand && _expand_heap_after_alloc_failure) { |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
579 // Currently, only attempts to allocate GC alloc regions set |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
580 // do_expand to true. So, we should only reach here during a |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
581 // safepoint. If this assumption changes we might have to |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
582 // reconsider the use of _expand_heap_after_alloc_failure. |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
583 assert(SafepointSynchronize::is_at_safepoint(), "invariant"); |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
584 |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
585 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
586 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
587 ergo_format_reason("region allocation request failed") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
588 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
589 word_size * HeapWordSize); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
590 if (expand(word_size * HeapWordSize)) { |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
591 // Given that expand() succeeded in expanding the heap, and we |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
592 // always expand the heap by an amount aligned to the heap |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
593 // region size, the free list should in theory not be empty. |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
594 // In either case allocate_free_region() will check for NULL. |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
595 res = _hrm.allocate_free_region(is_old); |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
596 } else { |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
597 _expand_heap_after_alloc_failure = false; |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
598 } |
342 | 599 } |
600 return res; | |
601 } | |
602 | |
2361 | 603 HeapWord* |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
604 G1CollectedHeap::humongous_obj_allocate_initialize_regions(uint first, |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
605 uint num_regions, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
606 size_t word_size, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
607 AllocationContext_t context) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
608 assert(first != G1_NO_HRM_INDEX, "pre-condition"); |
2361 | 609 assert(isHumongous(word_size), "word_size should be humongous"); |
610 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition"); | |
611 | |
612 // Index of last region in the series + 1. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
613 uint last = first + num_regions; |
2361 | 614 |
615 // We need to initialize the region(s) we just discovered. This is | |
616 // a bit tricky given that it can happen concurrently with | |
617 // refinement threads refining cards on these regions and | |
618 // potentially wanting to refine the BOT as they are scanning | |
619 // those cards (this can happen shortly after a cleanup; see CR | |
620 // 6991377). So we have to set up the region(s) carefully and in | |
621 // a specific order. | |
622 | |
623 // The word size sum of all the regions we will allocate. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
624 size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords; |
2361 | 625 assert(word_size <= word_size_sum, "sanity"); |
626 | |
627 // This will be the "starts humongous" region. | |
3766 | 628 HeapRegion* first_hr = region_at(first); |
2361 | 629 // The header of the new object will be placed at the bottom of |
630 // the first region. | |
631 HeapWord* new_obj = first_hr->bottom(); | |
632 // This will be the new end of the first region in the series that | |
10405 | 633 // should also match the end of the last region in the series. |
2361 | 634 HeapWord* new_end = new_obj + word_size_sum; |
635 // This will be the new top of the first region that will reflect | |
636 // this allocation. | |
637 HeapWord* new_top = new_obj + word_size; | |
638 | |
639 // First, we need to zero the header of the space that we will be | |
640 // allocating. When we update top further down, some refinement | |
641 // threads might try to scan the region. By zeroing the header we | |
642 // ensure that any thread that will try to scan the region will | |
643 // come across the zero klass word and bail out. | |
644 // | |
645 // NOTE: It would not have been correct to have used | |
646 // CollectedHeap::fill_with_object() and make the space look like | |
647 // an int array. The thread that is doing the allocation will | |
648 // later update the object header to a potentially different array | |
649 // type and, for a very short period of time, the klass and length | |
650 // fields will be inconsistent. This could cause a refinement | |
651 // thread to calculate the object size incorrectly. | |
652 Copy::fill_to_words(new_obj, oopDesc::header_size(), 0); | |
653 | |
654 // We will set up the first region as "starts humongous". This | |
655 // will also update the BOT covering all the regions to reflect | |
656 // that there is a single object that starts at the bottom of the | |
657 // first region. | |
658 first_hr->set_startsHumongous(new_top, new_end); | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
659 first_hr->set_allocation_context(context); |
2361 | 660 // Then, if there are any, we will set up the "continues |
661 // humongous" regions. | |
662 HeapRegion* hr = NULL; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
663 for (uint i = first + 1; i < last; ++i) { |
3766 | 664 hr = region_at(i); |
2361 | 665 hr->set_continuesHumongous(first_hr); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
666 hr->set_allocation_context(context); |
2361 | 667 } |
668 // If we have "continues humongous" regions (hr != NULL), then the | |
669 // end of the last one should match new_end. | |
670 assert(hr == NULL || hr->end() == new_end, "sanity"); | |
671 | |
672 // Up to this point no concurrent thread would have been able to | |
673 // do any scanning on any region in this series. All the top | |
674 // fields still point to bottom, so the intersection between | |
675 // [bottom,top] and [card_start,card_end] will be empty. Before we | |
676 // update the top fields, we'll do a storestore to make sure that | |
677 // no thread sees the update to top before the zeroing of the | |
678 // object header and the BOT initialization. | |
679 OrderAccess::storestore(); | |
680 | |
681 // Now that the BOT and the object header have been initialized, | |
682 // we can update top of the "starts humongous" region. | |
683 assert(first_hr->bottom() < new_top && new_top <= first_hr->end(), | |
684 "new_top should be in this region"); | |
685 first_hr->set_top(new_top); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
686 if (_hr_printer.is_active()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
687 HeapWord* bottom = first_hr->bottom(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
688 HeapWord* end = first_hr->orig_end(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
689 if ((first + 1) == last) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
690 // the series has a single humongous region |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
691 _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
692 } else { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
693 // the series has more than one humongous regions |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
694 _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
695 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
696 } |
2361 | 697 |
698 // Now, we will update the top fields of the "continues humongous" | |
699 // regions. The reason we need to do this is that, otherwise, | |
700 // these regions would look empty and this will confuse parts of | |
701 // G1. For example, the code that looks for a consecutive number | |
702 // of empty regions will consider them empty and try to | |
703 // re-allocate them. We can extend is_empty() to also include | |
704 // !continuesHumongous(), but it is easier to just update the top | |
705 // fields here. The way we set top for all regions (i.e., top == | |
706 // end for all regions but the last one, top == new_top for the | |
707 // last one) is actually used when we will free up the humongous | |
708 // region in free_humongous_region(). | |
709 hr = NULL; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
710 for (uint i = first + 1; i < last; ++i) { |
3766 | 711 hr = region_at(i); |
2361 | 712 if ((i + 1) == last) { |
713 // last continues humongous region | |
714 assert(hr->bottom() < new_top && new_top <= hr->end(), | |
715 "new_top should fall on this region"); | |
716 hr->set_top(new_top); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
717 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top); |
2361 | 718 } else { |
719 // not last one | |
720 assert(new_top > hr->end(), "new_top should be above this region"); | |
721 hr->set_top(hr->end()); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
722 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end()); |
2361 | 723 } |
724 } | |
725 // If we have continues humongous regions (hr != NULL), then the | |
726 // end of the last one should match new_end and its top should | |
727 // match new_top. | |
728 assert(hr == NULL || | |
729 (hr->end() == new_end && hr->top() == new_top), "sanity"); | |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
730 check_bitmaps("Humongous Region Allocation", first_hr); |
2361 | 731 |
732 assert(first_hr->used() == word_size * HeapWordSize, "invariant"); | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
733 _allocator->increase_used(first_hr->used()); |
2361 | 734 _humongous_set.add(first_hr); |
735 | |
736 return new_obj; | |
737 } | |
738 | |
342 | 739 // If could fit into free regions w/o expansion, try. |
740 // Otherwise, if can expand, do so. | |
741 // Otherwise, if using ex regions might help, try with ex given back. | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
742 HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size, AllocationContext_t context) { |
2152 | 743 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); |
744 | |
745 verify_region_sets_optional(); | |
342 | 746 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
747 uint first = G1_NO_HRM_INDEX; |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
748 uint obj_regions = (uint)(align_size_up_(word_size, HeapRegion::GrainWords) / HeapRegion::GrainWords); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
749 |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
750 if (obj_regions == 1) { |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
751 // Only one region to allocate, try to use a fast path by directly allocating |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
752 // from the free lists. Do not try to expand here, we will potentially do that |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
753 // later. |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
754 HeapRegion* hr = new_region(word_size, true /* is_old */, false /* do_expand */); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
755 if (hr != NULL) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
756 first = hr->hrm_index(); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
757 } |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
758 } else { |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
759 // We can't allocate humongous regions spanning more than one region while |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
760 // cleanupComplete() is running, since some of the regions we find to be |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
761 // empty might not yet be added to the free list. It is not straightforward |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
762 // to know in which list they are on so that we can remove them. We only |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
763 // need to do this if we need to allocate more than one region to satisfy the |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
764 // current humongous allocation request. If we are only allocating one region |
20337 | 765 // we use the one-region region allocation code (see above), that already |
766 // potentially waits for regions from the secondary free list. | |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
767 wait_while_free_regions_coming(); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
768 append_secondary_free_list_if_not_empty_with_lock(); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
769 |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
770 // Policy: Try only empty regions (i.e. already committed first). Maybe we |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
771 // are lucky enough to find some. |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
772 first = _hrm.find_contiguous_only_empty(obj_regions); |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
773 if (first != G1_NO_HRM_INDEX) { |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
774 _hrm.allocate_free_regions_starting_at(first, obj_regions); |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
775 } |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
776 } |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
777 |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
778 if (first == G1_NO_HRM_INDEX) { |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
779 // Policy: We could not find enough regions for the humongous object in the |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
780 // free list. Look through the heap to find a mix of free and uncommitted regions. |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
781 // If so, try expansion. |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
782 first = _hrm.find_contiguous_empty_or_unavailable(obj_regions); |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
783 if (first != G1_NO_HRM_INDEX) { |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
784 // We found something. Make sure these regions are committed, i.e. expand |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
785 // the heap. Alternatively we could do a defragmentation GC. |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
786 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
787 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
788 ergo_format_reason("humongous allocation request failed") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
789 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
790 word_size * HeapWordSize); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
791 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
792 _hrm.expand_at(first, obj_regions); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
793 g1_policy()->record_new_heap_size(num_regions()); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
794 |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
795 #ifdef ASSERT |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
796 for (uint i = first; i < first + obj_regions; ++i) { |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
797 HeapRegion* hr = region_at(i); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
798 assert(hr->is_free(), "sanity"); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
799 assert(hr->is_empty(), "sanity"); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
800 assert(is_on_master_free_list(hr), "sanity"); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
801 } |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
802 #endif |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
803 _hrm.allocate_free_regions_starting_at(first, obj_regions); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
804 } else { |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
805 // Policy: Potentially trigger a defragmentation GC. |
2152 | 806 } |
807 } | |
808 | |
2361 | 809 HeapWord* result = NULL; |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
810 if (first != G1_NO_HRM_INDEX) { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
811 result = humongous_obj_allocate_initialize_regions(first, obj_regions, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
812 word_size, context); |
2361 | 813 assert(result != NULL, "it should always return a valid result"); |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
814 |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
815 // A successful humongous object allocation changes the used space |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
816 // information of the old generation so we need to recalculate the |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
817 // sizes and update the jstat counters here. |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
818 g1mm()->update_sizes(); |
2152 | 819 } |
820 | |
821 verify_region_sets_optional(); | |
2361 | 822 |
823 return result; | |
342 | 824 } |
825 | |
1973 | 826 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) { |
827 assert_heap_not_locked_and_not_at_safepoint(); | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
828 assert(!isHumongous(word_size), "we do not allow humongous TLABs"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
829 |
22936 | 830 uint dummy_gc_count_before; |
831 uint dummy_gclocker_retry_count = 0; | |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
832 return attempt_allocation(word_size, &dummy_gc_count_before, &dummy_gclocker_retry_count); |
342 | 833 } |
834 | |
835 HeapWord* | |
836 G1CollectedHeap::mem_allocate(size_t word_size, | |
1973 | 837 bool* gc_overhead_limit_was_exceeded) { |
838 assert_heap_not_locked_and_not_at_safepoint(); | |
342 | 839 |
10405 | 840 // Loop until the allocation is satisfied, or unsatisfied after GC. |
22936 | 841 for (uint try_count = 1, gclocker_retry_count = 0; /* we'll return */; try_count += 1) { |
842 uint gc_count_before; | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
843 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
844 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
845 if (!isHumongous(word_size)) { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
846 result = attempt_allocation(word_size, &gc_count_before, &gclocker_retry_count); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
847 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
848 result = attempt_allocation_humongous(word_size, &gc_count_before, &gclocker_retry_count); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
849 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
850 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
851 return result; |
342 | 852 } |
853 | |
854 // Create the garbage collection operation... | |
1973 | 855 VM_G1CollectForAllocation op(gc_count_before, word_size); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
856 op.set_allocation_context(AllocationContext::current()); |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
857 |
342 | 858 // ...and get the VM thread to execute it. |
859 VMThread::execute(&op); | |
1973 | 860 |
861 if (op.prologue_succeeded() && op.pause_succeeded()) { | |
862 // If the operation was successful we'll return the result even | |
863 // if it is NULL. If the allocation attempt failed immediately | |
864 // after a Full GC, it's unlikely we'll be able to allocate now. | |
865 HeapWord* result = op.result(); | |
866 if (result != NULL && !isHumongous(word_size)) { | |
867 // Allocations that take place on VM operations do not do any | |
868 // card dirtying and we have to do it here. We only have to do | |
869 // this for non-humongous allocations, though. | |
870 dirty_young_block(result, word_size); | |
871 } | |
342 | 872 return result; |
1973 | 873 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
874 if (gclocker_retry_count > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
875 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
876 } |
1973 | 877 assert(op.result() == NULL, |
878 "the result should be NULL if the VM op did not succeed"); | |
342 | 879 } |
880 | |
881 // Give a warning if we seem to be looping forever. | |
882 if ((QueuedAllocationWarningCount > 0) && | |
883 (try_count % QueuedAllocationWarningCount == 0)) { | |
1973 | 884 warning("G1CollectedHeap::mem_allocate retries %d times", try_count); |
342 | 885 } |
886 } | |
1973 | 887 |
888 ShouldNotReachHere(); | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
889 return NULL; |
342 | 890 } |
891 | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
892 HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
893 AllocationContext_t context, |
22936 | 894 uint* gc_count_before_ret, |
895 uint* gclocker_retry_count_ret) { | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
896 // Make sure you read the note in attempt_allocation_humongous(). |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
897 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
898 assert_heap_not_locked_and_not_at_safepoint(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
899 assert(!isHumongous(word_size), "attempt_allocation_slow() should not " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
900 "be called for humongous allocation requests"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
901 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
902 // We should only get here after the first-level allocation attempt |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
903 // (attempt_allocation()) failed to allocate. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
904 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
905 // We will loop until a) we manage to successfully perform the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
906 // allocation or b) we successfully schedule a collection which |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
907 // fails to perform the allocation. b) is the only case when we'll |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
908 // return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
909 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
910 for (int try_count = 1; /* we'll return */; try_count += 1) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
911 bool should_try_gc; |
22936 | 912 uint gc_count_before; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
913 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
914 { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
915 MutexLockerEx x(Heap_lock); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
916 result = _allocator->mutator_alloc_region(context)->attempt_allocation_locked(word_size, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
917 false /* bot_updates */); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
918 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
919 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
920 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
921 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
922 // If we reach here, attempt_allocation_locked() above failed to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
923 // allocate a new region. So the mutator alloc region should be NULL. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
924 assert(_allocator->mutator_alloc_region(context)->get() == NULL, "only way to get here"); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
925 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
926 if (GC_locker::is_active_and_needs_gc()) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
927 if (g1_policy()->can_expand_young_list()) { |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
928 // No need for an ergo verbose message here, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
929 // can_expand_young_list() does this when it returns true. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
930 result = _allocator->mutator_alloc_region(context)->attempt_allocation_force(word_size, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
931 false /* bot_updates */); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
932 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
933 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
934 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
935 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
936 should_try_gc = false; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
937 } else { |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
938 // The GCLocker may not be active but the GCLocker initiated |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
939 // GC may not yet have been performed (GCLocker::needs_gc() |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
940 // returns true). In this case we do not try this GC and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
941 // wait until the GCLocker initiated GC is performed, and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
942 // then retry the allocation. |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
943 if (GC_locker::needs_gc()) { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
944 should_try_gc = false; |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
945 } else { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
946 // Read the GC count while still holding the Heap_lock. |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
947 gc_count_before = total_collections(); |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
948 should_try_gc = true; |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
949 } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
950 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
951 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
952 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
953 if (should_try_gc) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
954 bool succeeded; |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
955 result = do_collection_pause(word_size, gc_count_before, &succeeded, |
22936 | 956 GCCause::_g1_inc_collection_pause); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
957 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
958 assert(succeeded, "only way to get back a non-NULL result"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
959 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
960 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
961 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
962 if (succeeded) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
963 // If we get here we successfully scheduled a collection which |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
964 // failed to allocate. No point in trying to allocate |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
965 // further. We'll just return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
966 MutexLockerEx x(Heap_lock); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
967 *gc_count_before_ret = total_collections(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
968 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
969 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
970 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
971 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
972 MutexLockerEx x(Heap_lock); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
973 *gc_count_before_ret = total_collections(); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
974 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
975 } |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
976 // The GCLocker is either active or the GCLocker initiated |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
977 // GC has not yet been performed. Stall until it is and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
978 // then retry the allocation. |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
979 GC_locker::stall_until_clear(); |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
980 (*gclocker_retry_count_ret) += 1; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
981 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
982 |
10405 | 983 // We can reach here if we were unsuccessful in scheduling a |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
984 // collection (because another thread beat us to it) or if we were |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
985 // stalled due to the GC locker. In either can we should retry the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
986 // allocation attempt in case another thread successfully |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
987 // performed a collection and reclaimed enough space. We do the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
988 // first attempt (without holding the Heap_lock) here and the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
989 // follow-on attempt will be at the start of the next loop |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
990 // iteration (after taking the Heap_lock). |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
991 result = _allocator->mutator_alloc_region(context)->attempt_allocation(word_size, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
992 false /* bot_updates */); |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
993 if (result != NULL) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
994 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
995 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
996 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
997 // Give a warning if we seem to be looping forever. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
998 if ((QueuedAllocationWarningCount > 0) && |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
999 (try_count % QueuedAllocationWarningCount == 0)) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1000 warning("G1CollectedHeap::attempt_allocation_slow() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1001 "retries %d times", try_count); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1002 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1003 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1004 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1005 ShouldNotReachHere(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1006 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1007 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1008 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1009 HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size, |
22936 | 1010 uint* gc_count_before_ret, |
1011 uint* gclocker_retry_count_ret) { | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1012 // The structure of this method has a lot of similarities to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1013 // attempt_allocation_slow(). The reason these two were not merged |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1014 // into a single one is that such a method would require several "if |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1015 // allocation is not humongous do this, otherwise do that" |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1016 // conditional paths which would obscure its flow. In fact, an early |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1017 // version of this code did use a unified method which was harder to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1018 // follow and, as a result, it had subtle bugs that were hard to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1019 // track down. So keeping these two methods separate allows each to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1020 // be more readable. It will be good to keep these two in sync as |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1021 // much as possible. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1022 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1023 assert_heap_not_locked_and_not_at_safepoint(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1024 assert(isHumongous(word_size), "attempt_allocation_humongous() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1025 "should only be called for humongous allocations"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1026 |
4834
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1027 // Humongous objects can exhaust the heap quickly, so we should check if we |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1028 // need to start a marking cycle at each humongous object allocation. We do |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1029 // the check before we do the actual allocation. The reason for doing it |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1030 // before the allocation is that we avoid having to keep track of the newly |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1031 // allocated memory while we do a GC. |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
1032 if (g1_policy()->need_to_start_conc_mark("concurrent humongous allocation", |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
1033 word_size)) { |
4834
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1034 collect(GCCause::_g1_humongous_allocation); |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1035 } |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1036 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1037 // We will loop until a) we manage to successfully perform the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1038 // allocation or b) we successfully schedule a collection which |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1039 // fails to perform the allocation. b) is the only case when we'll |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1040 // return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1041 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1042 for (int try_count = 1; /* we'll return */; try_count += 1) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1043 bool should_try_gc; |
22936 | 1044 uint gc_count_before; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1045 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1046 { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1047 MutexLockerEx x(Heap_lock); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1048 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1049 // Given that humongous objects are not allocated in young |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1050 // regions, we'll first try to do the allocation without doing a |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1051 // collection hoping that there's enough space in the heap. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1052 result = humongous_obj_allocate(word_size, AllocationContext::current()); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1053 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1054 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1055 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1056 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1057 if (GC_locker::is_active_and_needs_gc()) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1058 should_try_gc = false; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1059 } else { |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1060 // The GCLocker may not be active but the GCLocker initiated |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1061 // GC may not yet have been performed (GCLocker::needs_gc() |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1062 // returns true). In this case we do not try this GC and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1063 // wait until the GCLocker initiated GC is performed, and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1064 // then retry the allocation. |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1065 if (GC_locker::needs_gc()) { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1066 should_try_gc = false; |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1067 } else { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1068 // Read the GC count while still holding the Heap_lock. |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1069 gc_count_before = total_collections(); |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1070 should_try_gc = true; |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1071 } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1072 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1073 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1074 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1075 if (should_try_gc) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1076 // If we failed to allocate the humongous object, we should try to |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1077 // do a collection pause (if we're allowed) in case it reclaims |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1078 // enough space for the allocation to succeed after the pause. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1079 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1080 bool succeeded; |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
1081 result = do_collection_pause(word_size, gc_count_before, &succeeded, |
22936 | 1082 GCCause::_g1_humongous_allocation); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1083 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1084 assert(succeeded, "only way to get back a non-NULL result"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1085 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1086 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1087 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1088 if (succeeded) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1089 // If we get here we successfully scheduled a collection which |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1090 // failed to allocate. No point in trying to allocate |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1091 // further. We'll just return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1092 MutexLockerEx x(Heap_lock); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
1093 *gc_count_before_ret = total_collections(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1094 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1095 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1096 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1097 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1098 MutexLockerEx x(Heap_lock); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1099 *gc_count_before_ret = total_collections(); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1100 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1101 } |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1102 // The GCLocker is either active or the GCLocker initiated |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1103 // GC has not yet been performed. Stall until it is and |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1104 // then retry the allocation. |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1105 GC_locker::stall_until_clear(); |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1106 (*gclocker_retry_count_ret) += 1; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1107 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1108 |
10405 | 1109 // We can reach here if we were unsuccessful in scheduling a |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1110 // collection (because another thread beat us to it) or if we were |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1111 // stalled due to the GC locker. In either can we should retry the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1112 // allocation attempt in case another thread successfully |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1113 // performed a collection and reclaimed enough space. Give a |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1114 // warning if we seem to be looping forever. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1115 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1116 if ((QueuedAllocationWarningCount > 0) && |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1117 (try_count % QueuedAllocationWarningCount == 0)) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1118 warning("G1CollectedHeap::attempt_allocation_humongous() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1119 "retries %d times", try_count); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1120 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1121 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1122 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1123 ShouldNotReachHere(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1124 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1125 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1126 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1127 HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1128 AllocationContext_t context, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1129 bool expect_null_mutator_alloc_region) { |
2152 | 1130 assert_at_safepoint(true /* should_be_vm_thread */); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1131 assert(_allocator->mutator_alloc_region(context)->get() == NULL || |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1132 !expect_null_mutator_alloc_region, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1133 "the current alloc region was unexpectedly found to be non-NULL"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1134 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1135 if (!isHumongous(word_size)) { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1136 return _allocator->mutator_alloc_region(context)->attempt_allocation_locked(word_size, |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1137 false /* bot_updates */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1138 } else { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1139 HeapWord* result = humongous_obj_allocate(word_size, context); |
4829
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1140 if (result != NULL && g1_policy()->need_to_start_conc_mark("STW humongous allocation")) { |
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1141 g1_policy()->set_initiate_conc_mark_if_possible(); |
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1142 } |
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1143 return result; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1144 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1145 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1146 ShouldNotReachHere(); |
342 | 1147 } |
1148 | |
1149 class PostMCRemSetClearClosure: public HeapRegionClosure { | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1150 G1CollectedHeap* _g1h; |
342 | 1151 ModRefBarrierSet* _mr_bs; |
1152 public: | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1153 PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) : |
12080 | 1154 _g1h(g1h), _mr_bs(mr_bs) {} |
1155 | |
342 | 1156 bool doHeapRegion(HeapRegion* r) { |
12080 | 1157 HeapRegionRemSet* hrrs = r->rem_set(); |
1158 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1159 if (r->continuesHumongous()) { |
12080 | 1160 // We'll assert that the strong code root list and RSet is empty |
1161 assert(hrrs->strong_code_roots_list_length() == 0, "sanity"); | |
1162 assert(hrrs->occupied() == 0, "RSet should be empty"); | |
342 | 1163 return false; |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1164 } |
12080 | 1165 |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1166 _g1h->reset_gc_time_stamps(r); |
12080 | 1167 hrrs->clear(); |
342 | 1168 // You might think here that we could clear just the cards |
1169 // corresponding to the used region. But no: if we leave a dirty card | |
1170 // in a region we might allocate into, then it would prevent that card | |
1171 // from being enqueued, and cause it to be missed. | |
1172 // Re: the performance cost: we shouldn't be doing full GC anyway! | |
1173 _mr_bs->clear(MemRegion(r->bottom(), r->end())); | |
12080 | 1174 |
342 | 1175 return false; |
1176 } | |
1177 }; | |
1178 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1179 void G1CollectedHeap::clear_rsets_post_compaction() { |
12343 | 1180 PostMCRemSetClearClosure rs_clear(this, g1_barrier_set()); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1181 heap_region_iterate(&rs_clear); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1182 } |
342 | 1183 |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1184 class RebuildRSOutOfRegionClosure: public HeapRegionClosure { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1185 G1CollectedHeap* _g1h; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1186 UpdateRSOopClosure _cl; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1187 int _worker_i; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1188 public: |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1189 RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) : |
1861 | 1190 _cl(g1->g1_rem_set(), worker_i), |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1191 _worker_i(worker_i), |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1192 _g1h(g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1193 { } |
1960
878b57474103
6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents:
1883
diff
changeset
|
1194 |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1195 bool doHeapRegion(HeapRegion* r) { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1196 if (!r->continuesHumongous()) { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1197 _cl.set_from(r); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1198 r->oop_iterate(&_cl); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1199 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1200 return false; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1201 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1202 }; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1203 |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1204 class ParRebuildRSTask: public AbstractGangTask { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1205 G1CollectedHeap* _g1; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1206 public: |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1207 ParRebuildRSTask(G1CollectedHeap* g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1208 : AbstractGangTask("ParRebuildRSTask"), |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1209 _g1(g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1210 { } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1211 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1212 void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1213 RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id); |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1214 _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id, |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
1215 _g1->workers()->active_workers(), |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1216 HeapRegion::RebuildRSClaimValue); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1217 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1218 }; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1219 |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1220 class PostCompactionPrinterClosure: public HeapRegionClosure { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1221 private: |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1222 G1HRPrinter* _hr_printer; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1223 public: |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1224 bool doHeapRegion(HeapRegion* hr) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1225 assert(!hr->is_young(), "not expecting to find young regions"); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1226 if (hr->is_free()) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1227 // We only generate output for non-empty regions. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1228 } else if (hr->startsHumongous()) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1229 if (hr->region_num() == 1) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1230 // single humongous region |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1231 _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1232 } else { |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1233 _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1234 } |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1235 } else if (hr->continuesHumongous()) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1236 _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous); |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1237 } else if (hr->is_old()) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1238 _hr_printer->post_compaction(hr, G1HRPrinter::Old); |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1239 } else { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
1240 ShouldNotReachHere(); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1241 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1242 return false; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1243 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1244 |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1245 PostCompactionPrinterClosure(G1HRPrinter* hr_printer) |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1246 : _hr_printer(hr_printer) { } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1247 }; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1248 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1249 void G1CollectedHeap::print_hrm_post_compaction() { |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1250 PostCompactionPrinterClosure cl(hr_printer()); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1251 heap_region_iterate(&cl); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1252 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1253 |
1973 | 1254 bool G1CollectedHeap::do_collection(bool explicit_gc, |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
1255 bool clear_all_soft_refs, |
342 | 1256 size_t word_size) { |
2152 | 1257 assert_at_safepoint(true /* should_be_vm_thread */); |
1258 | |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1259 if (GC_locker::check_active_before_gc()) { |
1973 | 1260 return false; |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1261 } |
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1262 |
10405 | 1263 STWGCTimer* gc_timer = G1MarkSweep::gc_timer(); |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
1264 gc_timer->register_gc_start(); |
10405 | 1265 |
1266 SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer(); | |
1267 gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start()); | |
1268 | |
2125
7246a374a9f2
6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents:
2039
diff
changeset
|
1269 SvcGCMarker sgcm(SvcGCMarker::FULL); |
342 | 1270 ResourceMark rm; |
1271 | |
4872
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4787
diff
changeset
|
1272 print_heap_before_gc(); |
10405 | 1273 trace_heap_before_gc(gc_tracer); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
1274 |
17866
270d7cb38f40
8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents:
17844
diff
changeset
|
1275 size_t metadata_prev_used = MetaspaceAux::used_bytes(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
1276 |
2152 | 1277 verify_region_sets_optional(); |
342 | 1278 |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1279 const bool do_clear_all_soft_refs = clear_all_soft_refs || |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1280 collector_policy()->should_clear_all_soft_refs(); |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1281 |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1282 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy()); |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1283 |
342 | 1284 { |
1285 IsGCActiveMark x; | |
1286 | |
1287 // Timing | |
6030 | 1288 assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant"); |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1289 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); |
6030 | 1290 |
342 | 1291 { |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
1292 GCTraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, NULL, gc_tracer->gc_id()); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1293 TraceCollectorStats tcs(g1mm()->full_collection_counters()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1294 TraceMemoryManagerStats tms(true /* fullGC */, gc_cause()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1295 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1296 double start = os::elapsedTime(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1297 g1_policy()->record_full_collection_start(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1298 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1299 // Note: When we have a more flexible GC logging framework that |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1300 // allows us to add optional attributes to a GC log record we |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1301 // could consider timing and reporting how long we wait in the |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1302 // following two methods. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1303 wait_while_free_regions_coming(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1304 // If we start the compaction before the CM threads finish |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1305 // scanning the root regions we might trip them over as we'll |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1306 // be moving objects / updating references. So let's wait until |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1307 // they are done. By telling them to abort, they should complete |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1308 // early. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1309 _cm->root_regions()->abort(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1310 _cm->root_regions()->wait_until_scan_finished(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1311 append_secondary_free_list_if_not_empty_with_lock(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1312 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1313 gc_prologue(true); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1314 increment_total_collections(true /* full gc */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1315 increment_old_marking_cycles_started(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1316 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1317 assert(used() == recalculate_used(), "Should be equal"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1318 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1319 verify_before_gc(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1320 |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1321 check_bitmaps("Full GC Start"); |
10405 | 1322 pre_full_gc_dump(gc_timer); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1323 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1324 COMPILER2_PRESENT(DerivedPointerTable::clear()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1325 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1326 // Disable discovery and empty the discovered lists |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1327 // for the CM ref processor. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1328 ref_processor_cm()->disable_discovery(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1329 ref_processor_cm()->abandon_partial_discovery(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1330 ref_processor_cm()->verify_no_references_recorded(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1331 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1332 // Abandon current iterations of concurrent marking and concurrent |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1333 // refinement, if any are in progress. We have to do this before |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1334 // wait_until_scan_finished() below. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1335 concurrent_mark()->abort(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1336 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1337 // Make sure we'll choose a new allocation region afterwards. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1338 _allocator->release_mutator_alloc_region(); |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1339 _allocator->abandon_gc_alloc_regions(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1340 g1_rem_set()->cleanupHRRS(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1341 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1342 // We should call this after we retire any currently active alloc |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1343 // regions so that all the ALLOC / RETIRE events are generated |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1344 // before the start GC event. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1345 _hr_printer.start_gc(true /* full */, (size_t) total_collections()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1346 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1347 // We may have added regions to the current incremental collection |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1348 // set between the last GC or pause and now. We need to clear the |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1349 // incremental collection set and then start rebuilding it afresh |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1350 // after this full GC. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1351 abandon_collection_set(g1_policy()->inc_cset_head()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1352 g1_policy()->clear_incremental_cset(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1353 g1_policy()->stop_incremental_cset_building(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1354 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1355 tear_down_region_sets(false /* free_list_only */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1356 g1_policy()->set_gcs_are_young(true); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1357 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1358 // See the comments in g1CollectedHeap.hpp and |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1359 // G1CollectedHeap::ref_processing_init() about |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1360 // how reference processing currently works in G1. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1361 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1362 // Temporarily make discovery by the STW ref processor single threaded (non-MT). |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1363 ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1364 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1365 // Temporarily clear the STW ref processor's _is_alive_non_header field. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1366 ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1367 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1368 ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1369 ref_processor_stw()->setup_policy(do_clear_all_soft_refs); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1370 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1371 // Do collection work |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1372 { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1373 HandleMark hm; // Discard invalid handles created during gc |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1374 G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1375 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1376 |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1377 assert(num_free_regions() == 0, "we should not have added any free regions"); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1378 rebuild_region_sets(false /* free_list_only */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1379 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1380 // Enqueue any discovered reference objects that have |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1381 // not been removed from the discovered lists. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1382 ref_processor_stw()->enqueue_discovered_references(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1383 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1384 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1385 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1386 MemoryService::track_memory_usage(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1387 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1388 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1389 ref_processor_stw()->verify_no_references_recorded(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1390 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1391 // Delete metaspaces for unloaded class loaders and clean up loader_data graph |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1392 ClassLoaderDataGraph::purge(); |
12080 | 1393 MetaspaceAux::verify_metrics(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1394 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1395 // Note: since we've just done a full GC, concurrent |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1396 // marking is no longer active. Therefore we need not |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1397 // re-enable reference discovery for the CM ref processor. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1398 // That will be done at the start of the next marking cycle. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1399 assert(!ref_processor_cm()->discovery_enabled(), "Postcondition"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1400 ref_processor_cm()->verify_no_references_recorded(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1401 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1402 reset_gc_time_stamp(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1403 // Since everything potentially moved, we will clear all remembered |
10405 | 1404 // sets, and clear all cards. Later we will rebuild remembered |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1405 // sets. We will also reset the GC time stamps of the regions. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1406 clear_rsets_post_compaction(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1407 check_gc_time_stamps(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1408 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1409 // Resize the heap if necessary. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1410 resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1411 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1412 if (_hr_printer.is_active()) { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1413 // We should do this after we potentially resize the heap so |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1414 // that all the COMMIT / UNCOMMIT events are generated before |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1415 // the end GC event. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1416 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1417 print_hrm_post_compaction(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1418 _hr_printer.end_gc(true /* full */, (size_t) total_collections()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1419 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1420 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1421 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1422 if (hot_card_cache->use_cache()) { |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1423 hot_card_cache->reset_card_counts(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1424 hot_card_cache->reset_hot_cache(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1425 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1426 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1427 // Rebuild remembered sets of all regions. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1428 if (G1CollectedHeap::use_parallel_gc_threads()) { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1429 uint n_workers = |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1430 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1431 workers()->active_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1432 Threads::number_of_non_daemon_threads()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1433 assert(UseDynamicNumberOfGCThreads || |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1434 n_workers == workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1435 "If not dynamic should be using all the workers"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1436 workers()->set_active_workers(n_workers); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1437 // Set parallel threads in the heap (_n_par_threads) only |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1438 // before a parallel phase and always reset it to 0 after |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1439 // the phase so that the number of parallel threads does |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1440 // no get carried forward to a serial phase where there |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1441 // may be code that is "possibly_parallel". |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1442 set_par_threads(n_workers); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1443 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1444 ParRebuildRSTask rebuild_rs_task(this); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1445 assert(check_heap_region_claim_values( |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1446 HeapRegion::InitialClaimValue), "sanity check"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1447 assert(UseDynamicNumberOfGCThreads || |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1448 workers()->active_workers() == workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1449 "Unless dynamic should use total workers"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1450 // Use the most recent number of active workers |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1451 assert(workers()->active_workers() > 0, |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1452 "Active workers not properly set"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1453 set_par_threads(workers()->active_workers()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1454 workers()->run_task(&rebuild_rs_task); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1455 set_par_threads(0); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1456 assert(check_heap_region_claim_values( |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1457 HeapRegion::RebuildRSClaimValue), "sanity check"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1458 reset_heap_region_claim_values(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1459 } else { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1460 RebuildRSOutOfRegionClosure rebuild_rs(this); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1461 heap_region_iterate(&rebuild_rs); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1462 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1463 |
12080 | 1464 // Rebuild the strong code root lists for each region |
1465 rebuild_strong_code_roots(); | |
1466 | |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1467 if (true) { // FIXME |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1468 MetaspaceGC::compute_new_size(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1469 } |
342 | 1470 |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1471 #ifdef TRACESPINNING |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1472 ParallelTaskTerminator::print_termination_counts(); |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1473 #endif |
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1474 |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1475 // Discard all rset updates |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1476 JavaThread::dirty_card_queue_set().abandon_logs(); |
20504
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
1477 assert(dirty_card_queue_set().completed_buffers_num() == 0, "DCQS should be empty"); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1478 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1479 _young_list->reset_sampled_info(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1480 // At this point there should be no regions in the |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1481 // entire heap tagged as young. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1482 assert(check_young_list_empty(true /* check_heap */), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1483 "young list should be empty at this point"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1484 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1485 // Update the number of full collections that have been completed. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1486 increment_old_marking_cycles_completed(false /* concurrent */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1487 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1488 _hrm.verify_optional(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1489 verify_region_sets_optional(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1490 |
10373
3a4805ad0005
8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents:
10372
diff
changeset
|
1491 verify_after_gc(); |
3a4805ad0005
8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents:
10372
diff
changeset
|
1492 |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1493 // Clear the previous marking bitmap, if needed for bitmap verification. |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1494 // Note we cannot do this when we clear the next marking bitmap in |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1495 // ConcurrentMark::abort() above since VerifyDuringGC verifies the |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1496 // objects marked during a full GC against the previous bitmap. |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1497 // But we need to clear it before calling check_bitmaps below since |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1498 // the full GC has compacted objects and updated TAMS but not updated |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1499 // the prev bitmap. |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1500 if (G1VerifyBitmaps) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1501 ((CMBitMap*) concurrent_mark()->prevMarkBitMap())->clearAll(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1502 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1503 check_bitmaps("Full GC End"); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
1504 |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1505 // Start a new incremental collection set for the next pause |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1506 assert(g1_policy()->collection_set() == NULL, "must be"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1507 g1_policy()->start_incremental_cset_building(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1508 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1509 clear_cset_fast_test(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1510 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1511 _allocator->init_mutator_alloc_region(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1512 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1513 double end = os::elapsedTime(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1514 g1_policy()->record_full_collection_end(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1515 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1516 if (G1Log::fine()) { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1517 g1_policy()->print_heap_transition(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1518 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1519 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1520 // We must call G1MonitoringSupport::update_sizes() in the same scoping level |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1521 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1522 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1523 // before any GC notifications are raised. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1524 g1mm()->update_sizes(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1525 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1526 gc_epilogue(true); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1527 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1528 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1529 if (G1Log::finer()) { |
10291
48391ab0687e
8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents:
10246
diff
changeset
|
1530 g1_policy()->print_detailed_heap_transition(true /* full */); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1531 } |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
1532 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
1533 print_heap_after_gc(); |
10405 | 1534 trace_heap_after_gc(gc_tracer); |
1535 | |
1536 post_full_gc_dump(gc_timer); | |
1537 | |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
1538 gc_timer->register_gc_end(); |
10405 | 1539 gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions()); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1540 } |
1973 | 1541 |
1542 return true; | |
342 | 1543 } |
1544 | |
1545 void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) { | |
1973 | 1546 // do_collection() will return whether it succeeded in performing |
1547 // the GC. Currently, there is no facility on the | |
1548 // do_full_collection() API to notify the caller than the collection | |
1549 // did not succeed (e.g., because it was locked out by the GC | |
1550 // locker). So, right now, we'll ignore the return value. | |
1551 bool dummy = do_collection(true, /* explicit_gc */ | |
1552 clear_all_soft_refs, | |
1553 0 /* word_size */); | |
342 | 1554 } |
1555 | |
1556 // This code is mostly copied from TenuredGeneration. | |
1557 void | |
1558 G1CollectedHeap:: | |
1559 resize_if_necessary_after_full_collection(size_t word_size) { | |
1560 // Include the current allocation, if any, and bytes that will be | |
1561 // pre-allocated to support collections, as "used". | |
1562 const size_t used_after_gc = used(); | |
1563 const size_t capacity_after_gc = capacity(); | |
1564 const size_t free_after_gc = capacity_after_gc - used_after_gc; | |
1565 | |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1566 // This is enforced in arguments.cpp. |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1567 assert(MinHeapFreeRatio <= MaxHeapFreeRatio, |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1568 "otherwise the code below doesn't make sense"); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1569 |
342 | 1570 // We don't have floating point command-line arguments |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1571 const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0; |
342 | 1572 const double maximum_used_percentage = 1.0 - minimum_free_percentage; |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1573 const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0; |
342 | 1574 const double minimum_used_percentage = 1.0 - maximum_free_percentage; |
1575 | |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1576 const size_t min_heap_size = collector_policy()->min_heap_byte_size(); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1577 const size_t max_heap_size = collector_policy()->max_heap_byte_size(); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1578 |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1579 // We have to be careful here as these two calculations can overflow |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1580 // 32-bit size_t's. |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1581 double used_after_gc_d = (double) used_after_gc; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1582 double minimum_desired_capacity_d = used_after_gc_d / maximum_used_percentage; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1583 double maximum_desired_capacity_d = used_after_gc_d / minimum_used_percentage; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1584 |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1585 // Let's make sure that they are both under the max heap size, which |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1586 // by default will make them fit into a size_t. |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1587 double desired_capacity_upper_bound = (double) max_heap_size; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1588 minimum_desired_capacity_d = MIN2(minimum_desired_capacity_d, |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1589 desired_capacity_upper_bound); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1590 maximum_desired_capacity_d = MIN2(maximum_desired_capacity_d, |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1591 desired_capacity_upper_bound); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1592 |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1593 // We can now safely turn them into size_t's. |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1594 size_t minimum_desired_capacity = (size_t) minimum_desired_capacity_d; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1595 size_t maximum_desired_capacity = (size_t) maximum_desired_capacity_d; |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1596 |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1597 // This assert only makes sense here, before we adjust them |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1598 // with respect to the min and max heap size. |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1599 assert(minimum_desired_capacity <= maximum_desired_capacity, |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1600 err_msg("minimum_desired_capacity = "SIZE_FORMAT", " |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1601 "maximum_desired_capacity = "SIZE_FORMAT, |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1602 minimum_desired_capacity, maximum_desired_capacity)); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1603 |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1604 // Should not be greater than the heap max size. No need to adjust |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1605 // it with respect to the heap min size as it's a lower bound (i.e., |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1606 // we'll try to make the capacity larger than it, not smaller). |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1607 minimum_desired_capacity = MIN2(minimum_desired_capacity, max_heap_size); |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1608 // Should not be less than the heap min size. No need to adjust it |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1609 // with respect to the heap max size as it's an upper bound (i.e., |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1610 // we'll try to make the capacity smaller than it, not greater). |
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1611 maximum_desired_capacity = MAX2(maximum_desired_capacity, min_heap_size); |
342 | 1612 |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1613 if (capacity_after_gc < minimum_desired_capacity) { |
342 | 1614 // Don't expand unless it's significant |
1615 size_t expand_bytes = minimum_desired_capacity - capacity_after_gc; | |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1616 ergo_verbose4(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1617 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1618 ergo_format_reason("capacity lower than " |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1619 "min desired capacity after Full GC") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1620 ergo_format_byte("capacity") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1621 ergo_format_byte("occupancy") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1622 ergo_format_byte_perc("min desired capacity"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1623 capacity_after_gc, used_after_gc, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1624 minimum_desired_capacity, (double) MinHeapFreeRatio); |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1625 expand(expand_bytes); |
342 | 1626 |
1627 // No expansion, now see if we want to shrink | |
1717
688c3755d7af
6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents:
1709
diff
changeset
|
1628 } else if (capacity_after_gc > maximum_desired_capacity) { |
342 | 1629 // Capacity too large, compute shrinking size |
1630 size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity; | |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1631 ergo_verbose4(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1632 "attempt heap shrinking", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1633 ergo_format_reason("capacity higher than " |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1634 "max desired capacity after Full GC") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1635 ergo_format_byte("capacity") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1636 ergo_format_byte("occupancy") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1637 ergo_format_byte_perc("max desired capacity"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1638 capacity_after_gc, used_after_gc, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1639 maximum_desired_capacity, (double) MaxHeapFreeRatio); |
342 | 1640 shrink(shrink_bytes); |
1641 } | |
1642 } | |
1643 | |
1644 | |
1645 HeapWord* | |
1973 | 1646 G1CollectedHeap::satisfy_failed_allocation(size_t word_size, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1647 AllocationContext_t context, |
1973 | 1648 bool* succeeded) { |
2152 | 1649 assert_at_safepoint(true /* should_be_vm_thread */); |
1973 | 1650 |
1651 *succeeded = true; | |
1652 // Let's attempt the allocation first. | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1653 HeapWord* result = |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1654 attempt_allocation_at_safepoint(word_size, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1655 context, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1656 false /* expect_null_mutator_alloc_region */); |
1973 | 1657 if (result != NULL) { |
1658 assert(*succeeded, "sanity"); | |
1659 return result; | |
1660 } | |
342 | 1661 |
1662 // In a G1 heap, we're supposed to keep allocation from failing by | |
1663 // incremental pauses. Therefore, at least for now, we'll favor | |
1664 // expansion over collection. (This might change in the future if we can | |
1665 // do something smarter than full collection to satisfy a failed alloc.) | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1666 result = expand_and_allocate(word_size, context); |
342 | 1667 if (result != NULL) { |
1973 | 1668 assert(*succeeded, "sanity"); |
342 | 1669 return result; |
1670 } | |
1671 | |
1973 | 1672 // Expansion didn't work, we'll try to do a Full GC. |
1673 bool gc_succeeded = do_collection(false, /* explicit_gc */ | |
1674 false, /* clear_all_soft_refs */ | |
1675 word_size); | |
1676 if (!gc_succeeded) { | |
1677 *succeeded = false; | |
1678 return NULL; | |
1679 } | |
1680 | |
1681 // Retry the allocation | |
1682 result = attempt_allocation_at_safepoint(word_size, | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1683 context, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1684 true /* expect_null_mutator_alloc_region */); |
342 | 1685 if (result != NULL) { |
1973 | 1686 assert(*succeeded, "sanity"); |
342 | 1687 return result; |
1688 } | |
1689 | |
1973 | 1690 // Then, try a Full GC that will collect all soft references. |
1691 gc_succeeded = do_collection(false, /* explicit_gc */ | |
1692 true, /* clear_all_soft_refs */ | |
1693 word_size); | |
1694 if (!gc_succeeded) { | |
1695 *succeeded = false; | |
1696 return NULL; | |
1697 } | |
1698 | |
1699 // Retry the allocation once more | |
1700 result = attempt_allocation_at_safepoint(word_size, | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1701 context, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1702 true /* expect_null_mutator_alloc_region */); |
342 | 1703 if (result != NULL) { |
1973 | 1704 assert(*succeeded, "sanity"); |
342 | 1705 return result; |
1706 } | |
1707 | |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1708 assert(!collector_policy()->should_clear_all_soft_refs(), |
1973 | 1709 "Flag should have been handled and cleared prior to this point"); |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1710 |
342 | 1711 // What else? We might try synchronous finalization later. If the total |
1712 // space available is large enough for the allocation, then a more | |
1713 // complete compaction phase than we've tried so far might be | |
1714 // appropriate. | |
1973 | 1715 assert(*succeeded, "sanity"); |
342 | 1716 return NULL; |
1717 } | |
1718 | |
1719 // Attempting to expand the heap sufficiently | |
1720 // to support an allocation of the given "word_size". If | |
1721 // successful, perform the allocation and return the address of the | |
1722 // allocated block, or else "NULL". | |
1723 | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1724 HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size, AllocationContext_t context) { |
2152 | 1725 assert_at_safepoint(true /* should_be_vm_thread */); |
1726 | |
1727 verify_region_sets_optional(); | |
1973 | 1728 |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1729 size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes); |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1730 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1731 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1732 ergo_format_reason("allocation request failed") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1733 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1734 word_size * HeapWordSize); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1735 if (expand(expand_bytes)) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1736 _hrm.verify_optional(); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1737 verify_region_sets_optional(); |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1738 return attempt_allocation_at_safepoint(word_size, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1739 context, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1740 false /* expect_null_mutator_alloc_region */); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1741 } |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1742 return NULL; |
342 | 1743 } |
1744 | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1745 bool G1CollectedHeap::expand(size_t expand_bytes) { |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1746 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes); |
342 | 1747 aligned_expand_bytes = align_size_up(aligned_expand_bytes, |
1748 HeapRegion::GrainBytes); | |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1749 ergo_verbose2(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1750 "expand the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1751 ergo_format_byte("requested expansion amount") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1752 ergo_format_byte("attempted expansion amount"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1753 expand_bytes, aligned_expand_bytes); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1754 |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1755 if (is_maximal_no_gc()) { |
12345
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1756 ergo_verbose0(ErgoHeapSizing, |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1757 "did not expand the heap", |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1758 ergo_format_reason("heap already fully expanded")); |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1759 return false; |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1760 } |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1761 |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1762 uint regions_to_expand = (uint)(aligned_expand_bytes / HeapRegion::GrainBytes); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1763 assert(regions_to_expand > 0, "Must expand by at least one region"); |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1764 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1765 uint expanded_by = _hrm.expand_by(regions_to_expand); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1766 |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1767 if (expanded_by > 0) { |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1768 size_t actual_expand_bytes = expanded_by * HeapRegion::GrainBytes; |
3766 | 1769 assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition"); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1770 g1_policy()->record_new_heap_size(num_regions()); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1771 } else { |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1772 ergo_verbose0(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1773 "did not expand the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1774 ergo_format_reason("heap expansion operation failed")); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1775 // The expansion of the virtual storage space was unsuccessful. |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1776 // Let's see if it was because we ran out of swap. |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1777 if (G1ExitOnExpansionFailure && |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1778 _hrm.available() >= regions_to_expand) { |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1779 // We had head room... |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
10099
diff
changeset
|
1780 vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion"); |
342 | 1781 } |
1782 } | |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1783 return regions_to_expand > 0; |
342 | 1784 } |
1785 | |
3766 | 1786 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) { |
342 | 1787 size_t aligned_shrink_bytes = |
1788 ReservedSpace::page_align_size_down(shrink_bytes); | |
1789 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes, | |
1790 HeapRegion::GrainBytes); | |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1791 uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1792 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1793 uint num_regions_removed = _hrm.shrink_by(num_regions_to_remove); |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1794 size_t shrunk_bytes = num_regions_removed * HeapRegion::GrainBytes; |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1795 |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1796 ergo_verbose3(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1797 "shrink the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1798 ergo_format_byte("requested shrinking amount") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1799 ergo_format_byte("aligned shrinking amount") |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1800 ergo_format_byte("attempted shrinking amount"), |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1801 shrink_bytes, aligned_shrink_bytes, shrunk_bytes); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1802 if (num_regions_removed > 0) { |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1803 g1_policy()->record_new_heap_size(num_regions()); |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1804 } else { |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1805 ergo_verbose0(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1806 "did not shrink the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1807 ergo_format_reason("heap shrinking operation failed")); |
342 | 1808 } |
1809 } | |
1810 | |
1811 void G1CollectedHeap::shrink(size_t shrink_bytes) { | |
2152 | 1812 verify_region_sets_optional(); |
1813 | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1814 // We should only reach here at the end of a Full GC which means we |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1815 // should not not be holding to any GC alloc regions. The method |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1816 // below will make sure of that and do any remaining clean up. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1817 _allocator->abandon_gc_alloc_regions(); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1818 |
2152 | 1819 // Instead of tearing down / rebuilding the free lists here, we |
1820 // could instead use the remove_all_pending() method on free_list to | |
1821 // remove only the ones that we need to remove. | |
4072 | 1822 tear_down_region_sets(true /* free_list_only */); |
342 | 1823 shrink_helper(shrink_bytes); |
4072 | 1824 rebuild_region_sets(true /* free_list_only */); |
2152 | 1825 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
1826 _hrm.verify_optional(); |
2152 | 1827 verify_region_sets_optional(); |
342 | 1828 } |
1829 | |
1830 // Public methods. | |
1831 | |
1832 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away | |
1833 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list | |
1834 #endif // _MSC_VER | |
1835 | |
1836 | |
1837 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : | |
1838 SharedHeap(policy_), | |
1839 _g1_policy(policy_), | |
1111 | 1840 _dirty_card_queue_set(false), |
1705 | 1841 _into_cset_dirty_card_queue_set(false), |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1842 _is_alive_closure_cm(this), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1843 _is_alive_closure_stw(this), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1844 _ref_processor_cm(NULL), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1845 _ref_processor_stw(NULL), |
342 | 1846 _bot_shared(NULL), |
10405 | 1847 _evac_failure_scan_stack(NULL), |
342 | 1848 _mark_in_progress(false), |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1849 _cg1r(NULL), |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
1850 _g1mm(NULL), |
342 | 1851 _refine_cte_cl(NULL), |
1852 _full_collection(false), | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1853 _secondary_free_list("Secondary Free List", new SecondaryFreeRegionListMtSafeChecker()), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1854 _old_set("Old Set", false /* humongous */, new OldRegionSetMtSafeChecker()), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1855 _humongous_set("Master Humongous Set", true /* humongous */, new HumongousRegionSetMtSafeChecker()), |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
1856 _humongous_reclaim_candidates(), |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
1857 _has_humongous_reclaim_candidates(false), |
2152 | 1858 _free_regions_coming(false), |
342 | 1859 _young_list(new YoungList(this)), |
1860 _gc_time_stamp(0), | |
6595 | 1861 _survivor_plab_stats(YoungPLABSize, PLABWeight), |
1862 _old_plab_stats(OldPLABSize, PLABWeight), | |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
1863 _expand_heap_after_alloc_failure(true), |
526 | 1864 _surviving_young_words(NULL), |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
1865 _old_marking_cycles_started(0), |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
1866 _old_marking_cycles_completed(0), |
10405 | 1867 _concurrent_cycle_started(false), |
22898
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
1868 _heap_summary_sent(false), |
20212
d7e2d5f2846b
8027553: Change the in_cset_fast_test functionality to use the G1BiasedArray abstraction
tschatzl
parents:
20198
diff
changeset
|
1869 _in_cset_fast_test(), |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1870 _dirty_cards_region_list(NULL), |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1871 _worker_cset_start_region(NULL), |
10405 | 1872 _worker_cset_start_region_time_stamp(NULL), |
1873 _gc_timer_stw(new (ResourceObj::C_HEAP, mtGC) STWGCTimer()), | |
1874 _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()), | |
1875 _gc_tracer_stw(new (ResourceObj::C_HEAP, mtGC) G1NewTracer()), | |
1876 _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) G1OldTracer()) { | |
1877 | |
1878 _g1h = this; | |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1879 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
1880 _allocator = G1Allocator::create_allocator(_g1h); |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1881 _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2; |
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1882 |
342 | 1883 int n_queues = MAX2((int)ParallelGCThreads, 1); |
1884 _task_queues = new RefToScanQueueSet(n_queues); | |
1885 | |
17758
ae7336d6337e
8034868: Extract G1 From Card Cache into separate class
tschatzl
parents:
17757
diff
changeset
|
1886 uint n_rem_sets = HeapRegionRemSet::num_par_rem_sets(); |
342 | 1887 assert(n_rem_sets > 0, "Invariant."); |
1888 | |
6197 | 1889 _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC); |
22936 | 1890 _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(uint, n_queues, mtGC); |
10405 | 1891 _evacuation_failed_info_array = NEW_C_HEAP_ARRAY(EvacuationFailedInfo, n_queues, mtGC); |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1892 |
342 | 1893 for (int i = 0; i < n_queues; i++) { |
1894 RefToScanQueue* q = new RefToScanQueue(); | |
1895 q->initialize(); | |
1896 _task_queues->register_queue(i, q); | |
10405 | 1897 ::new (&_evacuation_failed_info_array[i]) EvacuationFailedInfo(); |
1898 } | |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1899 clear_cset_start_regions(); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1900 |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1901 // Initialize the G1EvacuationFailureALot counters and flags. |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1902 NOT_PRODUCT(reset_evacuation_should_fail();) |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1903 |
342 | 1904 guarantee(_task_queues != NULL, "task_queues allocation failure."); |
1905 } | |
1906 | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1907 G1RegionToSpaceMapper* G1CollectedHeap::create_aux_memory_mapper(const char* description, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1908 size_t size, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1909 size_t translation_factor) { |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
1910 size_t preferred_page_size = os::page_size_for_region_unaligned(size, 1); |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1911 // Allocate a new reserved space, preferring to use large pages. |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
1912 ReservedSpace rs(size, preferred_page_size); |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1913 G1RegionToSpaceMapper* result = |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1914 G1RegionToSpaceMapper::create_mapper(rs, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1915 size, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1916 rs.alignment(), |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1917 HeapRegion::GrainBytes, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1918 translation_factor, |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1919 mtGC); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1920 if (TracePageSizes) { |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1921 gclog_or_tty->print_cr("G1 '%s': pg_sz=" SIZE_FORMAT " base=" PTR_FORMAT " size=" SIZE_FORMAT " alignment=" SIZE_FORMAT " reqsize=" SIZE_FORMAT, |
22978
30e04eba9e29
8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents:
22977
diff
changeset
|
1922 description, preferred_page_size, p2i(rs.base()), rs.size(), rs.alignment(), size); |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1923 } |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1924 return result; |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1925 } |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
1926 |
342 | 1927 jint G1CollectedHeap::initialize() { |
1166 | 1928 CollectedHeap::pre_initialize(); |
342 | 1929 os::enable_vtime(); |
1930 | |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1931 G1Log::init(); |
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1932 |
342 | 1933 // Necessary to satisfy locking discipline assertions. |
1934 | |
1935 MutexLocker x(Heap_lock); | |
1936 | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1937 // We have to initialize the printer before committing the heap, as |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1938 // it will be used then. |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1939 _hr_printer.set_active(G1PrintHeapRegions); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1940 |
342 | 1941 // While there are no constraints in the GC code that HeapWordSize |
1942 // be any particular value, there are multiple other areas in the | |
1943 // system which believe this to be true (e.g. oop->object_size in some | |
1944 // cases incorrectly returns the size in wordSize units rather than | |
1945 // HeapWordSize). | |
1946 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize"); | |
1947 | |
1948 size_t init_byte_size = collector_policy()->initial_heap_byte_size(); | |
1949 size_t max_byte_size = collector_policy()->max_heap_byte_size(); | |
13060
8f07aa079343
8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents:
12840
diff
changeset
|
1950 size_t heap_alignment = collector_policy()->heap_alignment(); |
342 | 1951 |
1952 // Ensure that the sizes are properly aligned. | |
1953 Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap"); | |
1954 Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap"); | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
12082
diff
changeset
|
1955 Universe::check_alignment(max_byte_size, heap_alignment, "g1 heap"); |
342 | 1956 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
1957 _refine_cte_cl = new RefineCardTableEntryClosure(); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
1958 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
1959 _cg1r = new ConcurrentG1Refine(this, _refine_cte_cl); |
342 | 1960 |
1961 // Reserve the maximum. | |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
620
diff
changeset
|
1962 |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1963 // When compressed oops are enabled, the preferred heap base |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1964 // is calculated by subtracting the requested size from the |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1965 // 32Gb boundary and using the result as the base address for |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1966 // heap reservation. If the requested size is not aligned to |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1967 // HeapRegion::GrainBytes (i.e. the alignment that is passed |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1968 // into the ReservedHeapSpace constructor) then the actual |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1969 // base of the reserved heap may end up differing from the |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1970 // address that was requested (i.e. the preferred heap base). |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1971 // If this happens then we could end up using a non-optimal |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1972 // compressed oops mode. |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
1973 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
1974 ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size, |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
12082
diff
changeset
|
1975 heap_alignment); |
342 | 1976 |
1977 // It is important to do this in a way such that concurrent readers can't | |
10405 | 1978 // temporarily think something is in the heap. (I've actually seen this |
342 | 1979 // happen in asserts: DLD.) |
1980 _reserved.set_word_size(0); | |
1981 _reserved.set_start((HeapWord*)heap_rs.base()); | |
1982 _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size())); | |
1983 | |
1984 // Create the gen rem set (and barrier set) for the entire reserved region. | |
1985 _rem_set = collector_policy()->create_rem_set(_reserved, 2); | |
1986 set_barrier_set(rem_set()->bs()); | |
12343 | 1987 if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) { |
1988 vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS"); | |
342 | 1989 return JNI_ENOMEM; |
1990 } | |
1991 | |
1992 // Also create a G1 rem set. | |
12343 | 1993 _g1_rem_set = new G1RemSet(this, g1_barrier_set()); |
342 | 1994 |
1995 // Carve out the G1 part of the heap. | |
1996 | |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
1997 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size); |
20337 | 1998 G1RegionToSpaceMapper* heap_storage = |
1999 G1RegionToSpaceMapper::create_mapper(g1_rs, | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2000 g1_rs.size(), |
20337 | 2001 UseLargePages ? os::large_page_size() : os::vm_page_size(), |
2002 HeapRegion::GrainBytes, | |
2003 1, | |
2004 mtJavaHeap); | |
2005 heap_storage->set_mapping_changed_listener(&_listener); | |
2006 | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2007 // Create storage for the BOT, card table, card counts table (hot card cache) and the bitmaps. |
20337 | 2008 G1RegionToSpaceMapper* bot_storage = |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2009 create_aux_memory_mapper("Block offset table", |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2010 G1BlockOffsetSharedArray::compute_size(g1_rs.size() / HeapWordSize), |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2011 G1BlockOffsetSharedArray::N_bytes); |
20337 | 2012 |
2013 ReservedSpace cardtable_rs(G1SATBCardTableLoggingModRefBS::compute_size(g1_rs.size() / HeapWordSize)); | |
2014 G1RegionToSpaceMapper* cardtable_storage = | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2015 create_aux_memory_mapper("Card table", |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2016 G1SATBCardTableLoggingModRefBS::compute_size(g1_rs.size() / HeapWordSize), |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2017 G1BlockOffsetSharedArray::N_bytes); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2018 |
20337 | 2019 G1RegionToSpaceMapper* card_counts_storage = |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2020 create_aux_memory_mapper("Card counts table", |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2021 G1BlockOffsetSharedArray::compute_size(g1_rs.size() / HeapWordSize), |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2022 G1BlockOffsetSharedArray::N_bytes); |
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2023 |
20337 | 2024 size_t bitmap_size = CMBitMap::compute_size(g1_rs.size()); |
2025 G1RegionToSpaceMapper* prev_bitmap_storage = | |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2026 create_aux_memory_mapper("Prev Bitmap", bitmap_size, CMBitMap::mark_distance()); |
20337 | 2027 G1RegionToSpaceMapper* next_bitmap_storage = |
22977
33e421924c67
8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents:
22936
diff
changeset
|
2028 create_aux_memory_mapper("Next Bitmap", bitmap_size, CMBitMap::mark_distance()); |
20337 | 2029 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2030 _hrm.initialize(heap_storage, prev_bitmap_storage, next_bitmap_storage, bot_storage, cardtable_storage, card_counts_storage); |
20337 | 2031 g1_barrier_set()->initialize(cardtable_storage); |
2032 // Do later initialization work for concurrent refinement. | |
2033 _cg1r->init(card_counts_storage); | |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2034 |
807
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2035 // 6843694 - ensure that the maximum region index can fit |
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2036 // in the remembered set structures. |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2037 const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1; |
807
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2038 guarantee((max_regions() - 1) <= max_region_idx, "too many regions"); |
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2039 |
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2040 size_t max_cards_per_region = ((size_t)1 << (sizeof(CardIdx_t)*BitsPerByte-1)) - 1; |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
2041 guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized"); |
3986
65a8ff39a6da
7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents:
3983
diff
changeset
|
2042 guarantee(HeapRegion::CardsPerRegion < max_cards_per_region, |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
2043 "too many cards per region"); |
807
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2044 |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
2045 FreeRegionList::set_unrealistically_long_length(max_regions() + 1); |
2152 | 2046 |
20337 | 2047 _bot_shared = new G1BlockOffsetSharedArray(_reserved, bot_storage); |
342 | 2048 |
2049 _g1h = this; | |
2050 | |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2051 { |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2052 HeapWord* start = _hrm.reserved().start(); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2053 HeapWord* end = _hrm.reserved().end(); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2054 size_t granularity = HeapRegion::GrainBytes; |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2055 |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2056 _in_cset_fast_test.initialize(start, end, granularity); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2057 _humongous_reclaim_candidates.initialize(start, end, granularity); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
2058 } |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
2059 |
342 | 2060 // Create the ConcurrentMark data structure and thread. |
2061 // (Must do this late, so that "max_regions" is defined.) | |
20337 | 2062 _cm = new ConcurrentMark(this, prev_bitmap_storage, next_bitmap_storage); |
7397
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2063 if (_cm == NULL || !_cm->completed_initialization()) { |
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2064 vm_shutdown_during_initialization("Could not create/initialize ConcurrentMark"); |
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2065 return JNI_ENOMEM; |
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2066 } |
342 | 2067 _cmThread = _cm->cmThread(); |
2068 | |
2069 // Initialize the from_card cache structure of HeapRegionRemSet. | |
2070 HeapRegionRemSet::init_heap(max_regions()); | |
2071 | |
677 | 2072 // Now expand into the initial heap size. |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
2073 if (!expand(init_byte_size)) { |
7397
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2074 vm_shutdown_during_initialization("Failed to allocate initial heap."); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
2075 return JNI_ENOMEM; |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
2076 } |
342 | 2077 |
2078 // Perform any initialization actions delegated to the policy. | |
2079 g1_policy()->init(); | |
2080 | |
2081 JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon, | |
2082 SATB_Q_FL_lock, | |
1111 | 2083 G1SATBProcessCompletedThreshold, |
342 | 2084 Shared_SATB_Q_lock); |
794 | 2085 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2086 JavaThread::dirty_card_queue_set().initialize(_refine_cte_cl, |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2087 DirtyCardQ_CBL_mon, |
794 | 2088 DirtyCardQ_FL_lock, |
1111 | 2089 concurrent_g1_refine()->yellow_zone(), |
2090 concurrent_g1_refine()->red_zone(), | |
794 | 2091 Shared_DirtyCardQ_lock); |
2092 | |
20504
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2093 dirty_card_queue_set().initialize(NULL, // Should never be called by the Java code |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2094 DirtyCardQ_CBL_mon, |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2095 DirtyCardQ_FL_lock, |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2096 -1, // never trigger processing |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2097 -1, // no limit on length |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2098 Shared_DirtyCardQ_lock, |
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
2099 &JavaThread::dirty_card_queue_set()); |
1705 | 2100 |
2101 // Initialize the card queue set used to hold cards containing | |
2102 // references into the collection set. | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2103 _into_cset_dirty_card_queue_set.initialize(NULL, // Should never be called by the Java code |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2104 DirtyCardQ_CBL_mon, |
1705 | 2105 DirtyCardQ_FL_lock, |
2106 -1, // never trigger processing | |
2107 -1, // no limit on length | |
2108 Shared_DirtyCardQ_lock, | |
2109 &JavaThread::dirty_card_queue_set()); | |
2110 | |
342 | 2111 // In case we're keeping closure specialization stats, initialize those |
2112 // counts and that mechanism. | |
2113 SpecializationStats::clear(); | |
2114 | |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2115 // Here we allocate the dummy HeapRegion that is required by the |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2116 // G1AllocRegion class. |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2117 HeapRegion* dummy_region = _hrm.get_dummy_region(); |
20337 | 2118 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2119 // We'll re-use the same region whether the alloc region will |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2120 // require BOT updates or not and, if it doesn't, then a non-young |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2121 // region will complain that it cannot support allocations without |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
2122 // BOT updates. So we'll tag the dummy region as eden to avoid that. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
2123 dummy_region->set_eden(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2124 // Make sure it's full. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2125 dummy_region->set_top(dummy_region->end()); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2126 G1AllocRegion::setup(this, dummy_region); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2127 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2128 _allocator->init_mutator_alloc_region(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2129 |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
2130 // Do create of the monitoring and management support so that |
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
2131 // values in the heap have been properly initialized. |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
2132 _g1mm = new G1MonitoringSupport(this); |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
2133 |
17764 | 2134 G1StringDedup::initialize(); |
2135 | |
342 | 2136 return JNI_OK; |
2137 } | |
2138 | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2139 void G1CollectedHeap::stop() { |
17992 | 2140 // Stop all concurrent threads. We do this to make sure these threads |
2141 // do not continue to execute and access resources (e.g. gclog_or_tty) | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2142 // that are destroyed during shutdown. |
17992 | 2143 _cg1r->stop(); |
2144 _cmThread->stop(); | |
2145 if (G1StringDedup::is_enabled()) { | |
2146 G1StringDedup::stop(); | |
2147 } | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2148 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2149 |
12233
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2150 size_t G1CollectedHeap::conservative_max_heap_alignment() { |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2151 return HeapRegion::max_region_size(); |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2152 } |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2153 |
342 | 2154 void G1CollectedHeap::ref_processing_init() { |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2155 // Reference processing in G1 currently works as follows: |
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2156 // |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2157 // * There are two reference processor instances. One is |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2158 // used to record and process discovered references |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2159 // during concurrent marking; the other is used to |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2160 // record and process references during STW pauses |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2161 // (both full and incremental). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2162 // * Both ref processors need to 'span' the entire heap as |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2163 // the regions in the collection set may be dotted around. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2164 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2165 // * For the concurrent marking ref processor: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2166 // * Reference discovery is enabled at initial marking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2167 // * Reference discovery is disabled and the discovered |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2168 // references processed etc during remarking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2169 // * Reference discovery is MT (see below). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2170 // * Reference discovery requires a barrier (see below). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2171 // * Reference processing may or may not be MT |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2172 // (depending on the value of ParallelRefProcEnabled |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2173 // and ParallelGCThreads). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2174 // * A full GC disables reference discovery by the CM |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2175 // ref processor and abandons any entries on it's |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2176 // discovered lists. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2177 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2178 // * For the STW processor: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2179 // * Non MT discovery is enabled at the start of a full GC. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2180 // * Processing and enqueueing during a full GC is non-MT. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2181 // * During a full GC, references are processed after marking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2182 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2183 // * Discovery (may or may not be MT) is enabled at the start |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2184 // of an incremental evacuation pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2185 // * References are processed near the end of a STW evacuation pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2186 // * For both types of GC: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2187 // * Discovery is atomic - i.e. not concurrent. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2188 // * Reference discovery will not need a barrier. |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2189 |
342 | 2190 SharedHeap::ref_processing_init(); |
2191 MemRegion mr = reserved_region(); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2192 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2193 // Concurrent Mark ref processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2194 _ref_processor_cm = |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
2361
diff
changeset
|
2195 new ReferenceProcessor(mr, // span |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2196 ParallelRefProcEnabled && (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2197 // mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2198 (int) ParallelGCThreads, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2199 // degree of mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2200 (ParallelGCThreads > 1) || (ConcGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2201 // mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2202 (int) MAX2(ParallelGCThreads, ConcGCThreads), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2203 // degree of mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2204 false, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2205 // Reference discovery is not atomic |
17976
8e20ef014b08
8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents:
17948
diff
changeset
|
2206 &_is_alive_closure_cm); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2207 // is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2208 // (for efficiency/performance) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2209 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2210 // STW ref processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2211 _ref_processor_stw = |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2212 new ReferenceProcessor(mr, // span |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2213 ParallelRefProcEnabled && (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2214 // mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2215 MAX2((int)ParallelGCThreads, 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2216 // degree of mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2217 (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2218 // mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2219 MAX2((int)ParallelGCThreads, 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2220 // degree of mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2221 true, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2222 // Reference discovery is atomic |
17976
8e20ef014b08
8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents:
17948
diff
changeset
|
2223 &_is_alive_closure_stw); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2224 // is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2225 // (for efficiency/performance) |
342 | 2226 } |
2227 | |
2228 size_t G1CollectedHeap::capacity() const { | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2229 return _hrm.length() * HeapRegion::GrainBytes; |
342 | 2230 } |
2231 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2232 void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2233 assert(!hr->continuesHumongous(), "pre-condition"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2234 hr->reset_gc_time_stamp(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2235 if (hr->startsHumongous()) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2236 uint first_index = hr->hrm_index() + 1; |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2237 uint last_index = hr->last_hc_index(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2238 for (uint i = first_index; i < last_index; i += 1) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2239 HeapRegion* chr = region_at(i); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2240 assert(chr->continuesHumongous(), "sanity"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2241 chr->reset_gc_time_stamp(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2242 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2243 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2244 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2245 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2246 #ifndef PRODUCT |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2247 class CheckGCTimeStampsHRClosure : public HeapRegionClosure { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2248 private: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2249 unsigned _gc_time_stamp; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2250 bool _failures; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2251 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2252 public: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2253 CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) : |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2254 _gc_time_stamp(gc_time_stamp), _failures(false) { } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2255 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2256 virtual bool doHeapRegion(HeapRegion* hr) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2257 unsigned region_gc_time_stamp = hr->get_gc_time_stamp(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2258 if (_gc_time_stamp != region_gc_time_stamp) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2259 gclog_or_tty->print_cr("Region "HR_FORMAT" has GC time stamp = %d, " |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2260 "expected %d", HR_FORMAT_PARAMS(hr), |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2261 region_gc_time_stamp, _gc_time_stamp); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2262 _failures = true; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2263 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2264 return false; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2265 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2266 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2267 bool failures() { return _failures; } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2268 }; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2269 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2270 void G1CollectedHeap::check_gc_time_stamps() { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2271 CheckGCTimeStampsHRClosure cl(_gc_time_stamp); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2272 heap_region_iterate(&cl); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2273 guarantee(!cl.failures(), "all GC time stamps should have been reset"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2274 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2275 #endif // PRODUCT |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2276 |
1705 | 2277 void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl, |
2278 DirtyCardQueue* into_cset_dcq, | |
2279 bool concurrent, | |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
2280 uint worker_i) { |
889 | 2281 // Clean cards in the hot card cache |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2282 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2283 hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq); |
889 | 2284 |
342 | 2285 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
2286 size_t n_completed_buffers = 0; |
1705 | 2287 while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) { |
342 | 2288 n_completed_buffers++; |
2289 } | |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
2290 g1_policy()->phase_times()->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, n_completed_buffers); |
342 | 2291 dcqs.clear_n_completed_buffers(); |
2292 assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!"); | |
2293 } | |
2294 | |
2295 | |
2296 // Computes the sum of the storage used by the various regions. | |
2297 size_t G1CollectedHeap::used() const { | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2298 return _allocator->used(); |
342 | 2299 } |
2300 | |
846
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2301 size_t G1CollectedHeap::used_unlocked() const { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2302 return _allocator->used_unlocked(); |
846
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2303 } |
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2304 |
342 | 2305 class SumUsedClosure: public HeapRegionClosure { |
2306 size_t _used; | |
2307 public: | |
2308 SumUsedClosure() : _used(0) {} | |
2309 bool doHeapRegion(HeapRegion* r) { | |
2310 if (!r->continuesHumongous()) { | |
2311 _used += r->used(); | |
2312 } | |
2313 return false; | |
2314 } | |
2315 size_t result() { return _used; } | |
2316 }; | |
2317 | |
2318 size_t G1CollectedHeap::recalculate_used() const { | |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2319 double recalculate_used_start = os::elapsedTime(); |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2320 |
342 | 2321 SumUsedClosure blk; |
3766 | 2322 heap_region_iterate(&blk); |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2323 |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2324 g1_policy()->phase_times()->record_evac_fail_recalc_used_time((os::elapsedTime() - recalculate_used_start) * 1000.0); |
342 | 2325 return blk.result(); |
2326 } | |
2327 | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2328 bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) { |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2329 switch (cause) { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2330 case GCCause::_gc_locker: return GCLockerInvokesConcurrent; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2331 case GCCause::_java_lang_system_gc: return ExplicitGCInvokesConcurrent; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2332 case GCCause::_g1_humongous_allocation: return true; |
20522
d3fd73295885
8059466: Force young GC to initiate marking cycle when stat update is requested
sjohanss
parents:
20504
diff
changeset
|
2333 case GCCause::_update_allocation_context_stats_inc: return true; |
23472
047a642c9729
8065579: WB method to start G1 concurrent mark cycle should be introduced
kevinw
parents:
23463
diff
changeset
|
2334 case GCCause::_wb_conc_mark: return true; |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2335 default: return false; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2336 } |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2337 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2338 |
3285
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2339 #ifndef PRODUCT |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2340 void G1CollectedHeap::allocate_dummy_regions() { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2341 // Let's fill up most of the region |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2342 size_t word_size = HeapRegion::GrainWords - 1024; |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2343 // And as a result the region we'll allocate will be humongous. |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2344 guarantee(isHumongous(word_size), "sanity"); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2345 |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2346 for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2347 // Let's use the existing mechanism for the allocation |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2348 HeapWord* dummy_obj = humongous_obj_allocate(word_size, |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2349 AllocationContext::system()); |
3285
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2350 if (dummy_obj != NULL) { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2351 MemRegion mr(dummy_obj, word_size); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2352 CollectedHeap::fill_with_object(mr); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2353 } else { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2354 // If we can't allocate once, we probably cannot allocate |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2355 // again. Let's get out of the loop. |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2356 break; |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2357 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2358 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2359 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2360 #endif // !PRODUCT |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2361 |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2362 void G1CollectedHeap::increment_old_marking_cycles_started() { |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2363 assert(_old_marking_cycles_started == _old_marking_cycles_completed || |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2364 _old_marking_cycles_started == _old_marking_cycles_completed + 1, |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2365 err_msg("Wrong marking cycle count (started: %d, completed: %d)", |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2366 _old_marking_cycles_started, _old_marking_cycles_completed)); |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2367 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2368 _old_marking_cycles_started++; |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2369 } |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2370 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2371 void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) { |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2372 MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2373 |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2374 // We assume that if concurrent == true, then the caller is a |
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2375 // concurrent thread that was joined the Suspendible Thread |
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2376 // Set. If there's ever a cheap way to check this, we should add an |
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2377 // assert here. |
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2378 |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2379 // Given that this method is called at the end of a Full GC or of a |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2380 // concurrent cycle, and those can be nested (i.e., a Full GC can |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2381 // interrupt a concurrent cycle), the number of full collections |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2382 // completed should be either one (in the case where there was no |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2383 // nesting) or two (when a Full GC interrupted a concurrent cycle) |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2384 // behind the number of full collections started. |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2385 |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2386 // This is the case for the inner caller, i.e. a Full GC. |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2387 assert(concurrent || |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2388 (_old_marking_cycles_started == _old_marking_cycles_completed + 1) || |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2389 (_old_marking_cycles_started == _old_marking_cycles_completed + 2), |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2390 err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u " |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2391 "is inconsistent with _old_marking_cycles_completed = %u", |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2392 _old_marking_cycles_started, _old_marking_cycles_completed)); |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2393 |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2394 // This is the case for the outer caller, i.e. the concurrent cycle. |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2395 assert(!concurrent || |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2396 (_old_marking_cycles_started == _old_marking_cycles_completed + 1), |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2397 err_msg("for outer caller (concurrent cycle): " |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2398 "_old_marking_cycles_started = %u " |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2399 "is inconsistent with _old_marking_cycles_completed = %u", |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2400 _old_marking_cycles_started, _old_marking_cycles_completed)); |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2401 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2402 _old_marking_cycles_completed += 1; |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2403 |
1840
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2404 // We need to clear the "in_progress" flag in the CM thread before |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2405 // we wake up any waiters (especially when ExplicitInvokesConcurrent |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2406 // is set) so that if a waiter requests another System.gc() it doesn't |
10405 | 2407 // incorrectly see that a marking cycle is still in progress. |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2408 if (concurrent) { |
1840
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2409 _cmThread->clear_in_progress(); |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2410 } |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2411 |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2412 // This notify_all() will ensure that a thread that called |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2413 // System.gc() with (with ExplicitGCInvokesConcurrent set or not) |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2414 // and it's waiting for a full GC to finish will be woken up. It is |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2415 // waiting in VM_G1IncCollectionPause::doit_epilogue(). |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2416 FullGCCount_lock->notify_all(); |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2417 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2418 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
2419 void G1CollectedHeap::register_concurrent_cycle_start(const Ticks& start_time) { |
10405 | 2420 _concurrent_cycle_started = true; |
2421 _gc_timer_cm->register_gc_start(start_time); | |
2422 | |
2423 _gc_tracer_cm->report_gc_start(gc_cause(), _gc_timer_cm->gc_start()); | |
2424 trace_heap_before_gc(_gc_tracer_cm); | |
2425 } | |
2426 | |
2427 void G1CollectedHeap::register_concurrent_cycle_end() { | |
2428 if (_concurrent_cycle_started) { | |
2429 if (_cm->has_aborted()) { | |
2430 _gc_tracer_cm->report_concurrent_mode_failure(); | |
2431 } | |
12179
f175e3678be2
8020692: TestGCEventMixed.java failed because of timestamp in event after end event
ehelin
parents:
12116
diff
changeset
|
2432 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
2433 _gc_timer_cm->register_gc_end(); |
10405 | 2434 _gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions()); |
2435 | |
22898
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2436 // Clear state variables to prepare for the next concurrent cycle. |
10405 | 2437 _concurrent_cycle_started = false; |
22898
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2438 _heap_summary_sent = false; |
10405 | 2439 } |
2440 } | |
2441 | |
2442 void G1CollectedHeap::trace_heap_after_concurrent_cycle() { | |
2443 if (_concurrent_cycle_started) { | |
22898
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2444 // This function can be called when: |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2445 // the cleanup pause is run |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2446 // the concurrent cycle is aborted before the cleanup pause. |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2447 // the concurrent cycle is aborted after the cleanup pause, |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2448 // but before the concurrent cycle end has been registered. |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2449 // Make sure that we only send the heap information once. |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2450 if (!_heap_summary_sent) { |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2451 trace_heap_after_gc(_gc_tracer_cm); |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2452 _heap_summary_sent = true; |
f97f21d8d58c
8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents:
22897
diff
changeset
|
2453 } |
10405 | 2454 } |
2455 } | |
2456 | |
2457 G1YCType G1CollectedHeap::yc_type() { | |
2458 bool is_young = g1_policy()->gcs_are_young(); | |
2459 bool is_initial_mark = g1_policy()->during_initial_mark_pause(); | |
2460 bool is_during_mark = mark_in_progress(); | |
2461 | |
2462 if (is_initial_mark) { | |
2463 return InitialMark; | |
2464 } else if (is_during_mark) { | |
2465 return DuringMark; | |
2466 } else if (is_young) { | |
2467 return Normal; | |
2468 } else { | |
2469 return Mixed; | |
2470 } | |
2471 } | |
2472 | |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2473 void G1CollectedHeap::collect(GCCause::Cause cause) { |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2474 assert_heap_not_locked(); |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2475 |
22936 | 2476 uint gc_count_before; |
2477 uint old_marking_count_before; | |
2478 uint full_gc_count_before; | |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2479 bool retry_gc; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2480 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2481 do { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2482 retry_gc = false; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2483 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2484 { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2485 MutexLocker ml(Heap_lock); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2486 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2487 // Read the GC count while holding the Heap_lock |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2488 gc_count_before = total_collections(); |
20571
1d6eb209432a
8058568: GC cleanup phase can cause G1 skipping a System.gc()
sjohanss
parents:
20543
diff
changeset
|
2489 full_gc_count_before = total_full_collections(); |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2490 old_marking_count_before = _old_marking_cycles_started; |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2491 } |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2492 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2493 if (should_do_concurrent_full_gc(cause)) { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2494 // Schedule an initial-mark evacuation pause that will start a |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2495 // concurrent cycle. We're setting word_size to 0 which means that |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2496 // we are not requesting a post-GC allocation. |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2497 VM_G1IncCollectionPause op(gc_count_before, |
1973 | 2498 0, /* word_size */ |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2499 true, /* should_initiate_conc_mark */ |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2500 g1_policy()->max_pause_time_ms(), |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2501 cause); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2502 op.set_allocation_context(AllocationContext::current()); |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2503 |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2504 VMThread::execute(&op); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2505 if (!op.pause_succeeded()) { |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2506 if (old_marking_count_before == _old_marking_cycles_started) { |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2507 retry_gc = op.should_retry_gc(); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2508 } else { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2509 // A Full GC happened while we were trying to schedule the |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2510 // initial-mark GC. No point in starting a new cycle given |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2511 // that the whole heap was collected anyway. |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2512 } |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2513 |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2514 if (retry_gc) { |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2515 if (GC_locker::is_active_and_needs_gc()) { |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2516 GC_locker::stall_until_clear(); |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2517 } |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2518 } |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2519 } |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2520 } else { |
20357
4bfc44ba0d19
8055098: WB API should be extended to provide information about size and age of object.
tschatzl
parents:
20337
diff
changeset
|
2521 if (cause == GCCause::_gc_locker || cause == GCCause::_wb_young_gc |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2522 DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2523 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2524 // Schedule a standard evacuation pause. We're setting word_size |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2525 // to 0 which means that we are not requesting a post-GC allocation. |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2526 VM_G1IncCollectionPause op(gc_count_before, |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2527 0, /* word_size */ |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2528 false, /* should_initiate_conc_mark */ |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2529 g1_policy()->max_pause_time_ms(), |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2530 cause); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2531 VMThread::execute(&op); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2532 } else { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2533 // Schedule a Full GC. |
20571
1d6eb209432a
8058568: GC cleanup phase can cause G1 skipping a System.gc()
sjohanss
parents:
20543
diff
changeset
|
2534 VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2535 VMThread::execute(&op); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2536 } |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2537 } |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2538 } while (retry_gc); |
342 | 2539 } |
2540 | |
2541 bool G1CollectedHeap::is_in(const void* p) const { | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2542 if (_hrm.reserved().contains(p)) { |
20337 | 2543 // Given that we know that p is in the reserved space, |
4708 | 2544 // heap_region_containing_raw() should successfully |
2545 // return the containing region. | |
2546 HeapRegion* hr = heap_region_containing_raw(p); | |
342 | 2547 return hr->is_in(p); |
2548 } else { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2549 return false; |
342 | 2550 } |
2551 } | |
2552 | |
20337 | 2553 #ifdef ASSERT |
2554 bool G1CollectedHeap::is_in_exact(const void* p) const { | |
2555 bool contains = reserved_region().contains(p); | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2556 bool available = _hrm.is_available(addr_to_region((HeapWord*)p)); |
20337 | 2557 if (contains && available) { |
2558 return true; | |
2559 } else { | |
2560 return false; | |
2561 } | |
2562 } | |
2563 #endif | |
2564 | |
342 | 2565 // Iteration functions. |
2566 | |
20309
a08bb8e45ba1
8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents:
20307
diff
changeset
|
2567 // Applies an ExtendedOopClosure onto all references of objects within a HeapRegion. |
342 | 2568 |
2569 class IterateOopClosureRegionClosure: public HeapRegionClosure { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2570 ExtendedOopClosure* _cl; |
342 | 2571 public: |
20309
a08bb8e45ba1
8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents:
20307
diff
changeset
|
2572 IterateOopClosureRegionClosure(ExtendedOopClosure* cl) : _cl(cl) {} |
342 | 2573 bool doHeapRegion(HeapRegion* r) { |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2574 if (!r->continuesHumongous()) { |
342 | 2575 r->oop_iterate(_cl); |
2576 } | |
2577 return false; | |
2578 } | |
2579 }; | |
2580 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2581 void G1CollectedHeap::oop_iterate(ExtendedOopClosure* cl) { |
20309
a08bb8e45ba1
8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents:
20307
diff
changeset
|
2582 IterateOopClosureRegionClosure blk(cl); |
3766 | 2583 heap_region_iterate(&blk); |
342 | 2584 } |
2585 | |
2586 // Iterates an ObjectClosure over all objects within a HeapRegion. | |
2587 | |
2588 class IterateObjectClosureRegionClosure: public HeapRegionClosure { | |
2589 ObjectClosure* _cl; | |
2590 public: | |
2591 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {} | |
2592 bool doHeapRegion(HeapRegion* r) { | |
2593 if (! r->continuesHumongous()) { | |
2594 r->object_iterate(_cl); | |
2595 } | |
2596 return false; | |
2597 } | |
2598 }; | |
2599 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2600 void G1CollectedHeap::object_iterate(ObjectClosure* cl) { |
342 | 2601 IterateObjectClosureRegionClosure blk(cl); |
3766 | 2602 heap_region_iterate(&blk); |
342 | 2603 } |
2604 | |
2605 // Calls a SpaceClosure on a HeapRegion. | |
2606 | |
2607 class SpaceClosureRegionClosure: public HeapRegionClosure { | |
2608 SpaceClosure* _cl; | |
2609 public: | |
2610 SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {} | |
2611 bool doHeapRegion(HeapRegion* r) { | |
2612 _cl->do_space(r); | |
2613 return false; | |
2614 } | |
2615 }; | |
2616 | |
2617 void G1CollectedHeap::space_iterate(SpaceClosure* cl) { | |
2618 SpaceClosureRegionClosure blk(cl); | |
3766 | 2619 heap_region_iterate(&blk); |
342 | 2620 } |
2621 | |
3766 | 2622 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2623 _hrm.iterate(cl); |
342 | 2624 } |
2625 | |
2626 void | |
2627 G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl, | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2628 uint worker_id, |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2629 uint num_workers, |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2630 jint claim_value) const { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2631 _hrm.par_iterate(cl, worker_id, num_workers, claim_value); |
355 | 2632 } |
2633 | |
390 | 2634 class ResetClaimValuesClosure: public HeapRegionClosure { |
2635 public: | |
2636 bool doHeapRegion(HeapRegion* r) { | |
2637 r->set_claim_value(HeapRegion::InitialClaimValue); | |
2638 return false; | |
2639 } | |
2640 }; | |
2641 | |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2642 void G1CollectedHeap::reset_heap_region_claim_values() { |
390 | 2643 ResetClaimValuesClosure blk; |
2644 heap_region_iterate(&blk); | |
2645 } | |
2646 | |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2647 void G1CollectedHeap::reset_cset_heap_region_claim_values() { |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2648 ResetClaimValuesClosure blk; |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2649 collection_set_iterate(&blk); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2650 } |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2651 |
355 | 2652 #ifdef ASSERT |
2653 // This checks whether all regions in the heap have the correct claim | |
2654 // value. I also piggy-backed on this a check to ensure that the | |
2655 // humongous_start_region() information on "continues humongous" | |
2656 // regions is correct. | |
2657 | |
2658 class CheckClaimValuesClosure : public HeapRegionClosure { | |
2659 private: | |
2660 jint _claim_value; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2661 uint _failures; |
355 | 2662 HeapRegion* _sh_region; |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2663 |
355 | 2664 public: |
2665 CheckClaimValuesClosure(jint claim_value) : | |
2666 _claim_value(claim_value), _failures(0), _sh_region(NULL) { } | |
2667 bool doHeapRegion(HeapRegion* r) { | |
2668 if (r->claim_value() != _claim_value) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2669 gclog_or_tty->print_cr("Region " HR_FORMAT ", " |
355 | 2670 "claim value = %d, should be %d", |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2671 HR_FORMAT_PARAMS(r), |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2672 r->claim_value(), _claim_value); |
355 | 2673 ++_failures; |
2674 } | |
2675 if (!r->isHumongous()) { | |
2676 _sh_region = NULL; | |
2677 } else if (r->startsHumongous()) { | |
2678 _sh_region = r; | |
2679 } else if (r->continuesHumongous()) { | |
2680 if (r->humongous_start_region() != _sh_region) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2681 gclog_or_tty->print_cr("Region " HR_FORMAT ", " |
355 | 2682 "HS = "PTR_FORMAT", should be "PTR_FORMAT, |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2683 HR_FORMAT_PARAMS(r), |
355 | 2684 r->humongous_start_region(), |
2685 _sh_region); | |
2686 ++_failures; | |
342 | 2687 } |
2688 } | |
355 | 2689 return false; |
2690 } | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2691 uint failures() { return _failures; } |
355 | 2692 }; |
2693 | |
2694 bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) { | |
2695 CheckClaimValuesClosure cl(claim_value); | |
2696 heap_region_iterate(&cl); | |
2697 return cl.failures() == 0; | |
2698 } | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2699 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2700 class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure { |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2701 private: |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2702 jint _claim_value; |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2703 uint _failures; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2704 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2705 public: |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2706 CheckClaimValuesInCSetHRClosure(jint claim_value) : |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2707 _claim_value(claim_value), _failures(0) { } |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2708 |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2709 uint failures() { return _failures; } |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2710 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2711 bool doHeapRegion(HeapRegion* hr) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2712 assert(hr->in_collection_set(), "how?"); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2713 assert(!hr->isHumongous(), "H-region in CSet"); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2714 if (hr->claim_value() != _claim_value) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2715 gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", " |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2716 "claim value = %d, should be %d", |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2717 HR_FORMAT_PARAMS(hr), |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2718 hr->claim_value(), _claim_value); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2719 _failures += 1; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2720 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2721 return false; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2722 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2723 }; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2724 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2725 bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2726 CheckClaimValuesInCSetHRClosure cl(claim_value); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2727 collection_set_iterate(&cl); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2728 return cl.failures() == 0; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2729 } |
355 | 2730 #endif // ASSERT |
342 | 2731 |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2732 // Clear the cached CSet starting regions and (more importantly) |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2733 // the time stamps. Called when we reset the GC time stamp. |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2734 void G1CollectedHeap::clear_cset_start_regions() { |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2735 assert(_worker_cset_start_region != NULL, "sanity"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2736 assert(_worker_cset_start_region_time_stamp != NULL, "sanity"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2737 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2738 int n_queues = MAX2((int)ParallelGCThreads, 1); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2739 for (int i = 0; i < n_queues; i++) { |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2740 _worker_cset_start_region[i] = NULL; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2741 _worker_cset_start_region_time_stamp[i] = 0; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2742 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2743 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2744 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2745 // Given the id of a worker, obtain or calculate a suitable |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2746 // starting region for iterating over the current collection set. |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
2747 HeapRegion* G1CollectedHeap::start_cset_region_for_worker(uint worker_i) { |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2748 assert(get_gc_time_stamp() > 0, "should have been updated by now"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2749 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2750 HeapRegion* result = NULL; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2751 unsigned gc_time_stamp = get_gc_time_stamp(); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2752 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2753 if (_worker_cset_start_region_time_stamp[worker_i] == gc_time_stamp) { |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2754 // Cached starting region for current worker was set |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2755 // during the current pause - so it's valid. |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2756 // Note: the cached starting heap region may be NULL |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2757 // (when the collection set is empty). |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2758 result = _worker_cset_start_region[worker_i]; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2759 assert(result == NULL || result->in_collection_set(), "sanity"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2760 return result; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2761 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2762 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2763 // The cached entry was not valid so let's calculate |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2764 // a suitable starting heap region for this worker. |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2765 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2766 // We want the parallel threads to start their collection |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2767 // set iteration at different collection set regions to |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2768 // avoid contention. |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2769 // If we have: |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2770 // n collection set regions |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2771 // p threads |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2772 // Then thread t will start at region floor ((t * n) / p) |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2773 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2774 result = g1_policy()->collection_set(); |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2775 if (G1CollectedHeap::use_parallel_gc_threads()) { |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2776 uint cs_size = g1_policy()->cset_region_length(); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
2777 uint active_workers = workers()->active_workers(); |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2778 assert(UseDynamicNumberOfGCThreads || |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2779 active_workers == workers()->total_workers(), |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2780 "Unless dynamic should use total workers"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2781 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2782 uint end_ind = (cs_size * worker_i) / active_workers; |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2783 uint start_ind = 0; |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2784 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2785 if (worker_i > 0 && |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2786 _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) { |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2787 // Previous workers starting region is valid |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2788 // so let's iterate from there |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2789 start_ind = (cs_size * (worker_i - 1)) / active_workers; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2790 result = _worker_cset_start_region[worker_i - 1]; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2791 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2792 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2793 for (uint i = start_ind; i < end_ind; i++) { |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2794 result = result->next_in_collection_set(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2795 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2796 } |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2797 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2798 // Note: the calculated starting heap region may be NULL |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2799 // (when the collection set is empty). |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2800 assert(result == NULL || result->in_collection_set(), "sanity"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2801 assert(_worker_cset_start_region_time_stamp[worker_i] != gc_time_stamp, |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2802 "should be updated only once per pause"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2803 _worker_cset_start_region[worker_i] = result; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2804 OrderAccess::storestore(); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2805 _worker_cset_start_region_time_stamp[worker_i] = gc_time_stamp; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2806 return result; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2807 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2808 |
342 | 2809 void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) { |
2810 HeapRegion* r = g1_policy()->collection_set(); | |
2811 while (r != NULL) { | |
2812 HeapRegion* next = r->next_in_collection_set(); | |
2813 if (cl->doHeapRegion(r)) { | |
2814 cl->incomplete(); | |
2815 return; | |
2816 } | |
2817 r = next; | |
2818 } | |
2819 } | |
2820 | |
2821 void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r, | |
2822 HeapRegionClosure *cl) { | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2823 if (r == NULL) { |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2824 // The CSet is empty so there's nothing to do. |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2825 return; |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2826 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2827 |
342 | 2828 assert(r->in_collection_set(), |
2829 "Start region must be a member of the collection set."); | |
2830 HeapRegion* cur = r; | |
2831 while (cur != NULL) { | |
2832 HeapRegion* next = cur->next_in_collection_set(); | |
2833 if (cl->doHeapRegion(cur) && false) { | |
2834 cl->incomplete(); | |
2835 return; | |
2836 } | |
2837 cur = next; | |
2838 } | |
2839 cur = g1_policy()->collection_set(); | |
2840 while (cur != r) { | |
2841 HeapRegion* next = cur->next_in_collection_set(); | |
2842 if (cl->doHeapRegion(cur) && false) { | |
2843 cl->incomplete(); | |
2844 return; | |
2845 } | |
2846 cur = next; | |
2847 } | |
2848 } | |
2849 | |
20304
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2850 HeapRegion* G1CollectedHeap::next_compaction_region(const HeapRegion* from) const { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2851 HeapRegion* result = _hrm.next_region_in_heap(from); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2852 while (result != NULL && result->isHumongous()) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2853 result = _hrm.next_region_in_heap(result); |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2854 } |
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
2855 return result; |
20304
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2856 } |
342 | 2857 |
2858 Space* G1CollectedHeap::space_containing(const void* addr) const { | |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
2859 return heap_region_containing(addr); |
342 | 2860 } |
2861 | |
2862 HeapWord* G1CollectedHeap::block_start(const void* addr) const { | |
2863 Space* sp = space_containing(addr); | |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
2864 return sp->block_start(addr); |
342 | 2865 } |
2866 | |
2867 size_t G1CollectedHeap::block_size(const HeapWord* addr) const { | |
2868 Space* sp = space_containing(addr); | |
2869 return sp->block_size(addr); | |
2870 } | |
2871 | |
2872 bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const { | |
2873 Space* sp = space_containing(addr); | |
2874 return sp->block_is_obj(addr); | |
2875 } | |
2876 | |
2877 bool G1CollectedHeap::supports_tlab_allocation() const { | |
2878 return true; | |
2879 } | |
2880 | |
2881 size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const { | |
17727 | 2882 return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes; |
2883 } | |
2884 | |
2885 size_t G1CollectedHeap::tlab_used(Thread* ignored) const { | |
2886 return young_list()->eden_used_bytes(); | |
2887 } | |
2888 | |
2889 // For G1 TLABs should not contain humongous objects, so the maximum TLAB size | |
2890 // must be smaller than the humongous object limit. | |
2891 size_t G1CollectedHeap::max_tlab_size() const { | |
2892 return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment); | |
342 | 2893 } |
2894 | |
2895 size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const { | |
2896 // Return the remaining space in the cur alloc region, but not less than | |
2897 // the min TLAB size. | |
1313
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
2898 |
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
2899 // Also, this value can be at most the humongous object threshold, |
10405 | 2900 // since we can't allow tlabs to grow big enough to accommodate |
1313
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
2901 // humongous objects. |
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
2902 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
2903 HeapRegion* hr = _allocator->mutator_alloc_region(AllocationContext::current())->get(); |
17727 | 2904 size_t max_tlab = max_tlab_size() * wordSize; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2905 if (hr == NULL) { |
17727 | 2906 return max_tlab; |
342 | 2907 } else { |
17727 | 2908 return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab); |
342 | 2909 } |
2910 } | |
2911 | |
2912 size_t G1CollectedHeap::max_capacity() const { | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
2913 return _hrm.reserved().byte_size(); |
342 | 2914 } |
2915 | |
2916 jlong G1CollectedHeap::millis_since_last_gc() { | |
2917 // assert(false, "NYI"); | |
2918 return 0; | |
2919 } | |
2920 | |
2921 void G1CollectedHeap::prepare_for_verify() { | |
2922 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) { | |
2923 ensure_parsability(false); | |
2924 } | |
2925 g1_rem_set()->prepare_for_verify(); | |
2926 } | |
2927 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2928 bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr, |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2929 VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2930 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2931 case VerifyOption_G1UsePrevMarking: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2932 return hr->obj_allocated_since_prev_marking(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2933 case VerifyOption_G1UseNextMarking: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2934 return hr->obj_allocated_since_next_marking(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2935 case VerifyOption_G1UseMarkWord: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2936 return false; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2937 default: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2938 ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2939 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2940 return false; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2941 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2942 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2943 HeapWord* G1CollectedHeap::top_at_mark_start(HeapRegion* hr, VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2944 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2945 case VerifyOption_G1UsePrevMarking: return hr->prev_top_at_mark_start(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2946 case VerifyOption_G1UseNextMarking: return hr->next_top_at_mark_start(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2947 case VerifyOption_G1UseMarkWord: return NULL; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2948 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2949 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2950 return NULL; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2951 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2952 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2953 bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2954 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2955 case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2956 case VerifyOption_G1UseNextMarking: return isMarkedNext(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2957 case VerifyOption_G1UseMarkWord: return obj->is_gc_marked(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2958 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2959 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2960 return false; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2961 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2962 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2963 const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2964 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2965 case VerifyOption_G1UsePrevMarking: return "PTAMS"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2966 case VerifyOption_G1UseNextMarking: return "NTAMS"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2967 case VerifyOption_G1UseMarkWord: return "NONE"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2968 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2969 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2970 return NULL; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2971 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2972 |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
2973 class VerifyRootsClosure: public OopClosure { |
12080 | 2974 private: |
2975 G1CollectedHeap* _g1h; | |
2976 VerifyOption _vo; | |
2977 bool _failures; | |
2978 public: | |
2979 // _vo == UsePrevMarking -> use "prev" marking information, | |
2980 // _vo == UseNextMarking -> use "next" marking information, | |
2981 // _vo == UseMarkWord -> use mark word from object header. | |
2982 VerifyRootsClosure(VerifyOption vo) : | |
2983 _g1h(G1CollectedHeap::heap()), | |
2984 _vo(vo), | |
2985 _failures(false) { } | |
2986 | |
2987 bool failures() { return _failures; } | |
2988 | |
2989 template <class T> void do_oop_nv(T* p) { | |
2990 T heap_oop = oopDesc::load_heap_oop(p); | |
2991 if (!oopDesc::is_null(heap_oop)) { | |
2992 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
2993 if (_g1h->is_obj_dead_cond(obj, _vo)) { | |
2994 gclog_or_tty->print_cr("Root location "PTR_FORMAT" " | |
2995 "points to dead obj "PTR_FORMAT, p, (void*) obj); | |
2996 if (_vo == VerifyOption_G1UseMarkWord) { | |
2997 gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark())); | |
2998 } | |
2999 obj->print_on(gclog_or_tty); | |
3000 _failures = true; | |
3001 } | |
3002 } | |
3003 } | |
3004 | |
3005 void do_oop(oop* p) { do_oop_nv(p); } | |
3006 void do_oop(narrowOop* p) { do_oop_nv(p); } | |
3007 }; | |
3008 | |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
3009 class G1VerifyCodeRootOopClosure: public OopClosure { |
12080 | 3010 G1CollectedHeap* _g1h; |
3011 OopClosure* _root_cl; | |
3012 nmethod* _nm; | |
3013 VerifyOption _vo; | |
3014 bool _failures; | |
3015 | |
3016 template <class T> void do_oop_work(T* p) { | |
3017 // First verify that this root is live | |
3018 _root_cl->do_oop(p); | |
3019 | |
3020 if (!G1VerifyHeapRegionCodeRoots) { | |
3021 // We're not verifying the code roots attached to heap region. | |
3022 return; | |
3023 } | |
3024 | |
3025 // Don't check the code roots during marking verification in a full GC | |
3026 if (_vo == VerifyOption_G1UseMarkWord) { | |
3027 return; | |
3028 } | |
3029 | |
3030 // Now verify that the current nmethod (which contains p) is | |
3031 // in the code root list of the heap region containing the | |
3032 // object referenced by p. | |
3033 | |
3034 T heap_oop = oopDesc::load_heap_oop(p); | |
3035 if (!oopDesc::is_null(heap_oop)) { | |
3036 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
3037 | |
3038 // Now fetch the region containing the object | |
3039 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
3040 HeapRegionRemSet* hrrs = hr->rem_set(); | |
3041 // Verify that the strong code root list for this region | |
3042 // contains the nmethod | |
3043 if (!hrrs->strong_code_roots_list_contains(_nm)) { | |
3044 gclog_or_tty->print_cr("Code root location "PTR_FORMAT" " | |
3045 "from nmethod "PTR_FORMAT" not in strong " | |
3046 "code roots for region ["PTR_FORMAT","PTR_FORMAT")", | |
3047 p, _nm, hr->bottom(), hr->end()); | |
3048 _failures = true; | |
3049 } | |
3050 } | |
3051 } | |
3052 | |
3053 public: | |
3054 G1VerifyCodeRootOopClosure(G1CollectedHeap* g1h, OopClosure* root_cl, VerifyOption vo): | |
3055 _g1h(g1h), _root_cl(root_cl), _vo(vo), _nm(NULL), _failures(false) {} | |
3056 | |
3057 void do_oop(oop* p) { do_oop_work(p); } | |
3058 void do_oop(narrowOop* p) { do_oop_work(p); } | |
3059 | |
3060 void set_nmethod(nmethod* nm) { _nm = nm; } | |
3061 bool failures() { return _failures; } | |
3062 }; | |
3063 | |
3064 class G1VerifyCodeRootBlobClosure: public CodeBlobClosure { | |
3065 G1VerifyCodeRootOopClosure* _oop_cl; | |
3066 | |
3067 public: | |
3068 G1VerifyCodeRootBlobClosure(G1VerifyCodeRootOopClosure* oop_cl): | |
3069 _oop_cl(oop_cl) {} | |
3070 | |
3071 void do_code_blob(CodeBlob* cb) { | |
3072 nmethod* nm = cb->as_nmethod_or_null(); | |
3073 if (nm != NULL) { | |
3074 _oop_cl->set_nmethod(nm); | |
3075 nm->oops_do(_oop_cl); | |
3076 } | |
3077 } | |
3078 }; | |
3079 | |
3080 class YoungRefCounterClosure : public OopClosure { | |
3081 G1CollectedHeap* _g1h; | |
3082 int _count; | |
3083 public: | |
3084 YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {} | |
3085 void do_oop(oop* p) { if (_g1h->is_in_young(*p)) { _count++; } } | |
3086 void do_oop(narrowOop* p) { ShouldNotReachHere(); } | |
3087 | |
3088 int count() { return _count; } | |
3089 void reset_count() { _count = 0; }; | |
3090 }; | |
3091 | |
3092 class VerifyKlassClosure: public KlassClosure { | |
3093 YoungRefCounterClosure _young_ref_counter_closure; | |
3094 OopClosure *_oop_closure; | |
3095 public: | |
3096 VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {} | |
3097 void do_klass(Klass* k) { | |
3098 k->oops_do(_oop_closure); | |
3099 | |
3100 _young_ref_counter_closure.reset_count(); | |
3101 k->oops_do(&_young_ref_counter_closure); | |
3102 if (_young_ref_counter_closure.count() > 0) { | |
3103 guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k)); | |
3104 } | |
3105 } | |
3106 }; | |
3107 | |
342 | 3108 class VerifyLivenessOopClosure: public OopClosure { |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3109 G1CollectedHeap* _g1h; |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3110 VerifyOption _vo; |
342 | 3111 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3112 VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo): |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3113 _g1h(g1h), _vo(vo) |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3114 { } |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3115 void do_oop(narrowOop *p) { do_oop_work(p); } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3116 void do_oop( oop *p) { do_oop_work(p); } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3117 |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3118 template <class T> void do_oop_work(T *p) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3119 oop obj = oopDesc::load_decode_heap_oop(p); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3120 guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo), |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3121 "Dead object referenced by a not dead object"); |
342 | 3122 } |
3123 }; | |
3124 | |
3125 class VerifyObjsInRegionClosure: public ObjectClosure { | |
811 | 3126 private: |
342 | 3127 G1CollectedHeap* _g1h; |
3128 size_t _live_bytes; | |
3129 HeapRegion *_hr; | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3130 VerifyOption _vo; |
342 | 3131 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3132 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3133 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3134 // _vo == UseMarkWord -> use mark word from object header. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3135 VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo) |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3136 : _live_bytes(0), _hr(hr), _vo(vo) { |
342 | 3137 _g1h = G1CollectedHeap::heap(); |
3138 } | |
3139 void do_object(oop o) { | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3140 VerifyLivenessOopClosure isLive(_g1h, _vo); |
342 | 3141 assert(o != NULL, "Huh?"); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3142 if (!_g1h->is_obj_dead_cond(o, _vo)) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3143 // If the object is alive according to the mark word, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3144 // then verify that the marking information agrees. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3145 // Note we can't verify the contra-positive of the |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3146 // above: if the object is dead (according to the mark |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3147 // word), it may not be marked, or may have been marked |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3148 // but has since became dead, or may have been allocated |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3149 // since the last marking. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3150 if (_vo == VerifyOption_G1UseMarkWord) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3151 guarantee(!_g1h->is_obj_dead(o), "mark word and concurrent mark mismatch"); |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3152 } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3153 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3154 o->oop_iterate_no_header(&isLive); |
1389
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3155 if (!_hr->obj_allocated_since_prev_marking(o)) { |
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3156 size_t obj_size = o->size(); // Make sure we don't overflow |
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3157 _live_bytes += (obj_size * HeapWordSize); |
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3158 } |
342 | 3159 } |
3160 } | |
3161 size_t live_bytes() { return _live_bytes; } | |
3162 }; | |
3163 | |
3164 class PrintObjsInRegionClosure : public ObjectClosure { | |
3165 HeapRegion *_hr; | |
3166 G1CollectedHeap *_g1; | |
3167 public: | |
3168 PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) { | |
3169 _g1 = G1CollectedHeap::heap(); | |
3170 }; | |
3171 | |
3172 void do_object(oop o) { | |
3173 if (o != NULL) { | |
3174 HeapWord *start = (HeapWord *) o; | |
3175 size_t word_sz = o->size(); | |
3176 gclog_or_tty->print("\nPrinting obj "PTR_FORMAT" of size " SIZE_FORMAT | |
3177 " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n", | |
3178 (void*) o, word_sz, | |
3179 _g1->isMarkedPrev(o), | |
3180 _g1->isMarkedNext(o), | |
3181 _hr->obj_allocated_since_prev_marking(o)); | |
3182 HeapWord *end = start + word_sz; | |
3183 HeapWord *cur; | |
3184 int *val; | |
3185 for (cur = start; cur < end; cur++) { | |
3186 val = (int *) cur; | |
3187 gclog_or_tty->print("\t "PTR_FORMAT":"PTR_FORMAT"\n", val, *val); | |
3188 } | |
3189 } | |
3190 } | |
3191 }; | |
3192 | |
3193 class VerifyRegionClosure: public HeapRegionClosure { | |
811 | 3194 private: |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3195 bool _par; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3196 VerifyOption _vo; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3197 bool _failures; |
811 | 3198 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3199 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3200 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3201 // _vo == UseMarkWord -> use mark word from object header. |
6008 | 3202 VerifyRegionClosure(bool par, VerifyOption vo) |
3203 : _par(par), | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3204 _vo(vo), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3205 _failures(false) {} |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3206 |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3207 bool failures() { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3208 return _failures; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3209 } |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3210 |
342 | 3211 bool doHeapRegion(HeapRegion* r) { |
637
25e146966e7c
6817419: G1: Enable extensive verification for humongous regions
iveresov
parents:
636
diff
changeset
|
3212 if (!r->continuesHumongous()) { |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3213 bool failures = false; |
6008 | 3214 r->verify(_vo, &failures); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3215 if (failures) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3216 _failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3217 } else { |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3218 VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3219 r->object_iterate(¬_dead_yet_cl); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3220 if (_vo != VerifyOption_G1UseNextMarking) { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3221 if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3222 gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] " |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3223 "max_live_bytes "SIZE_FORMAT" " |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3224 "< calculated "SIZE_FORMAT, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3225 r->bottom(), r->end(), |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3226 r->max_live_bytes(), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3227 not_dead_yet_cl.live_bytes()); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3228 _failures = true; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3229 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3230 } else { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3231 // When vo == UseNextMarking we cannot currently do a sanity |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3232 // check on the live bytes as the calculation has not been |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3233 // finalized yet. |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3234 } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3235 } |
342 | 3236 } |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3237 return false; // stop the region iteration if we hit a failure |
342 | 3238 } |
3239 }; | |
3240 | |
12080 | 3241 // This is the task used for parallel verification of the heap regions |
390 | 3242 |
3243 class G1ParVerifyTask: public AbstractGangTask { | |
3244 private: | |
3245 G1CollectedHeap* _g1h; | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3246 VerifyOption _vo; |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3247 bool _failures; |
390 | 3248 |
3249 public: | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3250 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3251 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3252 // _vo == UseMarkWord -> use mark word from object header. |
6008 | 3253 G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) : |
390 | 3254 AbstractGangTask("Parallel verify task"), |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3255 _g1h(g1h), |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3256 _vo(vo), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3257 _failures(false) { } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3258 |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3259 bool failures() { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3260 return _failures; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3261 } |
390 | 3262 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
3263 void work(uint worker_id) { |
637
25e146966e7c
6817419: G1: Enable extensive verification for humongous regions
iveresov
parents:
636
diff
changeset
|
3264 HandleMark hm; |
6008 | 3265 VerifyRegionClosure blk(true, _vo); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
3266 _g1h->heap_region_par_iterate_chunked(&blk, worker_id, |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3267 _g1h->workers()->active_workers(), |
390 | 3268 HeapRegion::ParVerifyClaimValue); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3269 if (blk.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3270 _failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3271 } |
390 | 3272 } |
3273 }; | |
3274 | |
12080 | 3275 void G1CollectedHeap::verify(bool silent, VerifyOption vo) { |
8855
24ef5fb05e0f
8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents:
8853
diff
changeset
|
3276 if (SafepointSynchronize::is_at_safepoint()) { |
12080 | 3277 assert(Thread::current()->is_VM_thread(), |
3278 "Expected to be executed serially by the VM thread at this point"); | |
3279 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3280 if (!silent) { gclog_or_tty->print("Roots "); } |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3281 VerifyRootsClosure rootsCl(vo); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3282 VerifyKlassClosure klassCl(this, &rootsCl); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3283 CLDToKlassAndOopClosure cldCl(&klassCl, &rootsCl, false); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3284 |
3293
1f4413413144
7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents:
3289
diff
changeset
|
3285 // We apply the relevant closures to all the oops in the |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3286 // system dictionary, class loader data graph, the string table |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3287 // and the nmethods in the code cache. |
20257
7426d8d76305
8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents:
20256
diff
changeset
|
3288 G1VerifyCodeRootOopClosure codeRootsCl(this, &rootsCl, vo); |
7426d8d76305
8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents:
20256
diff
changeset
|
3289 G1VerifyCodeRootBlobClosure blobsCl(&codeRootsCl); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3290 |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3291 { |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3292 G1RootProcessor root_processor(this); |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3293 root_processor.process_all_roots(&rootsCl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3294 &cldCl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3295 &blobsCl); |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
3296 } |
20257
7426d8d76305
8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents:
20256
diff
changeset
|
3297 |
12080 | 3298 bool failures = rootsCl.failures() || codeRootsCl.failures(); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3299 |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3300 if (vo != VerifyOption_G1UseMarkWord) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3301 // If we're verifying during a full GC then the region sets |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3302 // will have been torn down at the start of the GC. Therefore |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3303 // verifying the region sets will fail. So we only verify |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3304 // the region sets when not in a full GC. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3305 if (!silent) { gclog_or_tty->print("HeapRegionSets "); } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3306 verify_region_sets(); |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3307 } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3308 |
2152 | 3309 if (!silent) { gclog_or_tty->print("HeapRegions "); } |
390 | 3310 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) { |
3311 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
3312 "sanity check"); | |
3313 | |
6008 | 3314 G1ParVerifyTask task(this, vo); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3315 assert(UseDynamicNumberOfGCThreads || |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3316 workers()->active_workers() == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3317 "If not dynamic should be using all the workers"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3318 int n_workers = workers()->active_workers(); |
390 | 3319 set_par_threads(n_workers); |
3320 workers()->run_task(&task); | |
3321 set_par_threads(0); | |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3322 if (task.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3323 failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3324 } |
390 | 3325 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3326 // Checks that the expected amount of parallel work was done. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3327 // The implication is that n_workers is > 0. |
390 | 3328 assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue), |
3329 "sanity check"); | |
3330 | |
3331 reset_heap_region_claim_values(); | |
3332 | |
3333 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
3334 "sanity check"); | |
3335 } else { | |
6008 | 3336 VerifyRegionClosure blk(false, vo); |
3766 | 3337 heap_region_iterate(&blk); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3338 if (blk.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3339 failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3340 } |
390 | 3341 } |
2152 | 3342 if (!silent) gclog_or_tty->print("RemSet "); |
342 | 3343 rem_set()->verify(); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3344 |
17764 | 3345 if (G1StringDedup::is_enabled()) { |
3346 if (!silent) gclog_or_tty->print("StrDedup "); | |
3347 G1StringDedup::verify(); | |
3348 } | |
3349 | |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3350 if (failures) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3351 gclog_or_tty->print_cr("Heap:"); |
4073
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3352 // It helps to have the per-region information in the output to |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3353 // help us track down what went wrong. This is why we call |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3354 // print_extended_on() instead of print_on(). |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3355 print_extended_on(gclog_or_tty); |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
3356 gclog_or_tty->cr(); |
1547
fb1a39993f69
6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents:
1545
diff
changeset
|
3357 #ifndef PRODUCT |
1044 | 3358 if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) { |
1388 | 3359 concurrent_mark()->print_reachable("at-verification-failure", |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3360 vo, false /* all */); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3361 } |
1547
fb1a39993f69
6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents:
1545
diff
changeset
|
3362 #endif |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3363 gclog_or_tty->flush(); |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3364 } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3365 guarantee(!failures, "there should not have been any failures"); |
342 | 3366 } else { |
17764 | 3367 if (!silent) { |
3368 gclog_or_tty->print("(SKIPPING Roots, HeapRegionSets, HeapRegions, RemSet"); | |
3369 if (G1StringDedup::is_enabled()) { | |
3370 gclog_or_tty->print(", StrDedup"); | |
3371 } | |
3372 gclog_or_tty->print(") "); | |
3373 } | |
342 | 3374 } |
3375 } | |
3376 | |
12080 | 3377 void G1CollectedHeap::verify(bool silent) { |
3378 verify(silent, VerifyOption_G1UsePrevMarking); | |
3379 } | |
3380 | |
3381 double G1CollectedHeap::verify(bool guard, const char* msg) { | |
3382 double verify_time_ms = 0.0; | |
3383 | |
3384 if (guard && total_collections() >= VerifyGCStartAt) { | |
3385 double verify_start = os::elapsedTime(); | |
3386 HandleMark hm; // Discard invalid handles created during verification | |
3387 prepare_for_verify(); | |
3388 Universe::verify(VerifyOption_G1UsePrevMarking, msg); | |
3389 verify_time_ms = (os::elapsedTime() - verify_start) * 1000; | |
3390 } | |
3391 | |
3392 return verify_time_ms; | |
3393 } | |
3394 | |
3395 void G1CollectedHeap::verify_before_gc() { | |
3396 double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:"); | |
3397 g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms); | |
3398 } | |
3399 | |
3400 void G1CollectedHeap::verify_after_gc() { | |
3401 double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:"); | |
3402 g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms); | |
3403 } | |
3404 | |
342 | 3405 class PrintRegionClosure: public HeapRegionClosure { |
3406 outputStream* _st; | |
3407 public: | |
3408 PrintRegionClosure(outputStream* st) : _st(st) {} | |
3409 bool doHeapRegion(HeapRegion* r) { | |
3410 r->print_on(_st); | |
3411 return false; | |
3412 } | |
3413 }; | |
3414 | |
17833
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3415 bool G1CollectedHeap::is_obj_dead_cond(const oop obj, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3416 const HeapRegion* hr, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3417 const VerifyOption vo) const { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3418 switch (vo) { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3419 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3420 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3421 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3422 default: ShouldNotReachHere(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3423 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3424 return false; // keep some compilers happy |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3425 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3426 |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3427 bool G1CollectedHeap::is_obj_dead_cond(const oop obj, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3428 const VerifyOption vo) const { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3429 switch (vo) { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3430 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3431 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3432 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3433 default: ShouldNotReachHere(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3434 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3435 return false; // keep some compilers happy |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3436 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3437 |
342 | 3438 void G1CollectedHeap::print_on(outputStream* st) const { |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3439 st->print(" %-20s", "garbage-first heap"); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3440 st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K", |
846
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
3441 capacity()/K, used_unlocked()/K); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3442 st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")", |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
3443 _hrm.reserved().start(), |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
3444 _hrm.reserved().start() + _hrm.length() + HeapRegion::GrainWords, |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
3445 _hrm.reserved().end()); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3446 st->cr(); |
3986
65a8ff39a6da
7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents:
3983
diff
changeset
|
3447 st->print(" region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K); |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3448 uint young_regions = _young_list->length(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3449 st->print("%u young (" SIZE_FORMAT "K), ", young_regions, |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3450 (size_t) young_regions * HeapRegion::GrainBytes / K); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3451 uint survivor_regions = g1_policy()->recorded_survivor_regions(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3452 st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions, |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3453 (size_t) survivor_regions * HeapRegion::GrainBytes / K); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3454 st->cr(); |
6863
04155d9c8c76
8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file
johnc
parents:
6819
diff
changeset
|
3455 MetaspaceAux::print_on(st); |
4073
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3456 } |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3457 |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3458 void G1CollectedHeap::print_extended_on(outputStream* st) const { |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3459 print_on(st); |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3460 |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3461 // Print the per-region information. |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3462 st->cr(); |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3463 st->print_cr("Heap Regions: (Y=young(eden), SU=young(survivor), " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3464 "HS=humongous(starts), HC=humongous(continues), " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3465 "CS=collection set, F=free, TS=gc time stamp, " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3466 "PTAMS=previous top-at-mark-start, " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3467 "NTAMS=next top-at-mark-start)"); |
342 | 3468 PrintRegionClosure blk(st); |
3766 | 3469 heap_region_iterate(&blk); |
342 | 3470 } |
3471 | |
9076
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3472 void G1CollectedHeap::print_on_error(outputStream* st) const { |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3473 this->CollectedHeap::print_on_error(st); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3474 |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3475 if (_cm != NULL) { |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3476 st->cr(); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3477 _cm->print_on_error(st); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3478 } |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3479 } |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3480 |
342 | 3481 void G1CollectedHeap::print_gc_threads_on(outputStream* st) const { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
3482 if (G1CollectedHeap::use_parallel_gc_threads()) { |
1019 | 3483 workers()->print_worker_threads_on(st); |
3484 } | |
3485 _cmThread->print_on(st); | |
342 | 3486 st->cr(); |
1019 | 3487 _cm->print_worker_threads_on(st); |
3488 _cg1r->print_worker_threads_on(st); | |
17764 | 3489 if (G1StringDedup::is_enabled()) { |
3490 G1StringDedup::print_worker_threads_on(st); | |
3491 } | |
342 | 3492 } |
3493 | |
3494 void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
3495 if (G1CollectedHeap::use_parallel_gc_threads()) { |
342 | 3496 workers()->threads_do(tc); |
3497 } | |
3498 tc->do_thread(_cmThread); | |
794 | 3499 _cg1r->threads_do(tc); |
17764 | 3500 if (G1StringDedup::is_enabled()) { |
3501 G1StringDedup::threads_do(tc); | |
3502 } | |
342 | 3503 } |
3504 | |
3505 void G1CollectedHeap::print_tracing_info() const { | |
3506 // We'll overload this to mean "trace GC pause statistics." | |
3507 if (TraceGen0Time || TraceGen1Time) { | |
3508 // The "G1CollectorPolicy" is keeping track of these stats, so delegate | |
3509 // to that. | |
3510 g1_policy()->print_tracing_info(); | |
3511 } | |
751 | 3512 if (G1SummarizeRSetStats) { |
342 | 3513 g1_rem_set()->print_summary_info(); |
3514 } | |
1282 | 3515 if (G1SummarizeConcMark) { |
342 | 3516 concurrent_mark()->print_summary_info(); |
3517 } | |
3518 g1_policy()->print_yg_surv_rate_info(); | |
3519 SpecializationStats::print(); | |
3520 } | |
3521 | |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3522 #ifndef PRODUCT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3523 // Helpful for debugging RSet issues. |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3524 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3525 class PrintRSetsClosure : public HeapRegionClosure { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3526 private: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3527 const char* _msg; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3528 size_t _occupied_sum; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3529 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3530 public: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3531 bool doHeapRegion(HeapRegion* r) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3532 HeapRegionRemSet* hrrs = r->rem_set(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3533 size_t occupied = hrrs->occupied(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3534 _occupied_sum += occupied; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3535 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3536 gclog_or_tty->print_cr("Printing RSet for region "HR_FORMAT, |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3537 HR_FORMAT_PARAMS(r)); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3538 if (occupied == 0) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3539 gclog_or_tty->print_cr(" RSet is empty"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3540 } else { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3541 hrrs->print(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3542 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3543 gclog_or_tty->print_cr("----------"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3544 return false; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3545 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3546 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3547 PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3548 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3549 gclog_or_tty->print_cr("========================================"); |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
3550 gclog_or_tty->print_cr("%s", msg); |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3551 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3552 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3553 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3554 ~PrintRSetsClosure() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3555 gclog_or_tty->print_cr("Occupied Sum: "SIZE_FORMAT, _occupied_sum); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3556 gclog_or_tty->print_cr("========================================"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3557 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3558 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3559 }; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3560 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3561 void G1CollectedHeap::print_cset_rsets() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3562 PrintRSetsClosure cl("Printing CSet RSets"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3563 collection_set_iterate(&cl); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3564 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3565 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3566 void G1CollectedHeap::print_all_rsets() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3567 PrintRSetsClosure cl("Printing All RSets");; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3568 heap_region_iterate(&cl); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3569 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3570 #endif // PRODUCT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3571 |
342 | 3572 G1CollectedHeap* G1CollectedHeap::heap() { |
3573 assert(_sh->kind() == CollectedHeap::G1CollectedHeap, | |
3574 "not a garbage-first heap"); | |
3575 return _g1h; | |
3576 } | |
3577 | |
3578 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) { | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1166
diff
changeset
|
3579 // always_do_update_barrier = false; |
342 | 3580 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer"); |
3581 // Fill TLAB's and such | |
17727 | 3582 accumulate_statistics_all_tlabs(); |
342 | 3583 ensure_parsability(true); |
12339
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3584 |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3585 if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) && |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3586 (total_collections() % G1SummarizeRSetStatsPeriod == 0)) { |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3587 g1_rem_set()->print_periodic_summary_info("Before GC RS summary"); |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3588 } |
342 | 3589 } |
3590 | |
20445
e5668dcf12e9
8057818: collect allocation context statistics at gc pauses
jcoomes
parents:
20404
diff
changeset
|
3591 void G1CollectedHeap::gc_epilogue(bool full) { |
10372
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3592 |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3593 if (G1SummarizeRSetStats && |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3594 (G1SummarizeRSetStatsPeriod > 0) && |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3595 // we are at the end of the GC. Total collections has already been increased. |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3596 ((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) { |
12339
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3597 g1_rem_set()->print_periodic_summary_info("After GC RS summary"); |
10372
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3598 } |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3599 |
342 | 3600 // FIXME: what is this about? |
3601 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled" | |
3602 // is set. | |
3603 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), | |
3604 "derived pointer present")); | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1166
diff
changeset
|
3605 // always_do_update_barrier = true; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3606 |
17727 | 3607 resize_all_tlabs(); |
20445
e5668dcf12e9
8057818: collect allocation context statistics at gc pauses
jcoomes
parents:
20404
diff
changeset
|
3608 allocation_context_stats().update(full); |
17727 | 3609 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3610 // We have just completed a GC. Update the soft reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3611 // policy with the new heap occupancy |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3612 Universe::update_heap_info_at_gc(); |
342 | 3613 } |
3614 | |
1973 | 3615 HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size, |
22936 | 3616 uint gc_count_before, |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
3617 bool* succeeded, |
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
3618 GCCause::Cause gc_cause) { |
1973 | 3619 assert_heap_not_locked_and_not_at_safepoint(); |
342 | 3620 g1_policy()->record_stop_world_start(); |
1973 | 3621 VM_G1IncCollectionPause op(gc_count_before, |
3622 word_size, | |
3623 false, /* should_initiate_conc_mark */ | |
3624 g1_policy()->max_pause_time_ms(), | |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
3625 gc_cause); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
3626 |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
3627 op.set_allocation_context(AllocationContext::current()); |
1973 | 3628 VMThread::execute(&op); |
3629 | |
3630 HeapWord* result = op.result(); | |
3631 bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded(); | |
3632 assert(result == NULL || ret_succeeded, | |
3633 "the result should be NULL if the VM did not succeed"); | |
3634 *succeeded = ret_succeeded; | |
3635 | |
3636 assert_heap_not_locked(); | |
3637 return result; | |
342 | 3638 } |
3639 | |
3640 void | |
3641 G1CollectedHeap::doConcurrentMark() { | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3642 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3643 if (!_cmThread->in_progress()) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3644 _cmThread->set_started(); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3645 CGC_lock->notify(); |
342 | 3646 } |
3647 } | |
3648 | |
3649 size_t G1CollectedHeap::pending_card_num() { | |
3650 size_t extra_cards = 0; | |
3651 JavaThread *curr = Threads::first(); | |
3652 while (curr != NULL) { | |
3653 DirtyCardQueue& dcq = curr->dirty_card_queue(); | |
3654 extra_cards += dcq.size(); | |
3655 curr = curr->next(); | |
3656 } | |
3657 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); | |
3658 size_t buffer_size = dcqs.buffer_size(); | |
3659 size_t buffer_num = dcqs.completed_buffers_num(); | |
6611 | 3660 |
3661 // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes | |
3662 // in bytes - not the number of 'entries'. We need to convert | |
3663 // into a number of cards. | |
3664 return (buffer_size * buffer_num + extra_cards) / oopSize; | |
342 | 3665 } |
3666 | |
3667 size_t G1CollectedHeap::cards_scanned() { | |
1861 | 3668 return g1_rem_set()->cardsScanned(); |
342 | 3669 } |
3670 | |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3671 class RegisterHumongousWithInCSetFastTestClosure : public HeapRegionClosure { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3672 private: |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3673 size_t _total_humongous; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3674 size_t _candidate_humongous; |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3675 |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3676 DirtyCardQueue _dcq; |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3677 |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3678 // We don't nominate objects with many remembered set entries, on |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3679 // the assumption that such objects are likely still live. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3680 bool is_remset_small(HeapRegion* region) const { |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3681 HeapRegionRemSet* const rset = region->rem_set(); |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3682 return G1EagerReclaimHumongousObjectsWithStaleRefs |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3683 ? rset->occupancy_less_or_equal_than(G1RSetSparseRegionEntries) |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3684 : rset->is_empty(); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3685 } |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3686 |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3687 bool is_typeArray_region(HeapRegion* region) const { |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3688 return oop(region->bottom())->is_typeArray(); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3689 } |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3690 |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3691 bool humongous_region_is_candidate(G1CollectedHeap* heap, HeapRegion* region) const { |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3692 assert(region->startsHumongous(), "Must start a humongous object"); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3693 |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3694 // Candidate selection must satisfy the following constraints |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3695 // while concurrent marking is in progress: |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3696 // |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3697 // * In order to maintain SATB invariants, an object must not be |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3698 // reclaimed if it was allocated before the start of marking and |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3699 // has not had its references scanned. Such an object must have |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3700 // its references (including type metadata) scanned to ensure no |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3701 // live objects are missed by the marking process. Objects |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3702 // allocated after the start of concurrent marking don't need to |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3703 // be scanned. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3704 // |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3705 // * An object must not be reclaimed if it is on the concurrent |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3706 // mark stack. Objects allocated after the start of concurrent |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3707 // marking are never pushed on the mark stack. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3708 // |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3709 // Nominating only objects allocated after the start of concurrent |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3710 // marking is sufficient to meet both constraints. This may miss |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3711 // some objects that satisfy the constraints, but the marking data |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3712 // structures don't support efficiently performing the needed |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3713 // additional tests or scrubbing of the mark stack. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3714 // |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3715 // However, we presently only nominate is_typeArray() objects. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3716 // A humongous object containing references induces remembered |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3717 // set entries on other regions. In order to reclaim such an |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3718 // object, those remembered sets would need to be cleaned up. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3719 // |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3720 // We also treat is_typeArray() objects specially, allowing them |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3721 // to be reclaimed even if allocated before the start of |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3722 // concurrent mark. For this we rely on mark stack insertion to |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3723 // exclude is_typeArray() objects, preventing reclaiming an object |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3724 // that is in the mark stack. We also rely on the metadata for |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3725 // such objects to be built-in and so ensured to be kept live. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3726 // Frequent allocation and drop of large binary blobs is an |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3727 // important use case for eager reclaim, and this special handling |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3728 // may reduce needed headroom. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3729 |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3730 return is_typeArray_region(region) && is_remset_small(region); |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3731 } |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3732 |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3733 public: |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3734 RegisterHumongousWithInCSetFastTestClosure() |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3735 : _total_humongous(0), |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3736 _candidate_humongous(0), |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3737 _dcq(&JavaThread::dirty_card_queue_set()) { |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3738 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3739 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3740 virtual bool doHeapRegion(HeapRegion* r) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3741 if (!r->startsHumongous()) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3742 return false; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3743 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3744 G1CollectedHeap* g1h = G1CollectedHeap::heap(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3745 |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3746 bool is_candidate = humongous_region_is_candidate(g1h, r); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3747 uint rindex = r->hrm_index(); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3748 g1h->set_humongous_reclaim_candidate(rindex, is_candidate); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3749 if (is_candidate) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3750 _candidate_humongous++; |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3751 g1h->register_humongous_region_with_in_cset_fast_test(rindex); |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3752 // Is_candidate already filters out humongous object with large remembered sets. |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3753 // If we have a humongous object with a few remembered sets, we simply flush these |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3754 // remembered set entries into the DCQS. That will result in automatic |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3755 // re-evaluation of their remembered set entries during the following evacuation |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3756 // phase. |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3757 if (!r->rem_set()->is_empty()) { |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3758 guarantee(r->rem_set()->occupancy_less_or_equal_than(G1RSetSparseRegionEntries), |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3759 "Found a not-small remembered set here. This is inconsistent with previous assumptions."); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3760 G1SATBCardTableLoggingModRefBS* bs = g1h->g1_barrier_set(); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3761 HeapRegionRemSetIterator hrrs(r->rem_set()); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3762 size_t card_index; |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3763 while (hrrs.has_next(card_index)) { |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3764 jbyte* card_ptr = (jbyte*)bs->byte_for_index(card_index); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3765 if (*card_ptr != CardTableModRefBS::dirty_card_val()) { |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3766 *card_ptr = CardTableModRefBS::dirty_card_val(); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3767 _dcq.enqueue(card_ptr); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3768 } |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3769 } |
23569
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
3770 assert(hrrs.n_yielded() == r->rem_set()->occupied(), |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
3771 err_msg("Remembered set hash maps out of sync, cur: " SIZE_FORMAT " entries, next: " SIZE_FORMAT " entries", |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
3772 hrrs.n_yielded(), r->rem_set()->occupied())); |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3773 r->rem_set()->clear_locked(); |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3774 } |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3775 assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty."); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3776 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3777 _total_humongous++; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3778 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3779 return false; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3780 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3781 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3782 size_t total_humongous() const { return _total_humongous; } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3783 size_t candidate_humongous() const { return _candidate_humongous; } |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3784 |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3785 void flush_rem_set_entries() { _dcq.flush(); } |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3786 }; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3787 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3788 void G1CollectedHeap::register_humongous_regions_with_in_cset_fast_test() { |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3789 if (!G1EagerReclaimHumongousObjects) { |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3790 g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(0.0, 0, 0); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3791 return; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3792 } |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3793 double time = os::elapsed_counter(); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3794 |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
3795 // Collect reclaim candidate information and register candidates with cset. |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3796 RegisterHumongousWithInCSetFastTestClosure cl; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3797 heap_region_iterate(&cl); |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3798 |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3799 time = ((double)(os::elapsed_counter() - time) / os::elapsed_frequency()) * 1000.0; |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3800 g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(time, |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3801 cl.total_humongous(), |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3802 cl.candidate_humongous()); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3803 _has_humongous_reclaim_candidates = cl.candidate_humongous() > 0; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3804 |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3805 // Finally flush all remembered set entries to re-check into the global DCQS. |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
3806 cl.flush_rem_set_entries(); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3807 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
3808 |
342 | 3809 void |
3810 G1CollectedHeap::setup_surviving_young_words() { | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3811 assert(_surviving_young_words == NULL, "pre-condition"); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3812 uint array_length = g1_policy()->young_cset_region_length(); |
6197 | 3813 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC); |
342 | 3814 if (_surviving_young_words == NULL) { |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
10099
diff
changeset
|
3815 vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR, |
342 | 3816 "Not enough space for young surv words summary."); |
3817 } | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3818 memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t)); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3819 #ifdef ASSERT |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3820 for (uint i = 0; i < array_length; ++i) { |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3821 assert( _surviving_young_words[i] == 0, "memset above" ); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3822 } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3823 #endif // !ASSERT |
342 | 3824 } |
3825 | |
3826 void | |
3827 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) { | |
3828 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3829 uint array_length = g1_policy()->young_cset_region_length(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3830 for (uint i = 0; i < array_length; ++i) { |
342 | 3831 _surviving_young_words[i] += surv_young_words[i]; |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3832 } |
342 | 3833 } |
3834 | |
3835 void | |
3836 G1CollectedHeap::cleanup_surviving_young_words() { | |
3837 guarantee( _surviving_young_words != NULL, "pre-condition" ); | |
6197 | 3838 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC); |
342 | 3839 _surviving_young_words = NULL; |
3840 } | |
3841 | |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3842 #ifdef ASSERT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3843 class VerifyCSetClosure: public HeapRegionClosure { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3844 public: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3845 bool doHeapRegion(HeapRegion* hr) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3846 // Here we check that the CSet region's RSet is ready for parallel |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3847 // iteration. The fields that we'll verify are only manipulated |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3848 // when the region is part of a CSet and is collected. Afterwards, |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3849 // we reset these fields when we clear the region's RSet (when the |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3850 // region is freed) so they are ready when the region is |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3851 // re-allocated. The only exception to this is if there's an |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3852 // evacuation failure and instead of freeing the region we leave |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3853 // it in the heap. In that case, we reset these fields during |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3854 // evacuation failure handling. |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3855 guarantee(hr->rem_set()->verify_ready_for_par_iteration(), "verification"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3856 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3857 // Here's a good place to add any other checks we'd like to |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3858 // perform on CSet regions. |
1261
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3859 return false; |
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3860 } |
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3861 }; |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3862 #endif // ASSERT |
1261
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3863 |
1709 | 3864 #if TASKQUEUE_STATS |
3865 void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) { | |
3866 st->print_raw_cr("GC Task Stats"); | |
3867 st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr(); | |
3868 st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr(); | |
3869 } | |
3870 | |
3871 void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const { | |
3872 print_taskqueue_stats_hdr(st); | |
3873 | |
3874 TaskQueueStats totals; | |
1755
8e5955ddf8e4
6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents:
1719
diff
changeset
|
3875 const int n = workers() != NULL ? workers()->total_workers() : 1; |
1709 | 3876 for (int i = 0; i < n; ++i) { |
3877 st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr(); | |
3878 totals += task_queue(i)->stats; | |
3879 } | |
3880 st->print_raw("tot "); totals.print(st); st->cr(); | |
3881 | |
3882 DEBUG_ONLY(totals.verify()); | |
3883 } | |
3884 | |
3885 void G1CollectedHeap::reset_taskqueue_stats() { | |
1755
8e5955ddf8e4
6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents:
1719
diff
changeset
|
3886 const int n = workers() != NULL ? workers()->total_workers() : 1; |
1709 | 3887 for (int i = 0; i < n; ++i) { |
3888 task_queue(i)->stats.reset(); | |
3889 } | |
3890 } | |
3891 #endif // TASKQUEUE_STATS | |
3892 | |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3893 void G1CollectedHeap::log_gc_header() { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3894 if (!G1Log::fine()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3895 return; |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3896 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3897 |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
3898 gclog_or_tty->gclog_stamp(_gc_tracer_stw->gc_id()); |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3899 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3900 GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause()) |
7455
0b54ffe4c2d3
8005672: Clean up some changes to GC logging with GCCause's
jmasa
parents:
7397
diff
changeset
|
3901 .append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)") |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3902 .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : ""); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3903 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3904 gclog_or_tty->print("[%s", (const char*)gc_cause_str); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3905 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3906 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3907 void G1CollectedHeap::log_gc_footer(double pause_time_sec) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3908 if (!G1Log::fine()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3909 return; |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3910 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3911 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3912 if (G1Log::finer()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3913 if (evacuation_failed()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3914 gclog_or_tty->print(" (to-space exhausted)"); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3915 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3916 gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3917 g1_policy()->phase_times()->note_gc_end(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3918 g1_policy()->phase_times()->print(pause_time_sec); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3919 g1_policy()->print_detailed_heap_transition(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3920 } else { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3921 if (evacuation_failed()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3922 gclog_or_tty->print("--"); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3923 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3924 g1_policy()->print_heap_transition(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3925 gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3926 } |
7207
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
3927 gclog_or_tty->flush(); |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3928 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3929 |
1973 | 3930 bool |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3931 G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) { |
2152 | 3932 assert_at_safepoint(true /* should_be_vm_thread */); |
3933 guarantee(!is_gc_active(), "collection is not reentrant"); | |
3934 | |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3935 if (GC_locker::check_active_before_gc()) { |
1973 | 3936 return false; |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3937 } |
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3938 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
3939 _gc_timer_stw->register_gc_start(); |
10405 | 3940 |
3941 _gc_tracer_stw->report_gc_start(gc_cause(), _gc_timer_stw->gc_start()); | |
3942 | |
2125
7246a374a9f2
6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents:
2039
diff
changeset
|
3943 SvcGCMarker sgcm(SvcGCMarker::MINOR); |
2039
7c5250dbd584
6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents:
2038
diff
changeset
|
3944 ResourceMark rm; |
7c5250dbd584
6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents:
2038
diff
changeset
|
3945 |
4872
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4787
diff
changeset
|
3946 print_heap_before_gc(); |
10405 | 3947 trace_heap_before_gc(_gc_tracer_stw); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3948 |
2152 | 3949 verify_region_sets_optional(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
3950 verify_dirty_young_regions(); |
2152 | 3951 |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3952 // This call will decide whether this pause is an initial-mark |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3953 // pause. If it is, during_initial_mark_pause() will return true |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3954 // for the duration of this pause. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3955 g1_policy()->decide_on_conc_mark_initiation(); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3956 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3957 // We do not allow initial-mark to be piggy-backed on a mixed GC. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3958 assert(!g1_policy()->during_initial_mark_pause() || |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3959 g1_policy()->gcs_are_young(), "sanity"); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3960 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3961 // We also do not allow mixed GCs during marking. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3962 assert(!mark_in_progress() || g1_policy()->gcs_are_young(), "sanity"); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3963 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3964 // Record whether this pause is an initial mark. When the current |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3965 // thread has completed its logging output and it's safe to signal |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3966 // the CM thread, the flag's value in the policy has been reset. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3967 bool should_start_conc_mark = g1_policy()->during_initial_mark_pause(); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3968 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3969 // Inner scope for scope based logging, timers, and stats collection |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3970 { |
10405 | 3971 EvacuationInfo evacuation_info; |
3972 | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3973 if (g1_policy()->during_initial_mark_pause()) { |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3974 // We are about to start a marking cycle, so we increment the |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3975 // full collection counter. |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
3976 increment_old_marking_cycles_started(); |
10405 | 3977 register_concurrent_cycle_start(_gc_timer_stw->gc_start()); |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3978 } |
10405 | 3979 |
3980 _gc_tracer_stw->report_yc_type(yc_type()); | |
3981 | |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
3982 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); |
6030 | 3983 |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
3984 uint active_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
3985 workers()->active_workers() : 1); |
6628
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
3986 double pause_start_sec = os::elapsedTime(); |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
3987 g1_policy()->phase_times()->note_gc_start(active_workers, mark_in_progress()); |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3988 log_gc_header(); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3989 |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
3990 TraceCollectorStats tcs(g1mm()->incremental_collection_counters()); |
3356
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
3323
diff
changeset
|
3991 TraceMemoryManagerStats tms(false /* fullGC */, gc_cause()); |
1089
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
1088
diff
changeset
|
3992 |
2361 | 3993 // If the secondary_free_list is not empty, append it to the |
3994 // free_list. No need to wait for the cleanup operation to finish; | |
3995 // the region allocation code will check the secondary_free_list | |
3996 // and wait if necessary. If the G1StressConcRegionFreeing flag is | |
3997 // set, skip this step so that the region allocation code has to | |
3998 // get entries from the secondary_free_list. | |
2152 | 3999 if (!G1StressConcRegionFreeing) { |
2361 | 4000 append_secondary_free_list_if_not_empty_with_lock(); |
2152 | 4001 } |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4002 |
12080 | 4003 assert(check_young_list_well_formed(), "young list should be well formed"); |
4004 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
4005 "sanity check"); | |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4006 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4007 // Don't dynamically change the number of GC threads this early. A value of |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4008 // 0 is used to indicate serial work. When parallel work is done, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4009 // it will be set. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4010 |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4011 { // Call to jvmpi::post_class_unload_events must occur outside of active GC |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4012 IsGCActiveMark x; |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4013 |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4014 gc_prologue(false); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4015 increment_total_collections(false /* full gc */); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4016 increment_gc_time_stamp(); |
342 | 4017 |
6628
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
4018 verify_before_gc(); |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
4019 check_bitmaps("GC Start"); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4020 |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4021 COMPILER2_PRESENT(DerivedPointerTable::clear()); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4022 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4023 // Please see comment in g1CollectedHeap.hpp and |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4024 // G1CollectedHeap::ref_processing_init() to see how |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4025 // reference processing currently works in G1. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4026 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4027 // Enable discovery in the STW reference processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4028 ref_processor_stw()->enable_discovery(true /*verify_disabled*/, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4029 true /*verify_no_refs*/); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4030 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4031 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4032 // We want to temporarily turn off discovery by the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4033 // CM ref processor, if necessary, and turn it back on |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4034 // on again later if we do. Using a scoped |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4035 // NoRefDiscovery object will do this. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4036 NoRefDiscovery no_cm_discovery(ref_processor_cm()); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4037 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4038 // Forget the current alloc region (we might even choose it to be part |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4039 // of the collection set!). |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
4040 _allocator->release_mutator_alloc_region(); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4041 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4042 // We should call this after we retire the mutator alloc |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4043 // region(s) so that all the ALLOC / RETIRE events are generated |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4044 // before the start GC event. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4045 _hr_printer.start_gc(false /* full */, (size_t) total_collections()); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4046 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4047 // This timing is only used by the ergonomics to handle our pause target. |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4048 // It is unclear why this should not include the full pause. We will |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4049 // investigate this in CR 7178365. |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4050 // |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4051 // Preserving the old comment here if that helps the investigation: |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4052 // |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4053 // The elapsed time induced by the start time below deliberately elides |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4054 // the possible verification above. |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4055 double sample_start_time_sec = os::elapsedTime(); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4056 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4057 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4058 gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4059 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4060 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4061 #endif // YOUNG_LIST_VERBOSE |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4062 |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
4063 g1_policy()->record_collection_pause_start(sample_start_time_sec); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4064 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4065 double scan_wait_start = os::elapsedTime(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4066 // We have to wait until the CM threads finish scanning the |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4067 // root regions as it's the only way to ensure that all the |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4068 // objects on them have been correctly scanned before we start |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4069 // moving them during the GC. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4070 bool waited = _cm->root_regions()->wait_until_scan_finished(); |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4071 double wait_time_ms = 0.0; |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4072 if (waited) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4073 double scan_wait_end = os::elapsedTime(); |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4074 wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0; |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4075 } |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4076 g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms); |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4077 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4078 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4079 gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4080 _young_list->print(); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4081 #endif // YOUNG_LIST_VERBOSE |
342 | 4082 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4083 if (g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4084 concurrent_mark()->checkpointRootsInitialPre(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4085 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4086 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4087 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4088 gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4089 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4090 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4091 #endif // YOUNG_LIST_VERBOSE |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4092 |
10405 | 4093 g1_policy()->finalize_cset(target_pause_time_ms, evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4094 |
23569
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4095 // Make sure the remembered sets are up to date. This needs to be |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4096 // done before register_humongous_regions_with_cset(), because the |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4097 // remembered sets are used there to choose eager reclaim candidates. |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4098 // If the remembered sets are not up to date we might miss some |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4099 // entries that need to be handled. |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4100 g1_rem_set()->cleanupHRRS(); |
f3f2f71d2dc8
8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents:
23472
diff
changeset
|
4101 |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4102 register_humongous_regions_with_in_cset_fast_test(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4103 |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4104 assert(check_cset_fast_test(), "Inconsistency in the InCSetState table."); |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4105 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4106 _cm->note_start_of_gc(); |
23029
0f8f1250fed5
8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents:
23026
diff
changeset
|
4107 // We call this after finalize_cset() to |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4108 // ensure that the CSet has been finalized. |
23029
0f8f1250fed5
8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents:
23026
diff
changeset
|
4109 _cm->verify_no_cset_oops(); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4110 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4111 if (_hr_printer.is_active()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4112 HeapRegion* hr = g1_policy()->collection_set(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4113 while (hr != NULL) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4114 _hr_printer.cset(hr); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4115 hr = hr->next_in_collection_set(); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4116 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4117 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4118 |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
4119 #ifdef ASSERT |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4120 VerifyCSetClosure cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4121 collection_set_iterate(&cl); |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
4122 #endif // ASSERT |
1707 | 4123 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4124 setup_surviving_young_words(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4125 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4126 // Initialize the GC alloc regions. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
4127 _allocator->init_gc_alloc_regions(evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4128 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4129 // Actually do the work... |
10405 | 4130 evacuate_collection_set(evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4131 |
10405 | 4132 free_collection_set(g1_policy()->collection_set(), evacuation_info); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4133 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4134 eagerly_reclaim_humongous_regions(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4135 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4136 g1_policy()->clear_collection_set(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4137 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4138 cleanup_surviving_young_words(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4139 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4140 // Start a new incremental collection set for the next pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4141 g1_policy()->start_incremental_cset_building(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4142 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4143 clear_cset_fast_test(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4144 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4145 _young_list->reset_sampled_info(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4146 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4147 // Don't check the whole heap at this point as the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4148 // GC alloc regions from this pause have been tagged |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4149 // as survivors and moved on to the survivor list. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4150 // Survivor regions will fail the !is_young() check. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4151 assert(check_young_list_empty(false /* check_heap */), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4152 "young list should be empty"); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4153 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4154 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4155 gclog_or_tty->print_cr("Before recording survivors.\nYoung List:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4156 _young_list->print(); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4157 #endif // YOUNG_LIST_VERBOSE |
342 | 4158 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4159 g1_policy()->record_survivor_regions(_young_list->survivor_length(), |
10405 | 4160 _young_list->first_survivor_region(), |
4161 _young_list->last_survivor_region()); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4162 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4163 _young_list->reset_auxilary_lists(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4164 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4165 if (evacuation_failed()) { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
4166 _allocator->set_used(recalculate_used()); |
10405 | 4167 uint n_queues = MAX2((int)ParallelGCThreads, 1); |
4168 for (uint i = 0; i < n_queues; i++) { | |
4169 if (_evacuation_failed_info_array[i].has_failed()) { | |
4170 _gc_tracer_stw->report_evacuation_failed(_evacuation_failed_info_array[i]); | |
4171 } | |
4172 } | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4173 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4174 // The "used" of the the collection set have already been subtracted |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4175 // when they were freed. Add in the bytes evacuated. |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
4176 _allocator->increase_used(g1_policy()->bytes_copied_during_gc()); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4177 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4178 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4179 if (g1_policy()->during_initial_mark_pause()) { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4180 // We have to do this before we notify the CM threads that |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4181 // they can start working to make sure that all the |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4182 // appropriate initialization is done on the CM object. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4183 concurrent_mark()->checkpointRootsInitialPost(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4184 set_marking_started(); |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4185 // Note that we don't actually trigger the CM thread at |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4186 // this point. We do that later when we're sure that |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4187 // the current thread has completed its logging output. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4188 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4189 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4190 allocate_dummy_regions(); |
3285
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
4191 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4192 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4193 gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4194 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4195 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4196 #endif // YOUNG_LIST_VERBOSE |
342 | 4197 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
4198 _allocator->init_mutator_alloc_region(); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4199 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4200 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4201 size_t expand_bytes = g1_policy()->expansion_amount(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4202 if (expand_bytes > 0) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4203 size_t bytes_before = capacity(); |
4785 | 4204 // No need for an ergo verbose message here, |
4205 // expansion_amount() does this when it returns a value > 0. | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4206 if (!expand(expand_bytes)) { |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
4207 // We failed to expand the heap. Cannot do anything about it. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4208 } |
3920
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4209 } |
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4210 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4211 |
10405 | 4212 // We redo the verification but now wrt to the new CSet which |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4213 // has just got initialized after the previous CSet was freed. |
23029
0f8f1250fed5
8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents:
23026
diff
changeset
|
4214 _cm->verify_no_cset_oops(); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4215 _cm->note_end_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4216 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4217 // This timing is only used by the ergonomics to handle our pause target. |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4218 // It is unclear why this should not include the full pause. We will |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4219 // investigate this in CR 7178365. |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4220 double sample_end_time_sec = os::elapsedTime(); |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4221 double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS; |
10405 | 4222 g1_policy()->record_collection_pause_end(pause_time_ms, evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4223 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4224 MemoryService::track_memory_usage(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4225 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4226 // In prepare_for_verify() below we'll need to scan the deferred |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4227 // update buffers to bring the RSets up-to-date if |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4228 // G1HRRSFlushLogBuffersOnVerify has been set. While scanning |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4229 // the update buffers we'll probably need to scan cards on the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4230 // regions we just allocated to (i.e., the GC alloc |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4231 // regions). However, during the last GC we called |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4232 // set_saved_mark() on all the GC alloc regions, so card |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4233 // scanning might skip the [saved_mark_word()...top()] area of |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4234 // those regions (i.e., the area we allocated objects into |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4235 // during the last GC). But it shouldn't. Given that |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4236 // saved_mark_word() is conditional on whether the GC time stamp |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4237 // on the region is current or not, by incrementing the GC time |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4238 // stamp here we invalidate all the GC time stamps on all the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4239 // regions and saved_mark_word() will simply return top() for |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4240 // all the regions. This is a nicer way of ensuring this rather |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4241 // than iterating over the regions and fixing them. In fact, the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4242 // GC time stamp increment here also ensures that |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4243 // saved_mark_word() will return top() between pauses, i.e., |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4244 // during concurrent refinement. So we don't need the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4245 // is_gc_active() check to decided which top to use when |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4246 // scanning cards (see CR 7039627). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4247 increment_gc_time_stamp(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4248 |
6628
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
4249 verify_after_gc(); |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
4250 check_bitmaps("GC End"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4251 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4252 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4253 ref_processor_stw()->verify_no_references_recorded(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4254 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4255 // CM reference discovery will be re-enabled if necessary. |
3920
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4256 } |
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4257 |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4258 // We should do this after we potentially expand the heap so |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4259 // that all the COMMIT events are generated before the end GC |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4260 // event, and after we retire the GC alloc regions so that all |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4261 // RETIRE events are generated before the end GC event. |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4262 _hr_printer.end_gc(false /* full */, (size_t) total_collections()); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4263 |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
4264 #ifdef TRACESPINNING |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4265 ParallelTaskTerminator::print_termination_counts(); |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
4266 #endif |
342 | 4267 |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4268 gc_epilogue(false); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4269 } |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4270 |
7207
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
4271 // Print the remainder of the GC log output. |
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
4272 log_gc_footer(os::elapsedTime() - pause_start_sec); |
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
4273 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4274 // It is not yet to safe to tell the concurrent mark to |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4275 // start as we have some optional output below. We don't want the |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4276 // output from the concurrent mark thread interfering with this |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4277 // logging output either. |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4278 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
4279 _hrm.verify_optional(); |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4280 verify_region_sets_optional(); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4281 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4282 TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats()); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4283 TASKQUEUE_STATS_ONLY(reset_taskqueue_stats()); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4284 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4285 print_heap_after_gc(); |
10405 | 4286 trace_heap_after_gc(_gc_tracer_stw); |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4287 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4288 // We must call G1MonitoringSupport::update_sizes() in the same scoping level |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4289 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4290 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4291 // before any GC notifications are raised. |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4292 g1mm()->update_sizes(); |
10405 | 4293 |
4294 _gc_tracer_stw->report_evacuation_info(&evacuation_info); | |
4295 _gc_tracer_stw->report_tenuring_threshold(_g1_policy->tenuring_threshold()); | |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
4296 _gc_timer_stw->register_gc_end(); |
10405 | 4297 _gc_tracer_stw->report_gc_end(_gc_timer_stw->gc_end(), _gc_timer_stw->time_partitions()); |
4298 } | |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4299 // It should now be safe to tell the concurrent mark thread to start |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4300 // without its logging output interfering with the logging output |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4301 // that came from the pause. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4302 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4303 if (should_start_conc_mark) { |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4304 // CAUTION: after the doConcurrentMark() call below, |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4305 // the concurrent marking thread(s) could be running |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4306 // concurrently with us. Make sure that anything after |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4307 // this point does not assume that we are the only GC thread |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4308 // running. Note: of course, the actual marking work will |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4309 // not start until the safepoint itself is released in |
20192 | 4310 // SuspendibleThreadSet::desynchronize(). |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4311 doConcurrentMark(); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4312 } |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4313 |
1973 | 4314 return true; |
342 | 4315 } |
4316 | |
4317 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) { | |
4318 _drain_in_progress = false; | |
4319 set_evac_failure_closure(cl); | |
6197 | 4320 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true); |
342 | 4321 } |
4322 | |
4323 void G1CollectedHeap::finalize_for_evac_failure() { | |
4324 assert(_evac_failure_scan_stack != NULL && | |
4325 _evac_failure_scan_stack->length() == 0, | |
4326 "Postcondition"); | |
4327 assert(!_drain_in_progress, "Postcondition"); | |
1045 | 4328 delete _evac_failure_scan_stack; |
342 | 4329 _evac_failure_scan_stack = NULL; |
4330 } | |
4331 | |
4332 void G1CollectedHeap::remove_self_forwarding_pointers() { | |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4333 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4334 |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4335 double remove_self_forwards_start = os::elapsedTime(); |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4336 |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4337 G1ParRemoveSelfForwardPtrsTask rsfp_task(this); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4338 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4339 if (G1CollectedHeap::use_parallel_gc_threads()) { |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4340 set_par_threads(); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4341 workers()->run_task(&rsfp_task); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4342 set_par_threads(0); |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
4343 } else { |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4344 rsfp_task.work(0); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4345 } |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4346 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4347 assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity"); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4348 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4349 // Reset the claim values in the regions in the collection set. |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4350 reset_cset_heap_region_claim_values(); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4351 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4352 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); |
342 | 4353 |
4354 // Now restore saved marks, if any. | |
8038
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4355 assert(_objs_with_preserved_marks.size() == |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4356 _preserved_marks_of_objs.size(), "Both or none."); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4357 while (!_objs_with_preserved_marks.is_empty()) { |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4358 oop obj = _objs_with_preserved_marks.pop(); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4359 markOop m = _preserved_marks_of_objs.pop(); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4360 obj->set_mark(m); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4361 } |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4362 _objs_with_preserved_marks.clear(true); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4363 _preserved_marks_of_objs.clear(true); |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4364 |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4365 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0); |
342 | 4366 } |
4367 | |
4368 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) { | |
4369 _evac_failure_scan_stack->push(obj); | |
4370 } | |
4371 | |
4372 void G1CollectedHeap::drain_evac_failure_scan_stack() { | |
4373 assert(_evac_failure_scan_stack != NULL, "precondition"); | |
4374 | |
4375 while (_evac_failure_scan_stack->length() > 0) { | |
4376 oop obj = _evac_failure_scan_stack->pop(); | |
4377 _evac_failure_closure->set_region(heap_region_containing(obj)); | |
4378 obj->oop_iterate_backwards(_evac_failure_closure); | |
4379 } | |
4380 } | |
4381 | |
4382 oop | |
10405 | 4383 G1CollectedHeap::handle_evacuation_failure_par(G1ParScanThreadState* _par_scan_state, |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4384 oop old) { |
3323
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4385 assert(obj_in_cs(old), |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4386 err_msg("obj: "PTR_FORMAT" should still be in the CSet", |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4387 (HeapWord*) old)); |
342 | 4388 markOop m = old->mark(); |
4389 oop forward_ptr = old->forward_to_atomic(old); | |
4390 if (forward_ptr == NULL) { | |
4391 // Forward-to-self succeeded. | |
10405 | 4392 assert(_par_scan_state != NULL, "par scan state"); |
4393 OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure(); | |
4394 uint queue_num = _par_scan_state->queue_num(); | |
4395 | |
4396 _evacuation_failed = true; | |
4397 _evacuation_failed_info_array[queue_num].register_copy_failure(old->size()); | |
342 | 4398 if (_evac_failure_closure != cl) { |
4399 MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag); | |
4400 assert(!_drain_in_progress, | |
4401 "Should only be true while someone holds the lock."); | |
4402 // Set the global evac-failure closure to the current thread's. | |
4403 assert(_evac_failure_closure == NULL, "Or locking has failed."); | |
4404 set_evac_failure_closure(cl); | |
4405 // Now do the common part. | |
4406 handle_evacuation_failure_common(old, m); | |
4407 // Reset to NULL. | |
4408 set_evac_failure_closure(NULL); | |
4409 } else { | |
4410 // The lock is already held, and this is recursive. | |
4411 assert(_drain_in_progress, "This should only be the recursive case."); | |
4412 handle_evacuation_failure_common(old, m); | |
4413 } | |
4414 return old; | |
4415 } else { | |
3323
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4416 // Forward-to-self failed. Either someone else managed to allocate |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4417 // space for this object (old != forward_ptr) or they beat us in |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4418 // self-forwarding it (old == forward_ptr). |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4419 assert(old == forward_ptr || !obj_in_cs(forward_ptr), |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4420 err_msg("obj: "PTR_FORMAT" forwarded to: "PTR_FORMAT" " |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4421 "should not be in the CSet", |
75af3e8de182
7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents:
3317
diff
changeset
|
4422 (HeapWord*) old, (HeapWord*) forward_ptr)); |
342 | 4423 return forward_ptr; |
4424 } | |
4425 } | |
4426 | |
4427 void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) { | |
4428 preserve_mark_if_necessary(old, m); | |
4429 | |
4430 HeapRegion* r = heap_region_containing(old); | |
4431 if (!r->evacuation_failed()) { | |
4432 r->set_evacuation_failed(true); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4433 _hr_printer.evac_failure(r); |
342 | 4434 } |
4435 | |
4436 push_on_evac_failure_scan_stack(old); | |
4437 | |
4438 if (!_drain_in_progress) { | |
4439 // prevent recursion in copy_to_survivor_space() | |
4440 _drain_in_progress = true; | |
4441 drain_evac_failure_scan_stack(); | |
4442 _drain_in_progress = false; | |
4443 } | |
4444 } | |
4445 | |
4446 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) { | |
2038
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4447 assert(evacuation_failed(), "Oversaving!"); |
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4448 // We want to call the "for_promotion_failure" version only in the |
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4449 // case of a promotion failure. |
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4450 if (m->must_be_preserved_for_promotion_failure(obj)) { |
8038
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4451 _objs_with_preserved_marks.push(obj); |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4452 _preserved_marks_of_objs.push(m); |
342 | 4453 } |
4454 } | |
4455 | |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4456 void G1ParCopyHelper::mark_object(oop obj) { |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
4457 assert(!_g1->heap_region_containing(obj)->in_collection_set(), "should not mark objects in the CSet"); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4458 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4459 // We know that the object is not moving so it's safe to read its size. |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4460 _cm->grayRoot(obj, (size_t) obj->size(), _worker_id); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4461 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4462 |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4463 void G1ParCopyHelper::mark_forwarded_object(oop from_obj, oop to_obj) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4464 assert(from_obj->is_forwarded(), "from obj should be forwarded"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4465 assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4466 assert(from_obj != to_obj, "should not be self-forwarded"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4467 |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
4468 assert(_g1->heap_region_containing(from_obj)->in_collection_set(), "from obj should be in the CSet"); |
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
4469 assert(!_g1->heap_region_containing(to_obj)->in_collection_set(), "should not mark objects in the CSet"); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4470 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4471 // The object might be in the process of being copied by another |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4472 // worker so we cannot trust that its to-space image is |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4473 // well-formed. So we have to read its size from its from-space |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4474 // image which we know should not be changing. |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4475 _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4476 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4477 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4478 template <class T> |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4479 void G1ParCopyHelper::do_klass_barrier(T* p, oop new_obj) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4480 if (_g1->heap_region_containing_raw(new_obj)->is_young()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4481 _scanned_klass->record_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4482 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4483 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4484 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4485 template <G1Barrier barrier, G1Mark do_mark_object> |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
4486 template <class T> |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4487 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) { |
17688
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4488 T heap_oop = oopDesc::load_heap_oop(p); |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4489 |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4490 if (oopDesc::is_null(heap_oop)) { |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4491 return; |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4492 } |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4493 |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4494 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4495 |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4496 assert(_worker_id == _par_scan_state->queue_num(), "sanity"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4497 |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4498 const InCSetState state = _g1->in_cset_state(obj); |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4499 if (state.is_in_cset()) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4500 oop forwardee; |
22895
f2e3f0e1f97d
8064473: Improved handling of age during object copy in G1
sfriberg
parents:
22894
diff
changeset
|
4501 markOop m = obj->mark(); |
f2e3f0e1f97d
8064473: Improved handling of age during object copy in G1
sfriberg
parents:
22894
diff
changeset
|
4502 if (m->is_marked()) { |
f2e3f0e1f97d
8064473: Improved handling of age during object copy in G1
sfriberg
parents:
22894
diff
changeset
|
4503 forwardee = (oop) m->decode_pointer(); |
526 | 4504 } else { |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4505 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m); |
342 | 4506 } |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4507 assert(forwardee != NULL, "forwardee should not be NULL"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4508 oopDesc::encode_store_heap_oop(p, forwardee); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4509 if (do_mark_object != G1MarkNone && forwardee != obj) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4510 // If the object is self-forwarded we don't need to explicitly |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4511 // mark it, the evacuation failure protocol will do so. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4512 mark_forwarded_object(obj, forwardee); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4513 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4514 |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4515 if (barrier == G1BarrierKlass) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4516 do_klass_barrier(p, forwardee); |
342 | 4517 } |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4518 } else { |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
4519 if (state.is_humongous()) { |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4520 _g1->set_humongous_is_live(obj); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
4521 } |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4522 // The object is not in collection set. If we're a root scanning |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4523 // closure during an initial mark pause then attempt to mark the object. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4524 if (do_mark_object == G1MarkFromRoot) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4525 mark_object(obj); |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4526 } |
526 | 4527 } |
4528 | |
17688
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4529 if (barrier == G1BarrierEvac) { |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4530 _par_scan_state->update_rs(_from, p, _worker_id); |
526 | 4531 } |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4532 } |
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4533 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4534 template void G1ParCopyClosure<G1BarrierEvac, G1MarkNone>::do_oop_work(oop* p); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4535 template void G1ParCopyClosure<G1BarrierEvac, G1MarkNone>::do_oop_work(narrowOop* p); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
4536 |
342 | 4537 class G1ParEvacuateFollowersClosure : public VoidClosure { |
4538 protected: | |
4539 G1CollectedHeap* _g1h; | |
4540 G1ParScanThreadState* _par_scan_state; | |
4541 RefToScanQueueSet* _queues; | |
4542 ParallelTaskTerminator* _terminator; | |
4543 | |
4544 G1ParScanThreadState* par_scan_state() { return _par_scan_state; } | |
4545 RefToScanQueueSet* queues() { return _queues; } | |
4546 ParallelTaskTerminator* terminator() { return _terminator; } | |
4547 | |
4548 public: | |
4549 G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h, | |
4550 G1ParScanThreadState* par_scan_state, | |
4551 RefToScanQueueSet* queues, | |
4552 ParallelTaskTerminator* terminator) | |
4553 : _g1h(g1h), _par_scan_state(par_scan_state), | |
4554 _queues(queues), _terminator(terminator) {} | |
4555 | |
1862
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4556 void do_void(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4557 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4558 private: |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4559 inline bool offer_termination(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4560 }; |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4561 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4562 bool G1ParEvacuateFollowersClosure::offer_termination() { |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4563 G1ParScanThreadState* const pss = par_scan_state(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4564 pss->start_term_time(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4565 const bool res = terminator()->offer_termination(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4566 pss->end_term_time(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4567 return res; |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4568 } |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4569 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4570 void G1ParEvacuateFollowersClosure::do_void() { |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4571 G1ParScanThreadState* const pss = par_scan_state(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4572 pss->trim_queue(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4573 do { |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
4574 pss->steal_and_trim_queue(queues()); |
1862
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4575 } while (!offer_termination()); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4576 } |
342 | 4577 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4578 class G1KlassScanClosure : public KlassClosure { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4579 G1ParCopyHelper* _closure; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4580 bool _process_only_dirty; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4581 int _count; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4582 public: |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4583 G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4584 : _process_only_dirty(process_only_dirty), _closure(closure), _count(0) {} |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4585 void do_klass(Klass* klass) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4586 // If the klass has not been dirtied we know that there's |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4587 // no references into the young gen and we can skip it. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4588 if (!_process_only_dirty || klass->has_modified_oops()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4589 // Clean the klass since we're going to scavenge all the metadata. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4590 klass->clear_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4591 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4592 // Tell the closure that this klass is the Klass to scavenge |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4593 // and is the one to dirty if oops are left pointing into the young gen. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4594 _closure->set_scanned_klass(klass); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4595 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4596 klass->oops_do(_closure); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4597 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4598 _closure->set_scanned_klass(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4599 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4600 _count++; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4601 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4602 }; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4603 |
342 | 4604 class G1ParTask : public AbstractGangTask { |
4605 protected: | |
4606 G1CollectedHeap* _g1h; | |
4607 RefToScanQueueSet *_queues; | |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4608 G1RootProcessor* _root_processor; |
342 | 4609 ParallelTaskTerminator _terminator; |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4610 uint _n_workers; |
342 | 4611 |
4612 Mutex _stats_lock; | |
4613 Mutex* stats_lock() { return &_stats_lock; } | |
4614 | |
4615 public: | |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4616 G1ParTask(G1CollectedHeap* g1h, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor) |
342 | 4617 : AbstractGangTask("G1 collection"), |
4618 _g1h(g1h), | |
4619 _queues(task_queues), | |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4620 _root_processor(root_processor), |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4621 _terminator(0, _queues), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4622 _stats_lock(Mutex::leaf, "parallel G1 stats lock", true) |
342 | 4623 {} |
4624 | |
4625 RefToScanQueueSet* queues() { return _queues; } | |
4626 | |
4627 RefToScanQueue *work_queue(int i) { | |
4628 return queues()->queue(i); | |
4629 } | |
4630 | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4631 ParallelTaskTerminator* terminator() { return &_terminator; } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4632 |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4633 virtual void set_for_termination(int active_workers) { |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4634 _root_processor->set_num_workers(active_workers); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4635 terminator()->reset_for_reuse(active_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4636 _n_workers = active_workers; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4637 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4638 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4639 // Helps out with CLD processing. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4640 // |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4641 // During InitialMark we need to: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4642 // 1) Scavenge all CLDs for the young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4643 // 2) Mark all objects directly reachable from strong CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4644 template <G1Mark do_mark_object> |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4645 class G1CLDClosure : public CLDClosure { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4646 G1ParCopyClosure<G1BarrierNone, do_mark_object>* _oop_closure; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4647 G1ParCopyClosure<G1BarrierKlass, do_mark_object> _oop_in_klass_closure; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4648 G1KlassScanClosure _klass_in_cld_closure; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4649 bool _claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4650 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4651 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4652 G1CLDClosure(G1ParCopyClosure<G1BarrierNone, do_mark_object>* oop_closure, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4653 bool only_young, bool claim) |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4654 : _oop_closure(oop_closure), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4655 _oop_in_klass_closure(oop_closure->g1(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4656 oop_closure->pss(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4657 oop_closure->rp()), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4658 _klass_in_cld_closure(&_oop_in_klass_closure, only_young), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4659 _claim(claim) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4660 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4661 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4662 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4663 void do_cld(ClassLoaderData* cld) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4664 cld->oops_do(_oop_closure, &_klass_in_cld_closure, _claim); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4665 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4666 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4667 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4668 void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4669 if (worker_id >= _n_workers) return; // no work needed this round |
1611 | 4670 |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4671 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::GCWorkerStart, worker_id, os::elapsedTime()); |
1611 | 4672 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4673 { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4674 ResourceMark rm; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4675 HandleMark hm; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4676 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4677 ReferenceProcessor* rp = _g1h->ref_processor_stw(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4678 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
4679 G1ParScanThreadState pss(_g1h, worker_id, rp); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4680 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
4681 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4682 pss.set_evac_failure_closure(&evac_failure_cl); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4683 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4684 bool only_young = _g1h->g1_policy()->gcs_are_young(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4685 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4686 // Non-IM young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4687 G1ParCopyClosure<G1BarrierNone, G1MarkNone> scan_only_root_cl(_g1h, &pss, rp); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4688 G1CLDClosure<G1MarkNone> scan_only_cld_cl(&scan_only_root_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4689 only_young, // Only process dirty klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4690 false); // No need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4691 // IM young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4692 // Strong roots closures. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4693 G1ParCopyClosure<G1BarrierNone, G1MarkFromRoot> scan_mark_root_cl(_g1h, &pss, rp); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4694 G1CLDClosure<G1MarkFromRoot> scan_mark_cld_cl(&scan_mark_root_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4695 false, // Process all klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4696 true); // Need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4697 // Weak roots closures. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4698 G1ParCopyClosure<G1BarrierNone, G1MarkPromotedFromRoot> scan_mark_weak_root_cl(_g1h, &pss, rp); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4699 G1CLDClosure<G1MarkPromotedFromRoot> scan_mark_weak_cld_cl(&scan_mark_weak_root_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4700 false, // Process all klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4701 true); // Need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4702 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4703 OopClosure* strong_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4704 OopClosure* weak_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4705 CLDClosure* strong_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4706 CLDClosure* weak_cld_cl; |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4707 |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4708 bool trace_metadata = false; |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4709 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4710 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4711 // We also need to mark copied objects. |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4712 strong_root_cl = &scan_mark_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4713 strong_cld_cl = &scan_mark_cld_cl; |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4714 if (ClassUnloadingWithConcurrentMark) { |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4715 weak_root_cl = &scan_mark_weak_root_cl; |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4716 weak_cld_cl = &scan_mark_weak_cld_cl; |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4717 trace_metadata = true; |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4718 } else { |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4719 weak_root_cl = &scan_mark_root_cl; |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4720 weak_cld_cl = &scan_mark_cld_cl; |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4721 } |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4722 } else { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4723 strong_root_cl = &scan_only_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4724 weak_root_cl = &scan_only_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4725 strong_cld_cl = &scan_only_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4726 weak_cld_cl = &scan_only_cld_cl; |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4727 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4728 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4729 pss.start_strong_roots(); |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4730 |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4731 _root_processor->evacuate_roots(strong_root_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4732 weak_root_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4733 strong_cld_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4734 weak_cld_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4735 trace_metadata, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4736 worker_id); |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4737 |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4738 G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss); |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4739 _root_processor->scan_remembered_sets(&push_heap_rs_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4740 weak_root_cl, |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
4741 worker_id); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4742 pss.end_strong_roots(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4743 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4744 { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4745 double start = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4746 G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4747 evac.do_void(); |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4748 double elapsed_sec = os::elapsedTime() - start; |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4749 double term_sec = pss.term_time(); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4750 _g1h->g1_policy()->phase_times()->add_time_secs(G1GCPhaseTimes::ObjCopy, worker_id, elapsed_sec - term_sec); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4751 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::Termination, worker_id, term_sec); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4752 _g1h->g1_policy()->phase_times()->record_thread_work_item(G1GCPhaseTimes::Termination, worker_id, pss.term_attempts()); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4753 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4754 _g1h->g1_policy()->record_thread_age_table(pss.age_table()); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4755 _g1h->update_surviving_young_words(pss.surviving_young_words()+1); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4756 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4757 if (ParallelGCVerbose) { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4758 MutexLocker x(stats_lock()); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4759 pss.print_termination_stats(worker_id); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4760 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4761 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
4762 assert(pss.queue_is_empty(), "should be empty"); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4763 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4764 // Close the inner scope so that the ResourceMark and HandleMark |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4765 // destructors are executed here and are included as part of the |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4766 // "GC Worker Time". |
342 | 4767 } |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
4768 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::GCWorkerEnd, worker_id, os::elapsedTime()); |
342 | 4769 } |
4770 }; | |
4771 | |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4772 class G1StringSymbolTableUnlinkTask : public AbstractGangTask { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4773 private: |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4774 BoolObjectClosure* _is_alive; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4775 int _initial_string_table_size; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4776 int _initial_symbol_table_size; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4777 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4778 bool _process_strings; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4779 int _strings_processed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4780 int _strings_removed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4781 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4782 bool _process_symbols; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4783 int _symbols_processed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4784 int _symbols_removed; |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4785 |
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4786 bool _do_in_parallel; |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4787 public: |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4788 G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) : |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4789 AbstractGangTask("String/Symbol Unlinking"), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4790 _is_alive(is_alive), |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4791 _do_in_parallel(G1CollectedHeap::use_parallel_gc_threads()), |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4792 _process_strings(process_strings), _strings_processed(0), _strings_removed(0), |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4793 _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4794 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4795 _initial_string_table_size = StringTable::the_table()->table_size(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4796 _initial_symbol_table_size = SymbolTable::the_table()->table_size(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4797 if (process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4798 StringTable::clear_parallel_claimed_index(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4799 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4800 if (process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4801 SymbolTable::clear_parallel_claimed_index(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4802 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4803 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4804 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4805 ~G1StringSymbolTableUnlinkTask() { |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4806 guarantee(!_process_strings || !_do_in_parallel || StringTable::parallel_claimed_index() >= _initial_string_table_size, |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4807 err_msg("claim value "INT32_FORMAT" after unlink less than initial string table size "INT32_FORMAT, |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4808 StringTable::parallel_claimed_index(), _initial_string_table_size)); |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4809 guarantee(!_process_symbols || !_do_in_parallel || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size, |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4810 err_msg("claim value "INT32_FORMAT" after unlink less than initial symbol table size "INT32_FORMAT, |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4811 SymbolTable::parallel_claimed_index(), _initial_symbol_table_size)); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4812 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4813 if (G1TraceStringSymbolTableScrubbing) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4814 gclog_or_tty->print_cr("Cleaned string and symbol table, " |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4815 "strings: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed, " |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4816 "symbols: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed", |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4817 strings_processed(), strings_removed(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4818 symbols_processed(), symbols_removed()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4819 } |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4820 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4821 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4822 void work(uint worker_id) { |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
4823 if (_do_in_parallel) { |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4824 int strings_processed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4825 int strings_removed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4826 int symbols_processed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4827 int symbols_removed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4828 if (_process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4829 StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4830 Atomic::add(strings_processed, &_strings_processed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4831 Atomic::add(strings_removed, &_strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4832 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4833 if (_process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4834 SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4835 Atomic::add(symbols_processed, &_symbols_processed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4836 Atomic::add(symbols_removed, &_symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4837 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4838 } else { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4839 if (_process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4840 StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4841 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4842 if (_process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4843 SymbolTable::unlink(&_symbols_processed, &_symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4844 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4845 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4846 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4847 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4848 size_t strings_processed() const { return (size_t)_strings_processed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4849 size_t strings_removed() const { return (size_t)_strings_removed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4850 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4851 size_t symbols_processed() const { return (size_t)_symbols_processed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4852 size_t symbols_removed() const { return (size_t)_symbols_removed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4853 }; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
4854 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4855 class G1CodeCacheUnloadingTask VALUE_OBJ_CLASS_SPEC { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4856 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4857 static Monitor* _lock; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4858 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4859 BoolObjectClosure* const _is_alive; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4860 const bool _unloading_occurred; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4861 const uint _num_workers; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4862 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4863 // Variables used to claim nmethods. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4864 nmethod* _first_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4865 volatile nmethod* _claimed_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4866 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4867 // The list of nmethods that need to be processed by the second pass. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4868 volatile nmethod* _postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4869 volatile uint _num_entered_barrier; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4870 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4871 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4872 G1CodeCacheUnloadingTask(uint num_workers, BoolObjectClosure* is_alive, bool unloading_occurred) : |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4873 _is_alive(is_alive), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4874 _unloading_occurred(unloading_occurred), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4875 _num_workers(num_workers), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4876 _first_nmethod(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4877 _claimed_nmethod(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4878 _postponed_list(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4879 _num_entered_barrier(0) |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4880 { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4881 nmethod::increase_unloading_clock(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4882 _first_nmethod = CodeCache::alive_nmethod(CodeCache::first()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4883 _claimed_nmethod = (volatile nmethod*)_first_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4884 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4885 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4886 ~G1CodeCacheUnloadingTask() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4887 CodeCache::verify_clean_inline_caches(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4888 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4889 CodeCache::set_needs_cache_clean(false); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4890 guarantee(CodeCache::scavenge_root_nmethods() == NULL, "Must be"); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4891 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4892 CodeCache::verify_icholder_relocations(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4893 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4894 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4895 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4896 void add_to_postponed_list(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4897 nmethod* old; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4898 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4899 old = (nmethod*)_postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4900 nm->set_unloading_next(old); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4901 } while ((nmethod*)Atomic::cmpxchg_ptr(nm, &_postponed_list, old) != old); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4902 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4903 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4904 void clean_nmethod(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4905 bool postponed = nm->do_unloading_parallel(_is_alive, _unloading_occurred); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4906 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4907 if (postponed) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4908 // This nmethod referred to an nmethod that has not been cleaned/unloaded yet. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4909 add_to_postponed_list(nm); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4910 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4911 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4912 // Mark that this thread has been cleaned/unloaded. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4913 // After this call, it will be safe to ask if this nmethod was unloaded or not. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4914 nm->set_unloading_clock(nmethod::global_unloading_clock()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4915 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4916 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4917 void clean_nmethod_postponed(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4918 nm->do_unloading_parallel_postponed(_is_alive, _unloading_occurred); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4919 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4920 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4921 static const int MaxClaimNmethods = 16; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4922 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4923 void claim_nmethods(nmethod** claimed_nmethods, int *num_claimed_nmethods) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4924 nmethod* first; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4925 nmethod* last; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4926 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4927 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4928 *num_claimed_nmethods = 0; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4929 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4930 first = last = (nmethod*)_claimed_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4931 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4932 if (first != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4933 for (int i = 0; i < MaxClaimNmethods; i++) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4934 last = CodeCache::alive_nmethod(CodeCache::next(last)); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4935 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4936 if (last == NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4937 break; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4938 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4939 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4940 claimed_nmethods[i] = last; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4941 (*num_claimed_nmethods)++; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4942 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4943 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4944 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4945 } while ((nmethod*)Atomic::cmpxchg_ptr(last, &_claimed_nmethod, first) != first); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4946 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4947 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4948 nmethod* claim_postponed_nmethod() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4949 nmethod* claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4950 nmethod* next; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4951 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4952 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4953 claim = (nmethod*)_postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4954 if (claim == NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4955 return NULL; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4956 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4957 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4958 next = claim->unloading_next(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4959 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4960 } while ((nmethod*)Atomic::cmpxchg_ptr(next, &_postponed_list, claim) != claim); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4961 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4962 return claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4963 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4964 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4965 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4966 // Mark that we're done with the first pass of nmethod cleaning. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4967 void barrier_mark(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4968 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4969 _num_entered_barrier++; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4970 if (_num_entered_barrier == _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4971 ml.notify_all(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4972 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4973 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4974 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4975 // See if we have to wait for the other workers to |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4976 // finish their first-pass nmethod cleaning work. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4977 void barrier_wait(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4978 if (_num_entered_barrier < _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4979 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4980 while (_num_entered_barrier < _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4981 ml.wait(Mutex::_no_safepoint_check_flag, 0, false); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4982 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4983 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4984 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4985 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4986 // Cleaning and unloading of nmethods. Some work has to be postponed |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4987 // to the second pass, when we know which nmethods survive. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4988 void work_first_pass(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4989 // The first nmethods is claimed by the first worker. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4990 if (worker_id == 0 && _first_nmethod != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4991 clean_nmethod(_first_nmethod); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4992 _first_nmethod = NULL; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4993 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4994 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4995 int num_claimed_nmethods; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4996 nmethod* claimed_nmethods[MaxClaimNmethods]; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4997 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4998 while (true) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4999 claim_nmethods(claimed_nmethods, &num_claimed_nmethods); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5000 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5001 if (num_claimed_nmethods == 0) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5002 break; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5003 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5004 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5005 for (int i = 0; i < num_claimed_nmethods; i++) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5006 clean_nmethod(claimed_nmethods[i]); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5007 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5008 } |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5009 |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5010 // The nmethod cleaning helps out and does the CodeCache part of MetadataOnStackMark. |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5011 // Need to retire the buffers now that this thread has stopped cleaning nmethods. |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5012 MetadataOnStackMark::retire_buffer_for_thread(Thread::current()); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5013 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5014 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5015 void work_second_pass(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5016 nmethod* nm; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5017 // Take care of postponed nmethods. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5018 while ((nm = claim_postponed_nmethod()) != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5019 clean_nmethod_postponed(nm); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5020 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5021 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5022 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5023 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5024 Monitor* G1CodeCacheUnloadingTask::_lock = new Monitor(Mutex::leaf, "Code Cache Unload lock"); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5025 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5026 class G1KlassCleaningTask : public StackObj { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5027 BoolObjectClosure* _is_alive; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5028 volatile jint _clean_klass_tree_claimed; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5029 ClassLoaderDataGraphKlassIteratorAtomic _klass_iterator; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5030 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5031 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5032 G1KlassCleaningTask(BoolObjectClosure* is_alive) : |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5033 _is_alive(is_alive), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5034 _clean_klass_tree_claimed(0), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5035 _klass_iterator() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5036 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5037 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5038 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5039 bool claim_clean_klass_tree_task() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5040 if (_clean_klass_tree_claimed) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5041 return false; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5042 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5043 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5044 return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5045 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5046 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5047 InstanceKlass* claim_next_klass() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5048 Klass* klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5049 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5050 klass =_klass_iterator.next_klass(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5051 } while (klass != NULL && !klass->oop_is_instance()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5052 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5053 return (InstanceKlass*)klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5054 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5055 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5056 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5057 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5058 void clean_klass(InstanceKlass* ik) { |
23463
5cece4584b8e
8058563: InstanceKlass::_dependencies list isn't cleared from empty nmethodBucket entries
stefank
parents:
23228
diff
changeset
|
5059 ik->clean_weak_instanceklass_links(_is_alive); |
5cece4584b8e
8058563: InstanceKlass::_dependencies list isn't cleared from empty nmethodBucket entries
stefank
parents:
23228
diff
changeset
|
5060 |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5061 if (JvmtiExport::has_redefined_a_class()) { |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5062 InstanceKlass::purge_previous_versions(ik); |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5063 } |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5064 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5065 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5066 void work() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5067 ResourceMark rm; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5068 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5069 // One worker will clean the subklass/sibling klass tree. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5070 if (claim_clean_klass_tree_task()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5071 Klass::clean_subklass_tree(_is_alive); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5072 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5073 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5074 // All workers will help cleaning the classes, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5075 InstanceKlass* klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5076 while ((klass = claim_next_klass()) != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5077 clean_klass(klass); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5078 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5079 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5080 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5081 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5082 // To minimize the remark pause times, the tasks below are done in parallel. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5083 class G1ParallelCleaningTask : public AbstractGangTask { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5084 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5085 G1StringSymbolTableUnlinkTask _string_symbol_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5086 G1CodeCacheUnloadingTask _code_cache_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5087 G1KlassCleaningTask _klass_cleaning_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5088 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5089 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5090 // The constructor is run in the VMThread. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5091 G1ParallelCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, uint num_workers, bool unloading_occurred) : |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5092 AbstractGangTask("Parallel Cleaning"), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5093 _string_symbol_task(is_alive, process_strings, process_symbols), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5094 _code_cache_task(num_workers, is_alive, unloading_occurred), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5095 _klass_cleaning_task(is_alive) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5096 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5097 |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5098 void pre_work_verification() { |
20632
706dce84c9df
8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents:
20619
diff
changeset
|
5099 // The VM Thread will have registered Metadata during the single-threaded phase of MetadataStackOnMark. |
706dce84c9df
8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents:
20619
diff
changeset
|
5100 assert(Thread::current()->is_VM_thread() |
706dce84c9df
8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents:
20619
diff
changeset
|
5101 || !MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty"); |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5102 } |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5103 |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5104 void post_work_verification() { |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5105 assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty"); |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5106 } |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5107 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5108 // The parallel work done by all worker threads. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5109 void work(uint worker_id) { |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5110 pre_work_verification(); |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5111 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5112 // Do first pass of code cache cleaning. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5113 _code_cache_task.work_first_pass(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5114 |
20279 | 5115 // Let the threads mark that the first pass is done. |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5116 _code_cache_task.barrier_mark(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5117 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5118 // Clean the Strings and Symbols. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5119 _string_symbol_task.work(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5120 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5121 // Wait for all workers to finish the first code cache cleaning pass. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5122 _code_cache_task.barrier_wait(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5123 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5124 // Do the second code cache cleaning work, which realize on |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5125 // the liveness information gathered during the first pass. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5126 _code_cache_task.work_second_pass(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5127 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5128 // Clean all klasses that were not unloaded. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5129 _klass_cleaning_task.work(); |
20619
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5130 |
b12a2a9b05ca
8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents:
20571
diff
changeset
|
5131 post_work_verification(); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5132 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5133 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5134 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5135 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5136 void G1CollectedHeap::parallel_cleaning(BoolObjectClosure* is_alive, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5137 bool process_strings, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5138 bool process_symbols, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5139 bool class_unloading_occurred) { |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5140 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5141 workers()->active_workers() : 1); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5142 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5143 G1ParallelCleaningTask g1_unlink_task(is_alive, process_strings, process_symbols, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5144 n_workers, class_unloading_occurred); |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5145 if (G1CollectedHeap::use_parallel_gc_threads()) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5146 set_par_threads(n_workers); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5147 workers()->run_task(&g1_unlink_task); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5148 set_par_threads(0); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5149 } else { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5150 g1_unlink_task.work(0); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5151 } |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5152 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5153 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5154 void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5155 bool process_strings, bool process_symbols) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5156 { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5157 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5158 _g1h->workers()->active_workers() : 1); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5159 G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5160 if (G1CollectedHeap::use_parallel_gc_threads()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5161 set_par_threads(n_workers); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5162 workers()->run_task(&g1_unlink_task); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5163 set_par_threads(0); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5164 } else { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5165 g1_unlink_task.work(0); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5166 } |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5167 } |
17764 | 5168 |
5169 if (G1StringDedup::is_enabled()) { | |
5170 G1StringDedup::unlink(is_alive); | |
5171 } | |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5172 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5173 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5174 class G1RedirtyLoggedCardsTask : public AbstractGangTask { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5175 private: |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5176 DirtyCardQueueSet* _queue; |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5177 public: |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5178 G1RedirtyLoggedCardsTask(DirtyCardQueueSet* queue) : AbstractGangTask("Redirty Cards"), _queue(queue) { } |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5179 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5180 virtual void work(uint worker_id) { |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5181 G1GCPhaseTimes* phase_times = G1CollectedHeap::heap()->g1_policy()->phase_times(); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5182 G1GCParPhaseTimesTracker x(phase_times, G1GCPhaseTimes::RedirtyCards, worker_id); |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5183 |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
5184 RedirtyLoggedCardTableEntryClosure cl; |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5185 if (G1CollectedHeap::heap()->use_parallel_gc_threads()) { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5186 _queue->par_apply_closure_to_all_completed_buffers(&cl); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5187 } else { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5188 _queue->apply_closure_to_all_completed_buffers(&cl); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5189 } |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5190 |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5191 phase_times->record_thread_work_item(G1GCPhaseTimes::RedirtyCards, worker_id, cl.num_processed()); |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5192 } |
17756
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5193 }; |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5194 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5195 void G1CollectedHeap::redirty_logged_cards() { |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5196 double redirty_logged_cards_start = os::elapsedTime(); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5197 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5198 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5199 _g1h->workers()->active_workers() : 1); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5200 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5201 G1RedirtyLoggedCardsTask redirty_task(&dirty_card_queue_set()); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5202 dirty_card_queue_set().reset_for_par_iteration(); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5203 if (use_parallel_gc_threads()) { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5204 set_par_threads(n_workers); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5205 workers()->run_task(&redirty_task); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5206 set_par_threads(0); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5207 } else { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5208 redirty_task.work(0); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5209 } |
17756
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5210 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5211 DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set(); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5212 dcq.merge_bufferlists(&dirty_card_queue_set()); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5213 assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed"); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5214 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5215 g1_policy()->phase_times()->record_redirty_logged_cards_time_ms((os::elapsedTime() - redirty_logged_cards_start) * 1000.0); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5216 } |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5217 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5218 // Weak Reference Processing support |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5219 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5220 // An always "is_alive" closure that is used to preserve referents. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5221 // If the object is non-null then it's alive. Used in the preservation |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5222 // of referent objects that are pointed to by reference objects |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5223 // discovered by the CM ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5224 class G1AlwaysAliveClosure: public BoolObjectClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5225 G1CollectedHeap* _g1; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5226 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5227 G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5228 bool do_object_b(oop p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5229 if (p != NULL) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5230 return true; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5231 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5232 return false; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5233 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5234 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5235 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5236 bool G1STWIsAliveClosure::do_object_b(oop p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5237 // An object is reachable if it is outside the collection set, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5238 // or is inside and copied. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5239 return !_g1->obj_in_cs(p) || p->is_forwarded(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5240 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5241 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5242 // Non Copying Keep Alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5243 class G1KeepAliveClosure: public OopClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5244 G1CollectedHeap* _g1; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5245 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5246 G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5247 void do_oop(narrowOop* p) { guarantee(false, "Not needed"); } |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5248 void do_oop(oop* p) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5249 oop obj = *p; |
20503
fa56205f142c
8057799: Unnecessary NULL check in G1KeepAliveClosure
tonyp
parents:
20494
diff
changeset
|
5250 assert(obj != NULL, "the caller should have filtered out NULL values"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5251 |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
5252 const InCSetState cset_state = _g1->in_cset_state(obj); |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
5253 if (!cset_state.is_in_cset_or_humongous()) { |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5254 return; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5255 } |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
5256 if (cset_state.is_in_cset()) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5257 assert( obj->is_forwarded(), "invariant" ); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5258 *p = obj->forwardee(); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5259 } else { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5260 assert(!obj->is_forwarded(), "invariant" ); |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
5261 assert(cset_state.is_humongous(), |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
5262 err_msg("Only allowed InCSet state is IsHumongous, but is %d", cset_state.value())); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5263 _g1->set_humongous_is_live(obj); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5264 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5265 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5266 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5267 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5268 // Copying Keep Alive closure - can be called from both |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5269 // serial and parallel code as long as different worker |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5270 // threads utilize different G1ParScanThreadState instances |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5271 // and different queues. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5272 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5273 class G1CopyingKeepAliveClosure: public OopClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5274 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5275 OopClosure* _copy_non_heap_obj_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5276 G1ParScanThreadState* _par_scan_state; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5277 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5278 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5279 G1CopyingKeepAliveClosure(G1CollectedHeap* g1h, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5280 OopClosure* non_heap_obj_cl, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5281 G1ParScanThreadState* pss): |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5282 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5283 _copy_non_heap_obj_cl(non_heap_obj_cl), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5284 _par_scan_state(pss) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5285 {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5286 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5287 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5288 virtual void do_oop( oop* p) { do_oop_work(p); } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5289 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5290 template <class T> void do_oop_work(T* p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5291 oop obj = oopDesc::load_decode_heap_oop(p); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5292 |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5293 if (_g1h->is_in_cset_or_humongous(obj)) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5294 // If the referent object has been forwarded (either copied |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5295 // to a new location or to itself in the event of an |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5296 // evacuation failure) then we need to update the reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5297 // field and, if both reference and referent are in the G1 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5298 // heap, update the RSet for the referent. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5299 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5300 // If the referent has not been forwarded then we have to keep |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5301 // it alive by policy. Therefore we have copy the referent. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5302 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5303 // If the reference field is in the G1 heap then we can push |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5304 // on the PSS queue. When the queue is drained (after each |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5305 // phase of reference processing) the object and it's followers |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5306 // will be copied, the reference field set to point to the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5307 // new location, and the RSet updated. Otherwise we need to |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
5308 // use the the non-heap or metadata closures directly to copy |
10405 | 5309 // the referent object and update the pointer, while avoiding |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5310 // updating the RSet. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5311 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5312 if (_g1h->is_in_g1_reserved(p)) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5313 _par_scan_state->push_on_queue(p); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5314 } else { |
17935
7384f6a12fc1
8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents:
17866
diff
changeset
|
5315 assert(!Metaspace::contains((const void*)p), |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5316 err_msg("Unexpectedly found a pointer from metadata: " |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
5317 PTR_FORMAT, p)); |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5318 _copy_non_heap_obj_cl->do_oop(p); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5319 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5320 } |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
5321 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5322 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5323 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5324 // Serial drain queue closure. Called as the 'complete_gc' |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5325 // closure for each discovered list in some of the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5326 // reference processing phases. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5327 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5328 class G1STWDrainQueueClosure: public VoidClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5329 protected: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5330 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5331 G1ParScanThreadState* _par_scan_state; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5332 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5333 G1ParScanThreadState* par_scan_state() { return _par_scan_state; } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5334 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5335 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5336 G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5337 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5338 _par_scan_state(pss) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5339 { } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5340 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5341 void do_void() { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5342 G1ParScanThreadState* const pss = par_scan_state(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5343 pss->trim_queue(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5344 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5345 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5346 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5347 // Parallel Reference Processing closures |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5348 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5349 // Implementation of AbstractRefProcTaskExecutor for parallel reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5350 // processing during G1 evacuation pauses. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5351 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5352 class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5353 private: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5354 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5355 RefToScanQueueSet* _queues; |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5356 FlexibleWorkGang* _workers; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5357 int _active_workers; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5358 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5359 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5360 G1STWRefProcTaskExecutor(G1CollectedHeap* g1h, |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5361 FlexibleWorkGang* workers, |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5362 RefToScanQueueSet *task_queues, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5363 int n_workers) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5364 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5365 _queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5366 _workers(workers), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5367 _active_workers(n_workers) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5368 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5369 assert(n_workers > 0, "shouldn't call this otherwise"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5370 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5371 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5372 // Executes the given task using concurrent marking worker threads. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5373 virtual void execute(ProcessTask& task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5374 virtual void execute(EnqueueTask& task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5375 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5376 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5377 // Gang task for possibly parallel reference processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5378 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5379 class G1STWRefProcTaskProxy: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5380 typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5381 ProcessTask& _proc_task; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5382 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5383 RefToScanQueueSet *_task_queues; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5384 ParallelTaskTerminator* _terminator; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5385 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5386 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5387 G1STWRefProcTaskProxy(ProcessTask& proc_task, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5388 G1CollectedHeap* g1h, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5389 RefToScanQueueSet *task_queues, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5390 ParallelTaskTerminator* terminator) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5391 AbstractGangTask("Process reference objects in parallel"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5392 _proc_task(proc_task), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5393 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5394 _task_queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5395 _terminator(terminator) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5396 {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5397 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5398 virtual void work(uint worker_id) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5399 // The reference processing task executed by a single worker. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5400 ResourceMark rm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5401 HandleMark hm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5402 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5403 G1STWIsAliveClosure is_alive(_g1h); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5404 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5405 G1ParScanThreadState pss(_g1h, worker_id, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5406 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5407 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5408 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5409 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5410 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5411 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5412 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5413 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5414 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5415 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5416 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5417 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5418 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5419 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5420 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5421 // Keep alive closure. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5422 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5423 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5424 // Complete GC closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5425 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5426 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5427 // Call the reference processing task's work routine. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5428 _proc_task.work(worker_id, is_alive, keep_alive, drain_queue); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5429 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5430 // Note we cannot assert that the refs array is empty here as not all |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5431 // of the processing tasks (specifically phase2 - pp2_work) execute |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5432 // the complete_gc closure (which ordinarily would drain the queue) so |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5433 // the queue may not be empty. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5434 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5435 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5436 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5437 // Driver routine for parallel reference processing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5438 // Creates an instance of the ref processing gang |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5439 // task and has the worker threads execute it. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5440 void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5441 assert(_workers != NULL, "Need parallel worker threads."); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5442 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5443 ParallelTaskTerminator terminator(_active_workers, _queues); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5444 G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5445 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5446 _g1h->set_par_threads(_active_workers); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5447 _workers->run_task(&proc_task_proxy); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5448 _g1h->set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5449 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5450 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5451 // Gang task for parallel reference enqueueing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5452 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5453 class G1STWRefEnqueueTaskProxy: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5454 typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5455 EnqueueTask& _enq_task; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5456 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5457 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5458 G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5459 AbstractGangTask("Enqueue reference objects in parallel"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5460 _enq_task(enq_task) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5461 { } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5462 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5463 virtual void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5464 _enq_task.work(worker_id); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5465 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5466 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5467 |
10405 | 5468 // Driver routine for parallel reference enqueueing. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5469 // Creates an instance of the ref enqueueing gang |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5470 // task and has the worker threads execute it. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5471 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5472 void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5473 assert(_workers != NULL, "Need parallel worker threads."); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5474 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5475 G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5476 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5477 _g1h->set_par_threads(_active_workers); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5478 _workers->run_task(&enq_task_proxy); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5479 _g1h->set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5480 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5481 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5482 // End of weak reference support closures |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5483 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5484 // Abstract task used to preserve (i.e. copy) any referent objects |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5485 // that are in the collection set and are pointed to by reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5486 // objects discovered by the CM ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5487 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5488 class G1ParPreserveCMReferentsTask: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5489 protected: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5490 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5491 RefToScanQueueSet *_queues; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5492 ParallelTaskTerminator _terminator; |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5493 uint _n_workers; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5494 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5495 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5496 G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5497 AbstractGangTask("ParPreserveCMReferents"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5498 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5499 _queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5500 _terminator(workers, _queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5501 _n_workers(workers) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5502 { } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5503 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5504 void work(uint worker_id) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5505 ResourceMark rm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5506 HandleMark hm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5507 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5508 G1ParScanThreadState pss(_g1h, worker_id, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5509 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5510 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5511 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5512 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5513 assert(pss.queue_is_empty(), "both queue and overflow should be empty"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5514 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5515 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5516 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5517 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5518 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5519 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5520 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5521 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5522 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5523 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5524 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5525 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5526 // Is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5527 G1AlwaysAliveClosure always_alive(_g1h); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5528 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5529 // Copying keep alive closure. Applied to referent objects that need |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5530 // to be copied. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5531 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5532 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5533 ReferenceProcessor* rp = _g1h->ref_processor_cm(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5534 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5535 uint limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q(); |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5536 uint stride = MIN2(MAX2(_n_workers, 1U), limit); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5537 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5538 // limit is set using max_num_q() - which was set using ParallelGCThreads. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5539 // So this must be true - but assert just in case someone decides to |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5540 // change the worker ids. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5541 assert(0 <= worker_id && worker_id < limit, "sanity"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5542 assert(!rp->discovery_is_atomic(), "check this code"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5543 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5544 // Select discovered lists [i, i+stride, i+2*stride,...,limit) |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5545 for (uint idx = worker_id; idx < limit; idx += stride) { |
4014
bf2d2b8b1726
7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents:
4013
diff
changeset
|
5546 DiscoveredList& ref_list = rp->discovered_refs()[idx]; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5547 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5548 DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5549 while (iter.has_next()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5550 // Since discovery is not atomic for the CM ref processor, we |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5551 // can see some null referent objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5552 iter.load_ptrs(DEBUG_ONLY(true)); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5553 oop ref = iter.obj(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5554 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5555 // This will filter nulls. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5556 if (iter.is_referent_alive()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5557 iter.make_referent_alive(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5558 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5559 iter.move_to_next(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5560 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5561 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5562 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5563 // Drain the queue - which may cause stealing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5564 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5565 drain_queue.do_void(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5566 // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5567 assert(pss.queue_is_empty(), "should be"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5568 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5569 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5570 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5571 // Weak Reference processing during an evacuation pause (part 1). |
6819 | 5572 void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5573 double ref_proc_start = os::elapsedTime(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5574 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5575 ReferenceProcessor* rp = _ref_processor_stw; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5576 assert(rp->discovery_enabled(), "should have been enabled"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5577 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5578 // Any reference objects, in the collection set, that were 'discovered' |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5579 // by the CM ref processor should have already been copied (either by |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5580 // applying the external root copy closure to the discovered lists, or |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5581 // by following an RSet entry). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5582 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5583 // But some of the referents, that are in the collection set, that these |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5584 // reference objects point to may not have been copied: the STW ref |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5585 // processor would have seen that the reference object had already |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5586 // been 'discovered' and would have skipped discovering the reference, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5587 // but would not have treated the reference object as a regular oop. |
10405 | 5588 // As a result the copy closure would not have been applied to the |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5589 // referent object. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5590 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5591 // We need to explicitly copy these referent objects - the references |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5592 // will be processed at the end of remarking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5593 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5594 // We also need to do this copying before we process the reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5595 // objects discovered by the STW ref processor in case one of these |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5596 // referents points to another object which is also referenced by an |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5597 // object discovered by the STW ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5598 |
4711 | 5599 assert(!G1CollectedHeap::use_parallel_gc_threads() || |
6819 | 5600 no_of_gc_workers == workers()->active_workers(), |
5601 "Need to reset active GC workers"); | |
5602 | |
5603 set_par_threads(no_of_gc_workers); | |
5604 G1ParPreserveCMReferentsTask keep_cm_referents(this, | |
5605 no_of_gc_workers, | |
5606 _task_queues); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5607 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5608 if (G1CollectedHeap::use_parallel_gc_threads()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5609 workers()->run_task(&keep_cm_referents); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5610 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5611 keep_cm_referents.work(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5612 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5613 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5614 set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5615 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5616 // Closure to test whether a referent is alive. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5617 G1STWIsAliveClosure is_alive(this); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5618 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5619 // Even when parallel reference processing is enabled, the processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5620 // of JNI refs is serial and performed serially by the current thread |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5621 // rather than by a worker. The following PSS will be used for processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5622 // JNI refs. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5623 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5624 // Use only a single queue for this PSS. |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5625 G1ParScanThreadState pss(this, 0, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5626 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5627 // We do not embed a reference processor in the copying/scanning |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5628 // closures while we're actually processing the discovered |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5629 // reference objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5630 G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5631 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5632 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5633 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5634 assert(pss.queue_is_empty(), "pre-condition"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5635 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5636 G1ParScanExtRootClosure only_copy_non_heap_cl(this, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5637 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5638 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5639 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5640 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5641 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5642 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5643 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5644 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5645 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5646 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5647 // Keep alive closure. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5648 G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5649 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5650 // Serial Complete GC closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5651 G1STWDrainQueueClosure drain_queue(this, &pss); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5652 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5653 // Setup the soft refs policy... |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5654 rp->setup_policy(false); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5655 |
10405 | 5656 ReferenceProcessorStats stats; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5657 if (!rp->processing_is_mt()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5658 // Serial reference processing... |
10405 | 5659 stats = rp->process_discovered_references(&is_alive, |
5660 &keep_alive, | |
5661 &drain_queue, | |
5662 NULL, | |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5663 _gc_timer_stw, |
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5664 _gc_tracer_stw->gc_id()); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5665 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5666 // Parallel reference processing |
6819 | 5667 assert(rp->num_q() == no_of_gc_workers, "sanity"); |
5668 assert(no_of_gc_workers <= rp->max_num_q(), "sanity"); | |
5669 | |
5670 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers); | |
10405 | 5671 stats = rp->process_discovered_references(&is_alive, |
5672 &keep_alive, | |
5673 &drain_queue, | |
5674 &par_task_executor, | |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5675 _gc_timer_stw, |
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5676 _gc_tracer_stw->gc_id()); |
10405 | 5677 } |
5678 | |
5679 _gc_tracer_stw->report_gc_reference_stats(stats); | |
20215
983092f35ff7
8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents:
20212
diff
changeset
|
5680 |
983092f35ff7
8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents:
20212
diff
changeset
|
5681 // We have completed copying any necessary live referent objects. |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5682 assert(pss.queue_is_empty(), "both queue and overflow should be empty"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5683 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5684 double ref_proc_time = os::elapsedTime() - ref_proc_start; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
5685 g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5686 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5687 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5688 // Weak Reference processing during an evacuation pause (part 2). |
6819 | 5689 void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5690 double ref_enq_start = os::elapsedTime(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5691 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5692 ReferenceProcessor* rp = _ref_processor_stw; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5693 assert(!rp->discovery_enabled(), "should have been disabled as part of processing"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5694 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5695 // Now enqueue any remaining on the discovered lists on to |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5696 // the pending list. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5697 if (!rp->processing_is_mt()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5698 // Serial reference processing... |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5699 rp->enqueue_discovered_references(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5700 } else { |
10405 | 5701 // Parallel reference enqueueing |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5702 |
6819 | 5703 assert(no_of_gc_workers == workers()->active_workers(), |
5704 "Need to reset active workers"); | |
5705 assert(rp->num_q() == no_of_gc_workers, "sanity"); | |
5706 assert(no_of_gc_workers <= rp->max_num_q(), "sanity"); | |
5707 | |
5708 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5709 rp->enqueue_discovered_references(&par_task_executor); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5710 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5711 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5712 rp->verify_no_references_recorded(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5713 assert(!rp->discovery_enabled(), "should have been disabled"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5714 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5715 // FIXME |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5716 // CM's reference processing also cleans up the string and symbol tables. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5717 // Should we do that here also? We could, but it is a serial operation |
10405 | 5718 // and could significantly increase the pause time. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5719 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5720 double ref_enq_time = os::elapsedTime() - ref_enq_start; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
5721 g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5722 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5723 |
10405 | 5724 void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) { |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
5725 _expand_heap_after_alloc_failure = true; |
10405 | 5726 _evacuation_failed = false; |
342 | 5727 |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5728 // Should G1EvacuationFailureALot be in effect for this GC? |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5729 NOT_PRODUCT(set_evacuation_failure_alot_for_current_gc();) |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5730 |
342 | 5731 g1_rem_set()->prepare_for_oops_into_collection_set_do(); |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5732 |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5733 // Disable the hot card cache. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5734 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5735 hot_card_cache->reset_hot_cache_claimed_index(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5736 hot_card_cache->set_use_cache(false); |
889 | 5737 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5738 uint n_workers; |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5739 if (G1CollectedHeap::use_parallel_gc_threads()) { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5740 n_workers = |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5741 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5742 workers()->active_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5743 Threads::number_of_non_daemon_threads()); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5744 assert(UseDynamicNumberOfGCThreads || |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5745 n_workers == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5746 "If not dynamic should be using all the workers"); |
4711 | 5747 workers()->set_active_workers(n_workers); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5748 set_par_threads(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5749 } else { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5750 assert(n_par_threads() == 0, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5751 "Should be the original non-parallel value"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5752 n_workers = 1; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5753 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5754 |
342 | 5755 |
5756 init_for_evac_failure(NULL); | |
5757 | |
5758 rem_set()->prepare_for_younger_refs_iterate(true); | |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
5759 |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
5760 assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty"); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5761 double start_par_time_sec = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5762 double end_par_time_sec; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5763 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5764 { |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
5765 G1RootProcessor root_processor(this); |
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
5766 G1ParTask g1_par_task(this, _task_queues, &root_processor); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5767 // InitialMark needs claim bits to keep track of the marked-through CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5768 if (g1_policy()->during_initial_mark_pause()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5769 ClassLoaderDataGraph::clear_claimed_marks(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5770 } |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5771 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5772 if (G1CollectedHeap::use_parallel_gc_threads()) { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5773 // The individual threads will set their evac-failure closures. |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5774 if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5775 // These tasks use ShareHeap::_process_strong_tasks |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5776 assert(UseDynamicNumberOfGCThreads || |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5777 workers()->active_workers() == workers()->total_workers(), |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5778 "If not dynamic should be using all the workers"); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5779 workers()->run_task(&g1_par_task); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5780 } else { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5781 g1_par_task.set_for_termination(n_workers); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5782 g1_par_task.work(0); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5783 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5784 end_par_time_sec = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5785 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5786 // Closing the inner scope will execute the destructor |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
5787 // for the G1RootProcessor object. We record the current |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5788 // elapsed time before closing the scope so that time |
23224
79b13c9a93e8
8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents:
23223
diff
changeset
|
5789 // taken for the destructor is NOT included in the |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5790 // reported parallel time. |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5791 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5792 |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5793 G1GCPhaseTimes* phase_times = g1_policy()->phase_times(); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5794 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5795 double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0; |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5796 phase_times->record_par_time(par_time_ms); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5797 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5798 double code_root_fixup_time_ms = |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5799 (os::elapsedTime() - end_par_time_sec) * 1000.0; |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5800 phase_times->record_code_root_fixup_time(code_root_fixup_time_ms); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5801 |
342 | 5802 set_par_threads(0); |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
5803 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5804 // Process any discovered reference objects - we have |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5805 // to do this _before_ we retire the GC alloc regions |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5806 // as we may have to copy some 'reachable' referent |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5807 // objects (and their reachable sub-graphs) that were |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5808 // not copied during the pause. |
6819 | 5809 process_discovered_references(n_workers); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5810 |
23222 | 5811 if (G1StringDedup::is_enabled()) { |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5812 double fixup_start = os::elapsedTime(); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5813 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5814 G1STWIsAliveClosure is_alive(this); |
342 | 5815 G1KeepAliveClosure keep_alive(this); |
23223
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5816 G1StringDedup::unlink_or_oops_do(&is_alive, &keep_alive, true, phase_times); |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5817 |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5818 double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0; |
8f8f1d578796
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents:
23222
diff
changeset
|
5819 phase_times->record_string_dedup_fixup_time(fixup_time_ms); |
342 | 5820 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5821 |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
5822 _allocator->release_gc_alloc_regions(n_workers, evacuation_info); |
342 | 5823 g1_rem_set()->cleanup_after_oops_into_collection_set_do(); |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
5824 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5825 // Reset and re-enable the hot card cache. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5826 // Note the counts for the cards in the regions in the |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5827 // collection set are reset when the collection set is freed. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5828 hot_card_cache->reset_hot_cache(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5829 hot_card_cache->set_use_cache(true); |
342 | 5830 |
17753
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
5831 purge_code_root_memory(); |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
5832 |
12080 | 5833 if (g1_policy()->during_initial_mark_pause()) { |
5834 // Reset the claim values set during marking the strong code roots | |
5835 reset_heap_region_claim_values(); | |
5836 } | |
5837 | |
342 | 5838 finalize_for_evac_failure(); |
5839 | |
5840 if (evacuation_failed()) { | |
5841 remove_self_forwarding_pointers(); | |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5842 |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5843 // Reset the G1EvacuationFailureALot counters and flags |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5844 // Note: the values are reset only when an actual |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5845 // evacuation failure occurs. |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5846 NOT_PRODUCT(reset_evacuation_should_fail();) |
342 | 5847 } |
5848 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5849 // Enqueue any remaining references remaining on the STW |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5850 // reference processor's discovered lists. We need to do |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5851 // this after the card table is cleaned (and verified) as |
10405 | 5852 // the act of enqueueing entries on to the pending list |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5853 // will log these updates (and dirty their associated |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5854 // cards). We need these updates logged to update any |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5855 // RSets. |
6819 | 5856 enqueue_discovered_references(n_workers); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5857 |
20504
6948da6d7c13
8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents:
20503
diff
changeset
|
5858 redirty_logged_cards(); |
342 | 5859 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
5860 } | |
5861 | |
2152 | 5862 void G1CollectedHeap::free_region(HeapRegion* hr, |
5863 FreeRegionList* free_list, | |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
5864 bool par, |
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
5865 bool locked) { |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
5866 assert(!hr->is_free(), "the region should not be free"); |
2152 | 5867 assert(!hr->is_empty(), "the region should not be empty"); |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
5868 assert(_hrm.is_available(hr->hrm_index()), "region should be committed"); |
2152 | 5869 assert(free_list != NULL, "pre-condition"); |
5870 | |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
5871 if (G1VerifyBitmaps) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
5872 MemRegion mr(hr->bottom(), hr->end()); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
5873 concurrent_mark()->clearRangePrevBitmap(mr); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
5874 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
5875 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5876 // Clear the card counts for this region. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5877 // Note: we only need to do this if the region is not young |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5878 // (since we don't refine cards in young regions). |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5879 if (!hr->is_young()) { |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5880 _cg1r->hot_card_cache()->reset_card_counts(hr); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5881 } |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
5882 hr->hr_clear(par, true /* clear_space */, locked /* locked */); |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
5883 free_list->add_ordered(hr); |
2152 | 5884 } |
5885 | |
5886 void G1CollectedHeap::free_humongous_region(HeapRegion* hr, | |
5887 FreeRegionList* free_list, | |
5888 bool par) { | |
5889 assert(hr->startsHumongous(), "this is only for starts humongous regions"); | |
5890 assert(free_list != NULL, "pre-condition"); | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5891 |
2152 | 5892 size_t hr_capacity = hr->capacity(); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
5893 // We need to read this before we make the region non-humongous, |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
5894 // otherwise the information will be gone. |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
5895 uint last_index = hr->last_hc_index(); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
5896 hr->clear_humongous(); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5897 free_region(hr, free_list, par); |
2152 | 5898 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
5899 uint i = hr->hrm_index() + 1; |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
5900 while (i < last_index) { |
3766 | 5901 HeapRegion* curr_hr = region_at(i); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
5902 assert(curr_hr->continuesHumongous(), "invariant"); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
5903 curr_hr->clear_humongous(); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5904 free_region(curr_hr, free_list, par); |
2152 | 5905 i += 1; |
5906 } | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5907 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5908 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5909 void G1CollectedHeap::remove_from_old_sets(const HeapRegionSetCount& old_regions_removed, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5910 const HeapRegionSetCount& humongous_regions_removed) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5911 if (old_regions_removed.length() > 0 || humongous_regions_removed.length() > 0) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5912 MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5913 _old_set.bulk_remove(old_regions_removed); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5914 _humongous_set.bulk_remove(humongous_regions_removed); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5915 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5916 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5917 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5918 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5919 void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5920 assert(list != NULL, "list can't be null"); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5921 if (!list->is_empty()) { |
2152 | 5922 MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag); |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
5923 _hrm.insert_list_into_free_list(list); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5924 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5925 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5926 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
5927 void G1CollectedHeap::decrement_summary_bytes(size_t bytes) { |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
5928 _allocator->decrease_used(bytes); |
342 | 5929 } |
5930 | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5931 class G1ParCleanupCTTask : public AbstractGangTask { |
12343 | 5932 G1SATBCardTableModRefBS* _ct_bs; |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5933 G1CollectedHeap* _g1h; |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5934 HeapRegion* volatile _su_head; |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5935 public: |
12343 | 5936 G1ParCleanupCTTask(G1SATBCardTableModRefBS* ct_bs, |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
5937 G1CollectedHeap* g1h) : |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5938 AbstractGangTask("G1 Par Cleanup CT Task"), |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
5939 _ct_bs(ct_bs), _g1h(g1h) { } |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5940 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5941 void work(uint worker_id) { |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5942 HeapRegion* r; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5943 while (r = _g1h->pop_dirty_cards_region()) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5944 clear_cards(r); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5945 } |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5946 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5947 |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5948 void clear_cards(HeapRegion* r) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
5949 // Cards of the survivors should have already been dirtied. |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
5950 if (!r->is_survivor()) { |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5951 _ct_bs->clear(MemRegion(r->bottom(), r->end())); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5952 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5953 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5954 }; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
5955 |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5956 #ifndef PRODUCT |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5957 class G1VerifyCardTableCleanup: public HeapRegionClosure { |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5958 G1CollectedHeap* _g1h; |
12343 | 5959 G1SATBCardTableModRefBS* _ct_bs; |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5960 public: |
12343 | 5961 G1VerifyCardTableCleanup(G1CollectedHeap* g1h, G1SATBCardTableModRefBS* ct_bs) |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5962 : _g1h(g1h), _ct_bs(ct_bs) { } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
5963 virtual bool doHeapRegion(HeapRegion* r) { |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
5964 if (r->is_survivor()) { |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5965 _g1h->verify_dirty_region(r); |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5966 } else { |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5967 _g1h->verify_not_dirty_region(r); |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5968 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5969 return false; |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5970 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
5971 }; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
5972 |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5973 void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) { |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5974 // All of the region should be clean. |
12343 | 5975 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5976 MemRegion mr(hr->bottom(), hr->end()); |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5977 ct_bs->verify_not_dirty_region(mr); |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5978 } |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5979 |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5980 void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) { |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5981 // We cannot guarantee that [bottom(),end()] is dirty. Threads |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5982 // dirty allocated blocks as they allocate them. The thread that |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5983 // retires each region and replaces it with a new one will do a |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5984 // maximal allocation to fill in [pre_dummy_top(),end()] but will |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5985 // not dirty that area (one less thing to have to do while holding |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5986 // a lock). So we can only verify that [bottom(),pre_dummy_top()] |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5987 // is dirty. |
12343 | 5988 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5989 MemRegion mr(hr->bottom(), hr->pre_dummy_top()); |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
5990 if (hr->is_young()) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
5991 ct_bs->verify_g1_young_region(mr); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
5992 } else { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
5993 ct_bs->verify_dirty_region(mr); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
5994 } |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5995 } |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
5996 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
5997 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) { |
12343 | 5998 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
5999 for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) { |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6000 verify_dirty_region(hr); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6001 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6002 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6003 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6004 void G1CollectedHeap::verify_dirty_young_regions() { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6005 verify_dirty_young_list(_young_list->first_region()); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6006 } |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6007 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6008 bool G1CollectedHeap::verify_no_bits_over_tams(const char* bitmap_name, CMBitMapRO* bitmap, |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6009 HeapWord* tams, HeapWord* end) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6010 guarantee(tams <= end, |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6011 err_msg("tams: "PTR_FORMAT" end: "PTR_FORMAT, tams, end)); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6012 HeapWord* result = bitmap->getNextMarkedWordAddress(tams, end); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6013 if (result < end) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6014 gclog_or_tty->cr(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6015 gclog_or_tty->print_cr("## wrong marked address on %s bitmap: "PTR_FORMAT, |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6016 bitmap_name, result); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6017 gclog_or_tty->print_cr("## %s tams: "PTR_FORMAT" end: "PTR_FORMAT, |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6018 bitmap_name, tams, end); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6019 return false; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6020 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6021 return true; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6022 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6023 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6024 bool G1CollectedHeap::verify_bitmaps(const char* caller, HeapRegion* hr) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6025 CMBitMapRO* prev_bitmap = concurrent_mark()->prevMarkBitMap(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6026 CMBitMapRO* next_bitmap = (CMBitMapRO*) concurrent_mark()->nextMarkBitMap(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6027 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6028 HeapWord* bottom = hr->bottom(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6029 HeapWord* ptams = hr->prev_top_at_mark_start(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6030 HeapWord* ntams = hr->next_top_at_mark_start(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6031 HeapWord* end = hr->end(); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6032 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6033 bool res_p = verify_no_bits_over_tams("prev", prev_bitmap, ptams, end); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6034 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6035 bool res_n = true; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6036 // We reset mark_in_progress() before we reset _cmThread->in_progress() and in this window |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6037 // we do the clearing of the next bitmap concurrently. Thus, we can not verify the bitmap |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6038 // if we happen to be in that state. |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6039 if (mark_in_progress() || !_cmThread->in_progress()) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6040 res_n = verify_no_bits_over_tams("next", next_bitmap, ntams, end); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6041 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6042 if (!res_p || !res_n) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6043 gclog_or_tty->print_cr("#### Bitmap verification failed for "HR_FORMAT, |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6044 HR_FORMAT_PARAMS(hr)); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6045 gclog_or_tty->print_cr("#### Caller: %s", caller); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6046 return false; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6047 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6048 return true; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6049 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6050 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6051 void G1CollectedHeap::check_bitmaps(const char* caller, HeapRegion* hr) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6052 if (!G1VerifyBitmaps) return; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6053 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6054 guarantee(verify_bitmaps(caller, hr), "bitmap verification"); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6055 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6056 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6057 class G1VerifyBitmapClosure : public HeapRegionClosure { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6058 private: |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6059 const char* _caller; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6060 G1CollectedHeap* _g1h; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6061 bool _failures; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6062 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6063 public: |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6064 G1VerifyBitmapClosure(const char* caller, G1CollectedHeap* g1h) : |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6065 _caller(caller), _g1h(g1h), _failures(false) { } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6066 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6067 bool failures() { return _failures; } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6068 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6069 virtual bool doHeapRegion(HeapRegion* hr) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6070 if (hr->continuesHumongous()) return false; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6071 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6072 bool result = _g1h->verify_bitmaps(_caller, hr); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6073 if (!result) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6074 _failures = true; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6075 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6076 return false; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6077 } |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6078 }; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6079 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6080 void G1CollectedHeap::check_bitmaps(const char* caller) { |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6081 if (!G1VerifyBitmaps) return; |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6082 |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6083 G1VerifyBitmapClosure cl(caller, this); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6084 heap_region_iterate(&cl); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6085 guarantee(!cl.failures(), "bitmap verification"); |
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6086 } |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6087 |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6088 class G1CheckCSetFastTableClosure : public HeapRegionClosure { |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6089 private: |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6090 bool _failures; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6091 public: |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6092 G1CheckCSetFastTableClosure() : HeapRegionClosure(), _failures(false) { } |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6093 |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6094 virtual bool doHeapRegion(HeapRegion* hr) { |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6095 uint i = hr->hrm_index(); |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6096 InCSetState cset_state = (InCSetState) G1CollectedHeap::heap()->_in_cset_fast_test.get_by_index(i); |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6097 if (hr->isHumongous()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6098 if (hr->in_collection_set()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6099 gclog_or_tty->print_cr("\n## humongous region %u in CSet", i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6100 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6101 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6102 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6103 if (cset_state.is_in_cset()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6104 gclog_or_tty->print_cr("\n## inconsistent cset state %d for humongous region %u", cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6105 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6106 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6107 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6108 if (hr->continuesHumongous() && cset_state.is_humongous()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6109 gclog_or_tty->print_cr("\n## inconsistent cset state %d for continues humongous region %u", cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6110 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6111 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6112 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6113 } else { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6114 if (cset_state.is_humongous()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6115 gclog_or_tty->print_cr("\n## inconsistent cset state %d for non-humongous region %u", cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6116 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6117 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6118 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6119 if (hr->in_collection_set() != cset_state.is_in_cset()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6120 gclog_or_tty->print_cr("\n## in CSet %d / cset state %d inconsistency for region %u", |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6121 hr->in_collection_set(), cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6122 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6123 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6124 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6125 if (cset_state.is_in_cset()) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6126 if (hr->is_young() != (cset_state.is_young())) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6127 gclog_or_tty->print_cr("\n## is_young %d / cset state %d inconsistency for region %u", |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6128 hr->is_young(), cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6129 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6130 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6131 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6132 if (hr->is_old() != (cset_state.is_old())) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6133 gclog_or_tty->print_cr("\n## is_old %d / cset state %d inconsistency for region %u", |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6134 hr->is_old(), cset_state.value(), i); |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6135 _failures = true; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6136 return true; |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6137 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6138 } |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6139 } |
22923
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6140 return false; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6141 } |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6142 |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6143 bool failures() const { return _failures; } |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6144 }; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6145 |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6146 bool G1CollectedHeap::check_cset_fast_test() { |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6147 G1CheckCSetFastTableClosure cl; |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6148 _hrm.iterate(&cl); |
c04f46b4abe4
8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents:
22909
diff
changeset
|
6149 return !cl.failures(); |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6150 } |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6151 #endif // PRODUCT |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6152 |
342 | 6153 void G1CollectedHeap::cleanUpCardTable() { |
12343 | 6154 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
342 | 6155 double start = os::elapsedTime(); |
6156 | |
4023 | 6157 { |
6158 // Iterate over the dirty cards region list. | |
6159 G1ParCleanupCTTask cleanup_task(ct_bs, this); | |
6160 | |
4711 | 6161 if (G1CollectedHeap::use_parallel_gc_threads()) { |
6162 set_par_threads(); | |
4023 | 6163 workers()->run_task(&cleanup_task); |
6164 set_par_threads(0); | |
6165 } else { | |
6166 while (_dirty_cards_region_list) { | |
6167 HeapRegion* r = _dirty_cards_region_list; | |
6168 cleanup_task.clear_cards(r); | |
6169 _dirty_cards_region_list = r->get_next_dirty_cards_region(); | |
6170 if (_dirty_cards_region_list == r) { | |
6171 // The last region. | |
6172 _dirty_cards_region_list = NULL; | |
6173 } | |
6174 r->set_next_dirty_cards_region(NULL); | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6175 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6176 } |
4023 | 6177 #ifndef PRODUCT |
6178 if (G1VerifyCTCleanup || VerifyAfterGC) { | |
6179 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs); | |
6180 heap_region_iterate(&cleanup_verifier); | |
6181 } | |
6182 #endif | |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6183 } |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6184 |
342 | 6185 double elapsed = os::elapsedTime() - start; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
6186 g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0); |
342 | 6187 } |
6188 | |
10405 | 6189 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info) { |
2152 | 6190 size_t pre_used = 0; |
6191 FreeRegionList local_free_list("Local List for CSet Freeing"); | |
6192 | |
342 | 6193 double young_time_ms = 0.0; |
6194 double non_young_time_ms = 0.0; | |
6195 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6196 // Since the collection set is a superset of the the young list, |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6197 // all we need to do to clear the young list is clear its |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6198 // head and length, and unlink any young regions in the code below |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6199 _young_list->clear(); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6200 |
342 | 6201 G1CollectorPolicy* policy = g1_policy(); |
6202 | |
6203 double start_sec = os::elapsedTime(); | |
6204 bool non_young = true; | |
6205 | |
6206 HeapRegion* cur = cs_head; | |
6207 int age_bound = -1; | |
6208 size_t rs_lengths = 0; | |
6209 | |
6210 while (cur != NULL) { | |
2361 | 6211 assert(!is_on_master_free_list(cur), "sanity"); |
342 | 6212 if (non_young) { |
6213 if (cur->is_young()) { | |
6214 double end_sec = os::elapsedTime(); | |
6215 double elapsed_ms = (end_sec - start_sec) * 1000.0; | |
6216 non_young_time_ms += elapsed_ms; | |
6217 | |
6218 start_sec = os::elapsedTime(); | |
6219 non_young = false; | |
6220 } | |
6221 } else { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6222 if (!cur->is_young()) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6223 double end_sec = os::elapsedTime(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6224 double elapsed_ms = (end_sec - start_sec) * 1000.0; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6225 young_time_ms += elapsed_ms; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6226 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6227 start_sec = os::elapsedTime(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6228 non_young = true; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6229 } |
342 | 6230 } |
6231 | |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6232 rs_lengths += cur->rem_set()->occupied_locked(); |
342 | 6233 |
6234 HeapRegion* next = cur->next_in_collection_set(); | |
6235 assert(cur->in_collection_set(), "bad CS"); | |
6236 cur->set_next_in_collection_set(NULL); | |
6237 cur->set_in_collection_set(false); | |
6238 | |
6239 if (cur->is_young()) { | |
6240 int index = cur->young_index_in_cset(); | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
6241 assert(index != -1, "invariant"); |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
6242 assert((uint) index < policy->young_cset_region_length(), "invariant"); |
342 | 6243 size_t words_survived = _surviving_young_words[index]; |
6244 cur->record_surv_words_in_group(words_survived); | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6245 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6246 // At this point the we have 'popped' cur from the collection set |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6247 // (linked via next_in_collection_set()) but it is still in the |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6248 // young list (linked via next_young_region()). Clear the |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6249 // _next_young_region field. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6250 cur->set_next_young_region(NULL); |
342 | 6251 } else { |
6252 int index = cur->young_index_in_cset(); | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
6253 assert(index == -1, "invariant"); |
342 | 6254 } |
6255 | |
6256 assert( (cur->is_young() && cur->young_index_in_cset() > -1) || | |
6257 (!cur->is_young() && cur->young_index_in_cset() == -1), | |
6258 "invariant" ); | |
6259 | |
6260 if (!cur->evacuation_failed()) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6261 MemRegion used_mr = cur->used_region(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6262 |
342 | 6263 // And the region is empty. |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6264 assert(!used_mr.is_empty(), "Should not have empty regions in a CS."); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6265 pre_used += cur->used(); |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6266 free_region(cur, &local_free_list, false /* par */, true /* locked */); |
342 | 6267 } else { |
6268 cur->uninstall_surv_rate_group(); | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
6269 if (cur->is_young()) { |
342 | 6270 cur->set_young_index_in_cset(-1); |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
6271 } |
342 | 6272 cur->set_evacuation_failed(false); |
4072 | 6273 // The region is now considered to be old. |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6274 cur->set_old(); |
4072 | 6275 _old_set.add(cur); |
10405 | 6276 evacuation_info.increment_collectionset_used_after(cur->used()); |
342 | 6277 } |
6278 cur = next; | |
6279 } | |
6280 | |
10405 | 6281 evacuation_info.set_regions_freed(local_free_list.length()); |
342 | 6282 policy->record_max_rs_lengths(rs_lengths); |
6283 policy->cset_regions_freed(); | |
6284 | |
6285 double end_sec = os::elapsedTime(); | |
6286 double elapsed_ms = (end_sec - start_sec) * 1000.0; | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6287 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6288 if (non_young) { |
342 | 6289 non_young_time_ms += elapsed_ms; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6290 } else { |
342 | 6291 young_time_ms += elapsed_ms; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6292 } |
342 | 6293 |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6294 prepend_to_freelist(&local_free_list); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6295 decrement_summary_bytes(pre_used); |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
6296 policy->phase_times()->record_young_free_cset_time_ms(young_time_ms); |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
6297 policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms); |
342 | 6298 } |
6299 | |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6300 class G1FreeHumongousRegionClosure : public HeapRegionClosure { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6301 private: |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6302 FreeRegionList* _free_region_list; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6303 HeapRegionSet* _proxy_set; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6304 HeapRegionSetCount _humongous_regions_removed; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6305 size_t _freed_bytes; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6306 public: |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6307 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6308 G1FreeHumongousRegionClosure(FreeRegionList* free_region_list) : |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6309 _free_region_list(free_region_list), _humongous_regions_removed(), _freed_bytes(0) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6310 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6311 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6312 virtual bool doHeapRegion(HeapRegion* r) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6313 if (!r->startsHumongous()) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6314 return false; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6315 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6316 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6317 G1CollectedHeap* g1h = G1CollectedHeap::heap(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6318 |
20307
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6319 oop obj = (oop)r->bottom(); |
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6320 CMBitMap* next_bitmap = g1h->concurrent_mark()->nextMarkBitMap(); |
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6321 |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6322 // The following checks whether the humongous object is live are sufficient. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6323 // The main additional check (in addition to having a reference from the roots |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6324 // or the young gen) is whether the humongous object has a remembered set entry. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6325 // |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6326 // A humongous object cannot be live if there is no remembered set for it |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6327 // because: |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6328 // - there can be no references from within humongous starts regions referencing |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6329 // the object because we never allocate other objects into them. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6330 // (I.e. there are no intra-region references that may be missed by the |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6331 // remembered set) |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6332 // - as soon there is a remembered set entry to the humongous starts region |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6333 // (i.e. it has "escaped" to an old object) this remembered set entry will stay |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6334 // until the end of a concurrent mark. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6335 // |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6336 // It is not required to check whether the object has been found dead by marking |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6337 // or not, in fact it would prevent reclamation within a concurrent cycle, as |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6338 // all objects allocated during that time are considered live. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6339 // SATB marking is even more conservative than the remembered set. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6340 // So if at this point in the collection there is no remembered set entry, |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6341 // nobody has a reference to it. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6342 // At the start of collection we flush all refinement logs, and remembered sets |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6343 // are completely up-to-date wrt to references to the humongous object. |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6344 // |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6345 // Other implementation considerations: |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6346 // - never consider object arrays at this time because they would pose |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6347 // considerable effort for cleaning up the the remembered sets. This is |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6348 // required because stale remembered sets might reference locations that |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6349 // are currently allocated into. |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6350 uint region_idx = r->hrm_index(); |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6351 if (!g1h->is_humongous_reclaim_candidate(region_idx) || |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6352 !r->rem_set()->is_empty()) { |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6353 |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6354 if (G1TraceEagerReclaimHumongousObjects) { |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6355 gclog_or_tty->print_cr("Live humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d reclaim candidate %d type array %d", |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6356 region_idx, |
22894
2af69bed8db6
8058801: G1TraceReclaimDeadHumongousObjectsAtYoungGC only prints humongous object liveness output when there is at least one candidate humongous object
tschatzl
parents:
22862
diff
changeset
|
6357 obj->size()*HeapWordSize, |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6358 r->bottom(), |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6359 r->region_num(), |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6360 r->rem_set()->occupied(), |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6361 r->rem_set()->strong_code_roots_list_length(), |
20307
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6362 next_bitmap->isMarked(r->bottom()), |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6363 g1h->is_humongous_reclaim_candidate(region_idx), |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6364 obj->is_typeArray() |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6365 ); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6366 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6367 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6368 return false; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6369 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6370 |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6371 guarantee(obj->is_typeArray(), |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6372 err_msg("Only eagerly reclaiming type arrays is supported, but the object " |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6373 PTR_FORMAT " is not.", |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6374 r->bottom())); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6375 |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6376 if (G1TraceEagerReclaimHumongousObjects) { |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6377 gclog_or_tty->print_cr("Dead humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d reclaim candidate %d type array %d", |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6378 region_idx, |
22894
2af69bed8db6
8058801: G1TraceReclaimDeadHumongousObjectsAtYoungGC only prints humongous object liveness output when there is at least one candidate humongous object
tschatzl
parents:
22862
diff
changeset
|
6379 obj->size()*HeapWordSize, |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6380 r->bottom(), |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6381 r->region_num(), |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6382 r->rem_set()->occupied(), |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6383 r->rem_set()->strong_code_roots_list_length(), |
20307
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6384 next_bitmap->isMarked(r->bottom()), |
23026
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6385 g1h->is_humongous_reclaim_candidate(region_idx), |
b7c8142a9e0b
8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents:
23024
diff
changeset
|
6386 obj->is_typeArray() |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6387 ); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6388 } |
20307
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6389 // Need to clear mark bit of the humongous object if already set. |
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6390 if (next_bitmap->isMarked(r->bottom())) { |
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6391 next_bitmap->clear(r->bottom()); |
04d77ac27223
8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents:
20305
diff
changeset
|
6392 } |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6393 _freed_bytes += r->used(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6394 r->set_containing_set(NULL); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6395 _humongous_regions_removed.increment(1u, r->capacity()); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6396 g1h->free_humongous_region(r, _free_region_list, false); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6397 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6398 return false; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6399 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6400 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6401 HeapRegionSetCount& humongous_free_count() { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6402 return _humongous_regions_removed; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6403 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6404 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6405 size_t bytes_freed() const { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6406 return _freed_bytes; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6407 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6408 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6409 size_t humongous_reclaimed() const { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6410 return _humongous_regions_removed.length(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6411 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6412 }; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6413 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6414 void G1CollectedHeap::eagerly_reclaim_humongous_regions() { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6415 assert_at_safepoint(true); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6416 |
23024
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6417 if (!G1EagerReclaimHumongousObjects || |
cbc7c4c9e11c
8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents:
22978
diff
changeset
|
6418 (!_has_humongous_reclaim_candidates && !G1TraceEagerReclaimHumongousObjects)) { |
20305
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6419 g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms(0.0, 0); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6420 return; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6421 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6422 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6423 double start_time = os::elapsedTime(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6424 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6425 FreeRegionList local_cleanup_list("Local Humongous Cleanup List"); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6426 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6427 G1FreeHumongousRegionClosure cl(&local_cleanup_list); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6428 heap_region_iterate(&cl); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6429 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6430 HeapRegionSetCount empty_set; |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6431 remove_from_old_sets(empty_set, cl.humongous_free_count()); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6432 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6433 G1HRPrinter* hr_printer = _g1h->hr_printer(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6434 if (hr_printer->is_active()) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6435 FreeRegionListIterator iter(&local_cleanup_list); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6436 while (iter.more_available()) { |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6437 HeapRegion* hr = iter.get_next(); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6438 hr_printer->cleanup(hr); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6439 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6440 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6441 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6442 prepend_to_freelist(&local_cleanup_list); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6443 decrement_summary_bytes(cl.bytes_freed()); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6444 |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6445 g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms((os::elapsedTime() - start_time) * 1000.0, |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6446 cl.humongous_reclaimed()); |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6447 } |
755930f931e3
8027959: Early reclamation of large objects in G1
tschatzl
parents:
20304
diff
changeset
|
6448 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6449 // This routine is similar to the above but does not record |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6450 // any policy statistics or update free lists; we are abandoning |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6451 // the current incremental collection set in preparation of a |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6452 // full collection. After the full GC we will start to build up |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6453 // the incremental collection set again. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6454 // This is only called when we're doing a full collection |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6455 // and is immediately followed by the tearing down of the young list. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6456 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6457 void G1CollectedHeap::abandon_collection_set(HeapRegion* cs_head) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6458 HeapRegion* cur = cs_head; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6459 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6460 while (cur != NULL) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6461 HeapRegion* next = cur->next_in_collection_set(); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6462 assert(cur->in_collection_set(), "bad CS"); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6463 cur->set_next_in_collection_set(NULL); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6464 cur->set_in_collection_set(false); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6465 cur->set_young_index_in_cset(-1); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6466 cur = next; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6467 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6468 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6469 |
2152 | 6470 void G1CollectedHeap::set_free_regions_coming() { |
6471 if (G1ConcRegionFreeingVerbose) { | |
6472 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : " | |
6473 "setting free regions coming"); | |
6474 } | |
6475 | |
6476 assert(!free_regions_coming(), "pre-condition"); | |
6477 _free_regions_coming = true; | |
342 | 6478 } |
6479 | |
2152 | 6480 void G1CollectedHeap::reset_free_regions_coming() { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
6481 assert(free_regions_coming(), "pre-condition"); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
6482 |
2152 | 6483 { |
6484 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); | |
6485 _free_regions_coming = false; | |
6486 SecondaryFreeList_lock->notify_all(); | |
6487 } | |
6488 | |
6489 if (G1ConcRegionFreeingVerbose) { | |
6490 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : " | |
6491 "reset free regions coming"); | |
342 | 6492 } |
6493 } | |
6494 | |
2152 | 6495 void G1CollectedHeap::wait_while_free_regions_coming() { |
6496 // Most of the time we won't have to wait, so let's do a quick test | |
6497 // first before we take the lock. | |
6498 if (!free_regions_coming()) { | |
6499 return; | |
6500 } | |
6501 | |
6502 if (G1ConcRegionFreeingVerbose) { | |
6503 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : " | |
6504 "waiting for free regions"); | |
342 | 6505 } |
6506 | |
6507 { | |
2152 | 6508 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); |
6509 while (free_regions_coming()) { | |
6510 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag); | |
342 | 6511 } |
2152 | 6512 } |
6513 | |
6514 if (G1ConcRegionFreeingVerbose) { | |
6515 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : " | |
6516 "done waiting for free regions"); | |
6517 } | |
342 | 6518 } |
6519 | |
6520 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) { | |
6521 assert(heap_lock_held_for_gc(), | |
6522 "the heap lock should already be held by or for this thread"); | |
6523 _young_list->push_region(hr); | |
6524 } | |
6525 | |
6526 class NoYoungRegionsClosure: public HeapRegionClosure { | |
6527 private: | |
6528 bool _success; | |
6529 public: | |
6530 NoYoungRegionsClosure() : _success(true) { } | |
6531 bool doHeapRegion(HeapRegion* r) { | |
6532 if (r->is_young()) { | |
6533 gclog_or_tty->print_cr("Region ["PTR_FORMAT", "PTR_FORMAT") tagged as young", | |
6534 r->bottom(), r->end()); | |
6535 _success = false; | |
6536 } | |
6537 return false; | |
6538 } | |
6539 bool success() { return _success; } | |
6540 }; | |
6541 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6542 bool G1CollectedHeap::check_young_list_empty(bool check_heap, bool check_sample) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6543 bool ret = _young_list->check_list_empty(check_sample); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6544 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6545 if (check_heap) { |
342 | 6546 NoYoungRegionsClosure closure; |
6547 heap_region_iterate(&closure); | |
6548 ret = ret && closure.success(); | |
6549 } | |
6550 | |
6551 return ret; | |
6552 } | |
6553 | |
4072 | 6554 class TearDownRegionSetsClosure : public HeapRegionClosure { |
6555 private: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6556 HeapRegionSet *_old_set; |
2152 | 6557 |
342 | 6558 public: |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6559 TearDownRegionSetsClosure(HeapRegionSet* old_set) : _old_set(old_set) { } |
2152 | 6560 |
342 | 6561 bool doHeapRegion(HeapRegion* r) { |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6562 if (r->is_old()) { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6563 _old_set->remove(r); |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6564 } else { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6565 // We ignore free regions, we'll empty the free list afterwards. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6566 // We ignore young regions, we'll empty the young list afterwards. |
4072 | 6567 // We ignore humongous regions, we're not tearing down the |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6568 // humongous regions set. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6569 assert(r->is_free() || r->is_young() || r->isHumongous(), |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6570 "it cannot be another type"); |
342 | 6571 } |
6572 return false; | |
6573 } | |
6574 | |
4072 | 6575 ~TearDownRegionSetsClosure() { |
6576 assert(_old_set->is_empty(), "post-condition"); | |
2152 | 6577 } |
342 | 6578 }; |
6579 | |
4072 | 6580 void G1CollectedHeap::tear_down_region_sets(bool free_list_only) { |
6581 assert_at_safepoint(true /* should_be_vm_thread */); | |
6582 | |
6583 if (!free_list_only) { | |
6584 TearDownRegionSetsClosure cl(&_old_set); | |
6585 heap_region_iterate(&cl); | |
6586 | |
17764 | 6587 // Note that emptying the _young_list is postponed and instead done as |
6588 // the first step when rebuilding the regions sets again. The reason for | |
6589 // this is that during a full GC string deduplication needs to know if | |
6590 // a collected region was young or old when the full GC was initiated. | |
4072 | 6591 } |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6592 _hrm.remove_all_free_regions(); |
4072 | 6593 } |
6594 | |
6595 class RebuildRegionSetsClosure : public HeapRegionClosure { | |
6596 private: | |
6597 bool _free_list_only; | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6598 HeapRegionSet* _old_set; |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6599 HeapRegionManager* _hrm; |
4072 | 6600 size_t _total_used; |
6601 | |
6602 public: | |
6603 RebuildRegionSetsClosure(bool free_list_only, | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6604 HeapRegionSet* old_set, HeapRegionManager* hrm) : |
4072 | 6605 _free_list_only(free_list_only), |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6606 _old_set(old_set), _hrm(hrm), _total_used(0) { |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6607 assert(_hrm->num_free_regions() == 0, "pre-condition"); |
4072 | 6608 if (!free_list_only) { |
6609 assert(_old_set->is_empty(), "pre-condition"); | |
6610 } | |
6611 } | |
6612 | |
6613 bool doHeapRegion(HeapRegion* r) { | |
6614 if (r->continuesHumongous()) { | |
6615 return false; | |
6616 } | |
6617 | |
6618 if (r->is_empty()) { | |
6619 // Add free regions to the free list | |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6620 r->set_free(); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6621 r->set_allocation_context(AllocationContext::system()); |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6622 _hrm->insert_into_free_list(r); |
4072 | 6623 } else if (!_free_list_only) { |
6624 assert(!r->is_young(), "we should not come across young regions"); | |
6625 | |
6626 if (r->isHumongous()) { | |
6627 // We ignore humongous regions, we left the humongous set unchanged | |
6628 } else { | |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6629 // Objects that were compacted would have ended up on regions |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6630 // that were previously old or free. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6631 assert(r->is_free() || r->is_old(), "invariant"); |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6632 // We now consider them old, so register as such. |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6633 r->set_old(); |
4072 | 6634 _old_set->add(r); |
6635 } | |
6636 _total_used += r->used(); | |
6637 } | |
6638 | |
6639 return false; | |
6640 } | |
6641 | |
6642 size_t total_used() { | |
6643 return _total_used; | |
6644 } | |
6645 }; | |
6646 | |
6647 void G1CollectedHeap::rebuild_region_sets(bool free_list_only) { | |
6648 assert_at_safepoint(true /* should_be_vm_thread */); | |
6649 | |
17764 | 6650 if (!free_list_only) { |
6651 _young_list->empty_list(); | |
6652 } | |
6653 | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6654 RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_hrm); |
4072 | 6655 heap_region_iterate(&cl); |
6656 | |
6657 if (!free_list_only) { | |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6658 _allocator->set_used(cl.total_used()); |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6659 } |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6660 assert(_allocator->used_unlocked() == recalculate_used(), |
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6661 err_msg("inconsistent _allocator->used_unlocked(), " |
4072 | 6662 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT, |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6663 _allocator->used_unlocked(), recalculate_used())); |
342 | 6664 } |
6665 | |
6666 void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) { | |
6667 _refine_cte_cl->set_concurrent(concurrent); | |
6668 } | |
6669 | |
6670 bool G1CollectedHeap::is_in_closed_subset(const void* p) const { | |
6671 HeapRegion* hr = heap_region_containing(p); | |
20335
eec72fa4b108
8040722: G1: Clean up usages of heap_region_containing
brutisso
parents:
20334
diff
changeset
|
6672 return hr->is_in(p); |
342 | 6673 } |
2152 | 6674 |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6675 // Methods for the mutator alloc region |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6676 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6677 HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6678 bool force) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6679 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6680 assert(!force || g1_policy()->can_expand_young_list(), |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6681 "if force is true we should be able to expand the young list"); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6682 bool young_list_full = g1_policy()->is_young_list_full(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6683 if (force || !young_list_full) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6684 HeapRegion* new_alloc_region = new_region(word_size, |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
6685 false /* is_old */, |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6686 false /* do_expand */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6687 if (new_alloc_region != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6688 set_region_short_lived_locked(new_alloc_region); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6689 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full); |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6690 check_bitmaps("Mutator Region Allocation", new_alloc_region); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6691 return new_alloc_region; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6692 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6693 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6694 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6695 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6696 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6697 void G1CollectedHeap::retire_mutator_alloc_region(HeapRegion* alloc_region, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6698 size_t allocated_bytes) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6699 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6700 assert(alloc_region->is_eden(), "all mutator alloc regions should be eden"); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6701 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6702 g1_policy()->add_region_to_incremental_cset_lhs(alloc_region); |
20404
227a9e5e4b4a
8057536: Refactor G1 to allow context specific allocations
sjohanss
parents:
20377
diff
changeset
|
6703 _allocator->increase_used(allocated_bytes); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6704 _hr_printer.retire(alloc_region); |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6705 // We update the eden sizes here, when the region is retired, |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6706 // instead of when it's allocated, since this is the point that its |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6707 // used space has been recored in _summary_bytes_used. |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6708 g1mm()->update_eden_size(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6709 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6710 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6711 void G1CollectedHeap::set_par_threads() { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6712 // Don't change the number of workers. Use the value previously set |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6713 // in the workgroup. |
4711 | 6714 assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise"); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
6715 uint n_workers = workers()->active_workers(); |
4711 | 6716 assert(UseDynamicNumberOfGCThreads || |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6717 n_workers == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6718 "Otherwise should be using the total number of workers"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6719 if (n_workers == 0) { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6720 assert(false, "Should have been set in prior evacuation pause."); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6721 n_workers = ParallelGCThreads; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6722 workers()->set_active_workers(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6723 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6724 set_par_threads(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6725 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6726 |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6727 // Methods for the GC alloc regions |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6728 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6729 HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
6730 uint count, |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6731 InCSetState dest) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6732 assert(FreeList_lock->owned_by_self(), "pre-condition"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6733 |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6734 if (count < g1_policy()->max_regions(dest)) { |
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6735 const bool is_survivor = (dest.is_young()); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6736 HeapRegion* new_alloc_region = new_region(word_size, |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6737 !is_survivor, |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6738 true /* do_expand */); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6739 if (new_alloc_region != NULL) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6740 // We really only need to do this for old regions given that we |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6741 // should never scan survivors. But it doesn't hurt to do it |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6742 // for survivors too. |
22897
80ac3ee51955
8065358: Refactor G1s usage of save_marks and reduce related races
mgerdin
parents:
22895
diff
changeset
|
6743 new_alloc_region->record_timestamp(); |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6744 if (is_survivor) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6745 new_alloc_region->set_survivor(); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6746 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor); |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6747 check_bitmaps("Survivor Region Allocation", new_alloc_region); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6748 } else { |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6749 new_alloc_region->set_old(); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6750 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old); |
20291
e0954897238a
7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents:
20282
diff
changeset
|
6751 check_bitmaps("Old Region Allocation", new_alloc_region); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6752 } |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6753 bool during_im = g1_policy()->during_initial_mark_pause(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6754 new_alloc_region->note_start_of_copying(during_im); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6755 return new_alloc_region; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6756 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6757 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6758 return NULL; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6759 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6760 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6761 void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6762 size_t allocated_bytes, |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6763 InCSetState dest) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6764 bool during_im = g1_policy()->during_initial_mark_pause(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6765 alloc_region->note_end_of_copying(during_im); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6766 g1_policy()->record_bytes_copied_during_gc(allocated_bytes); |
22901
c132be0fb74d
8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents:
22898
diff
changeset
|
6767 if (dest.is_young()) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6768 young_list()->add_survivor_region(alloc_region); |
4072 | 6769 } else { |
6770 _old_set.add(alloc_region); | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6771 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6772 _hr_printer.retire(alloc_region); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6773 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6774 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6775 // Heap region set verification |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6776 |
2152 | 6777 class VerifyRegionListsClosure : public HeapRegionClosure { |
6778 private: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6779 HeapRegionSet* _old_set; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6780 HeapRegionSet* _humongous_set; |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6781 HeapRegionManager* _hrm; |
2152 | 6782 |
6783 public: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6784 HeapRegionSetCount _old_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6785 HeapRegionSetCount _humongous_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6786 HeapRegionSetCount _free_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6787 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6788 VerifyRegionListsClosure(HeapRegionSet* old_set, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6789 HeapRegionSet* humongous_set, |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6790 HeapRegionManager* hrm) : |
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6791 _old_set(old_set), _humongous_set(humongous_set), _hrm(hrm), |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6792 _old_count(), _humongous_count(), _free_count(){ } |
2152 | 6793 |
6794 bool doHeapRegion(HeapRegion* hr) { | |
6795 if (hr->continuesHumongous()) { | |
6796 return false; | |
6797 } | |
6798 | |
6799 if (hr->is_young()) { | |
6800 // TODO | |
6801 } else if (hr->startsHumongous()) { | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6802 assert(hr->containing_set() == _humongous_set, err_msg("Heap region %u is starts humongous but not in humongous set.", hr->hrm_index())); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6803 _humongous_count.increment(1u, hr->capacity()); |
2152 | 6804 } else if (hr->is_empty()) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6805 assert(_hrm->is_free(hr), err_msg("Heap region %u is empty but not on the free list.", hr->hrm_index())); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6806 _free_count.increment(1u, hr->capacity()); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6807 } else if (hr->is_old()) { |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6808 assert(hr->containing_set() == _old_set, err_msg("Heap region %u is old but not in the old set.", hr->hrm_index())); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6809 _old_count.increment(1u, hr->capacity()); |
20481
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6810 } else { |
c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents:
20445
diff
changeset
|
6811 ShouldNotReachHere(); |
2152 | 6812 } |
6813 return false; | |
6814 } | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6815 |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6816 void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, HeapRegionManager* free_list) { |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6817 guarantee(old_set->length() == _old_count.length(), err_msg("Old set count mismatch. Expected %u, actual %u.", old_set->length(), _old_count.length())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6818 guarantee(old_set->total_capacity_bytes() == _old_count.capacity(), err_msg("Old set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6819 old_set->total_capacity_bytes(), _old_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6820 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6821 guarantee(humongous_set->length() == _humongous_count.length(), err_msg("Hum set count mismatch. Expected %u, actual %u.", humongous_set->length(), _humongous_count.length())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6822 guarantee(humongous_set->total_capacity_bytes() == _humongous_count.capacity(), err_msg("Hum set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6823 humongous_set->total_capacity_bytes(), _humongous_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6824 |
20336
6701abbc4441
8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents:
20335
diff
changeset
|
6825 guarantee(free_list->num_free_regions() == _free_count.length(), err_msg("Free list count mismatch. Expected %u, actual %u.", free_list->num_free_regions(), _free_count.length())); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6826 guarantee(free_list->total_capacity_bytes() == _free_count.capacity(), err_msg("Free list capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6827 free_list->total_capacity_bytes(), _free_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6828 } |
2152 | 6829 }; |
6830 | |
6831 void G1CollectedHeap::verify_region_sets() { | |
6832 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); | |
6833 | |
6834 // First, check the explicit lists. | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6835 _hrm.verify(); |
2152 | 6836 { |
6837 // Given that a concurrent operation might be adding regions to | |
6838 // the secondary free list we have to take the lock before | |
6839 // verifying it. | |
6840 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6841 _secondary_free_list.verify_list(); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6842 } |
2152 | 6843 |
6844 // If a concurrent region freeing operation is in progress it will | |
6845 // be difficult to correctly attributed any free regions we come | |
6846 // across to the correct free list given that they might belong to | |
6847 // one of several (free_list, secondary_free_list, any local lists, | |
6848 // etc.). So, if that's the case we will skip the rest of the | |
6849 // verification operation. Alternatively, waiting for the concurrent | |
6850 // operation to complete will have a non-trivial effect on the GC's | |
6851 // operation (no concurrent operation will last longer than the | |
6852 // interval between two calls to verification) and it might hide | |
6853 // any issues that we would like to catch during testing. | |
6854 if (free_regions_coming()) { | |
6855 return; | |
6856 } | |
6857 | |
2361 | 6858 // Make sure we append the secondary_free_list on the free_list so |
6859 // that all free regions we will come across can be safely | |
6860 // attributed to the free_list. | |
6861 append_secondary_free_list_if_not_empty_with_lock(); | |
2152 | 6862 |
6863 // Finally, make sure that the region accounting in the lists is | |
6864 // consistent with what we see in the heap. | |
6865 | |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6866 VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_hrm); |
2152 | 6867 heap_region_iterate(&cl); |
20377
a8ea2f110d87
8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents:
20359
diff
changeset
|
6868 cl.verify_counts(&_old_set, &_humongous_set, &_hrm); |
342 | 6869 } |
12080 | 6870 |
6871 // Optimized nmethod scanning | |
6872 | |
6873 class RegisterNMethodOopClosure: public OopClosure { | |
6874 G1CollectedHeap* _g1h; | |
6875 nmethod* _nm; | |
6876 | |
6877 template <class T> void do_oop_work(T* p) { | |
6878 T heap_oop = oopDesc::load_heap_oop(p); | |
6879 if (!oopDesc::is_null(heap_oop)) { | |
6880 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
6881 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6882 assert(!hr->continuesHumongous(), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6883 err_msg("trying to add code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6884 " starting at "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6885 _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region()))); |
12080 | 6886 |
20494 | 6887 // HeapRegion::add_strong_code_root_locked() avoids adding duplicate entries. |
6888 hr->add_strong_code_root_locked(_nm); | |
12080 | 6889 } |
6890 } | |
6891 | |
6892 public: | |
6893 RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) : | |
6894 _g1h(g1h), _nm(nm) {} | |
6895 | |
6896 void do_oop(oop* p) { do_oop_work(p); } | |
6897 void do_oop(narrowOop* p) { do_oop_work(p); } | |
6898 }; | |
6899 | |
6900 class UnregisterNMethodOopClosure: public OopClosure { | |
6901 G1CollectedHeap* _g1h; | |
6902 nmethod* _nm; | |
6903 | |
6904 template <class T> void do_oop_work(T* p) { | |
6905 T heap_oop = oopDesc::load_heap_oop(p); | |
6906 if (!oopDesc::is_null(heap_oop)) { | |
6907 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
6908 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6909 assert(!hr->continuesHumongous(), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6910 err_msg("trying to remove code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6911 " starting at "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6912 _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region()))); |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6913 |
12080 | 6914 hr->remove_strong_code_root(_nm); |
6915 } | |
6916 } | |
6917 | |
6918 public: | |
6919 UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) : | |
6920 _g1h(g1h), _nm(nm) {} | |
6921 | |
6922 void do_oop(oop* p) { do_oop_work(p); } | |
6923 void do_oop(narrowOop* p) { do_oop_work(p); } | |
6924 }; | |
6925 | |
6926 void G1CollectedHeap::register_nmethod(nmethod* nm) { | |
6927 CollectedHeap::register_nmethod(nm); | |
6928 | |
6929 guarantee(nm != NULL, "sanity"); | |
6930 RegisterNMethodOopClosure reg_cl(this, nm); | |
6931 nm->oops_do(®_cl); | |
6932 } | |
6933 | |
6934 void G1CollectedHeap::unregister_nmethod(nmethod* nm) { | |
6935 CollectedHeap::unregister_nmethod(nm); | |
6936 | |
6937 guarantee(nm != NULL, "sanity"); | |
6938 UnregisterNMethodOopClosure reg_cl(this, nm); | |
6939 nm->oops_do(®_cl, true); | |
6940 } | |
6941 | |
17753
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6942 void G1CollectedHeap::purge_code_root_memory() { |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6943 double purge_start = os::elapsedTime(); |
20494 | 6944 G1CodeRootSet::purge(); |
17753
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6945 double purge_time_ms = (os::elapsedTime() - purge_start) * 1000.0; |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6946 g1_policy()->phase_times()->record_strong_code_root_purge_time(purge_time_ms); |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6947 } |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6948 |
12080 | 6949 class RebuildStrongCodeRootClosure: public CodeBlobClosure { |
6950 G1CollectedHeap* _g1h; | |
6951 | |
6952 public: | |
6953 RebuildStrongCodeRootClosure(G1CollectedHeap* g1h) : | |
6954 _g1h(g1h) {} | |
6955 | |
6956 void do_code_blob(CodeBlob* cb) { | |
6957 nmethod* nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL; | |
6958 if (nm == NULL) { | |
6959 return; | |
6960 } | |
6961 | |
20191
fd81a5764900
8046231: G1: Code root location ... from nmethod ... not in strong code roots for region
pliden
parents:
20190
diff
changeset
|
6962 if (ScavengeRootsInCode) { |
12080 | 6963 _g1h->register_nmethod(nm); |
6964 } | |
6965 } | |
6966 }; | |
6967 | |
6968 void G1CollectedHeap::rebuild_strong_code_roots() { | |
6969 RebuildStrongCodeRootClosure blob_cl(this); | |
6970 CodeCache::blobs_do(&blob_cl); | |
6971 } |