Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 20304:a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett.
Reviewed-by: brutisso
author | tschatzl |
---|---|
date | Mon, 21 Jul 2014 10:00:31 +0200 |
parents | f3aeae1f9fc5 |
children | 755930f931e3 |
rev | line source |
---|---|
342 | 1 /* |
17651
7a860525e91e
8033106: Wrong predicate for checking whether the correct amount of symbol table entries have been processed in G1
tschatzl
parents:
17648
diff
changeset
|
2 * Copyright (c) 2001, 2014, 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" |
12080 | 30 #include "code/codeCache.hpp" |
1972 | 31 #include "code/icBuffer.hpp" |
32 #include "gc_implementation/g1/bufferingOopClosure.hpp" | |
33 #include "gc_implementation/g1/concurrentG1Refine.hpp" | |
34 #include "gc_implementation/g1/concurrentG1RefineThread.hpp" | |
35 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp" | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
36 #include "gc_implementation/g1/g1AllocRegion.inline.hpp" |
1972 | 37 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" |
38 #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
|
39 #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
|
40 #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
|
41 #include "gc_implementation/g1/g1GCPhaseTimes.hpp" |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
42 #include "gc_implementation/g1/g1Log.hpp" |
1972 | 43 #include "gc_implementation/g1/g1MarkSweep.hpp" |
44 #include "gc_implementation/g1/g1OopClosures.inline.hpp" | |
20223
b0c374311c4e
8035400: Move G1ParScanThreadState into its own files
tschatzl
parents:
20217
diff
changeset
|
45 #include "gc_implementation/g1/g1ParScanThreadState.inline.hpp" |
1972 | 46 #include "gc_implementation/g1/g1RemSet.inline.hpp" |
17764 | 47 #include "gc_implementation/g1/g1StringDedup.hpp" |
10405 | 48 #include "gc_implementation/g1/g1YCTypes.hpp" |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
49 #include "gc_implementation/g1/heapRegion.inline.hpp" |
1972 | 50 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
51 #include "gc_implementation/g1/heapRegionSeq.inline.hpp" | |
52 #include "gc_implementation/g1/vm_operations_g1.hpp" | |
10405 | 53 #include "gc_implementation/shared/gcHeapSummary.hpp" |
54 #include "gc_implementation/shared/gcTimer.hpp" | |
55 #include "gc_implementation/shared/gcTrace.hpp" | |
56 #include "gc_implementation/shared/gcTraceTime.hpp" | |
1972 | 57 #include "gc_implementation/shared/isGCActiveMark.hpp" |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
58 #include "memory/allocation.hpp" |
1972 | 59 #include "memory/gcLocker.inline.hpp" |
60 #include "memory/generationSpec.hpp" | |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
61 #include "memory/iterator.hpp" |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
62 #include "memory/referenceProcessor.hpp" |
1972 | 63 #include "oops/oop.inline.hpp" |
64 #include "oops/oop.pcgc.inline.hpp" | |
20197
ce8f6bb717c9
8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents:
20192
diff
changeset
|
65 #include "runtime/orderAccess.inline.hpp" |
1972 | 66 #include "runtime/vmThread.hpp" |
342 | 67 |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
68 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
|
69 |
342 | 70 // turn it on so that the contents of the young list (scan-only / |
71 // to-be-collected) are printed at "strategic" points before / during | |
72 // / 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
|
73 #define YOUNG_LIST_VERBOSE 0 |
342 | 74 // CURRENT STATUS |
75 // This file is under construction. Search for "FIXME". | |
76 | |
77 // INVARIANTS/NOTES | |
78 // | |
79 // All allocation activity covered by the G1CollectedHeap interface is | |
1973 | 80 // serialized by acquiring the HeapLock. This happens in mem_allocate |
81 // and allocate_new_tlab, which are the "entry" points to the | |
82 // allocation code from the rest of the JVM. (Note that this does not | |
83 // apply to TLAB allocation, which is not part of this interface: it | |
84 // is done by clients of this interface.) | |
342 | 85 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
86 // Notes on implementation of parallelism in different tasks. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
87 // |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
88 // G1ParVerifyTask uses heap_region_par_iterate_chunked() for parallelism. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
89 // The number of GC workers is passed to heap_region_par_iterate_chunked(). |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
90 // It does use run_task() which sets _n_workers in the task. |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
91 // G1ParTask executes g1_process_roots() -> |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
92 // SharedHeap::process_roots() which calls eventually to |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
93 // CardTableModRefBS::par_non_clean_card_iterate_work() which uses |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
94 // SequentialSubTasksDone. SharedHeap::process_roots() also |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
95 // directly uses SubTasksDone (_process_strong_tasks field in SharedHeap). |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
96 // |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
97 |
342 | 98 // Local to this file. |
99 | |
100 class RefineCardTableEntryClosure: public CardTableEntryClosure { | |
101 bool _concurrent; | |
102 public: | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
103 RefineCardTableEntryClosure() : _concurrent(true) { } |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
104 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
105 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
|
106 bool oops_into_cset = G1CollectedHeap::heap()->g1_rem_set()->refine_card(card_ptr, worker_i, false); |
1705 | 107 // This path is executed by the concurrent refine or mutator threads, |
108 // concurrently, and so we do not care if card_ptr contains references | |
109 // that point into the collection set. | |
110 assert(!oops_into_cset, "should be"); | |
111 | |
20192 | 112 if (_concurrent && SuspendibleThreadSet::should_yield()) { |
342 | 113 // Caller will actually yield. |
114 return false; | |
115 } | |
116 // Otherwise, we finished successfully; return true. | |
117 return true; | |
118 } | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
119 |
342 | 120 void set_concurrent(bool b) { _concurrent = b; } |
121 }; | |
122 | |
123 | |
124 class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure { | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
125 size_t _num_processed; |
342 | 126 CardTableModRefBS* _ctbs; |
127 int _histo[256]; | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
128 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
129 public: |
342 | 130 ClearLoggedCardTableEntryClosure() : |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
131 _num_processed(0), _ctbs(G1CollectedHeap::heap()->g1_barrier_set()) |
342 | 132 { |
133 for (int i = 0; i < 256; i++) _histo[i] = 0; | |
134 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
135 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
136 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
|
137 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
|
138 int ind = (int)(*ujb); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
139 _histo[ind]++; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
140 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
141 *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
|
142 _num_processed++; |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
143 |
342 | 144 return true; |
145 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
146 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
147 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
|
148 |
342 | 149 void print_histo() { |
150 gclog_or_tty->print_cr("Card table value histogram:"); | |
151 for (int i = 0; i < 256; i++) { | |
152 if (_histo[i] != 0) { | |
153 gclog_or_tty->print_cr(" %d: %d", i, _histo[i]); | |
154 } | |
155 } | |
156 } | |
157 }; | |
158 | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
159 class RedirtyLoggedCardTableEntryClosure : public CardTableEntryClosure { |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
160 private: |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
161 size_t _num_processed; |
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 public: |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
164 RedirtyLoggedCardTableEntryClosure() : CardTableEntryClosure(), _num_processed(0) { } |
12343 | 165 |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
166 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
|
167 *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
|
168 _num_processed++; |
342 | 169 return true; |
170 } | |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
171 |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
172 size_t num_processed() const { return _num_processed; } |
342 | 173 }; |
174 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
175 YoungList::YoungList(G1CollectedHeap* g1h) : |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
176 _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
|
177 _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
|
178 guarantee(check_list_empty(false), "just making sure..."); |
342 | 179 } |
180 | |
181 void YoungList::push_region(HeapRegion *hr) { | |
182 assert(!hr->is_young(), "should not already be young"); | |
183 assert(hr->get_next_young_region() == NULL, "cause it should!"); | |
184 | |
185 hr->set_next_young_region(_head); | |
186 _head = hr; | |
187 | |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
188 _g1h->g1_policy()->set_region_eden(hr, (int) _length); |
342 | 189 ++_length; |
190 } | |
191 | |
192 void YoungList::add_survivor_region(HeapRegion* hr) { | |
545 | 193 assert(hr->is_survivor(), "should be flagged as survivor region"); |
342 | 194 assert(hr->get_next_young_region() == NULL, "cause it should!"); |
195 | |
196 hr->set_next_young_region(_survivor_head); | |
197 if (_survivor_head == NULL) { | |
545 | 198 _survivor_tail = hr; |
342 | 199 } |
200 _survivor_head = hr; | |
201 ++_survivor_length; | |
202 } | |
203 | |
204 void YoungList::empty_list(HeapRegion* list) { | |
205 while (list != NULL) { | |
206 HeapRegion* next = list->get_next_young_region(); | |
207 list->set_next_young_region(NULL); | |
208 list->uninstall_surv_rate_group(); | |
209 list->set_not_young(); | |
210 list = next; | |
211 } | |
212 } | |
213 | |
214 void YoungList::empty_list() { | |
215 assert(check_list_well_formed(), "young list should be well formed"); | |
216 | |
217 empty_list(_head); | |
218 _head = NULL; | |
219 _length = 0; | |
220 | |
221 empty_list(_survivor_head); | |
222 _survivor_head = NULL; | |
545 | 223 _survivor_tail = NULL; |
342 | 224 _survivor_length = 0; |
225 | |
226 _last_sampled_rs_lengths = 0; | |
227 | |
228 assert(check_list_empty(false), "just making sure..."); | |
229 } | |
230 | |
231 bool YoungList::check_list_well_formed() { | |
232 bool ret = true; | |
233 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
234 uint length = 0; |
342 | 235 HeapRegion* curr = _head; |
236 HeapRegion* last = NULL; | |
237 while (curr != NULL) { | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
238 if (!curr->is_young()) { |
342 | 239 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
|
240 "incorrectly tagged (y: %d, surv: %d)", |
342 | 241 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
|
242 curr->is_young(), curr->is_survivor()); |
342 | 243 ret = false; |
244 } | |
245 ++length; | |
246 last = curr; | |
247 curr = curr->get_next_young_region(); | |
248 } | |
249 ret = ret && (length == _length); | |
250 | |
251 if (!ret) { | |
252 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
|
253 gclog_or_tty->print_cr("### list has %u entries, _length is %u", |
342 | 254 length, _length); |
255 } | |
256 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
257 return ret; |
342 | 258 } |
259 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
260 bool YoungList::check_list_empty(bool check_sample) { |
342 | 261 bool ret = true; |
262 | |
263 if (_length != 0) { | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
264 gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u", |
342 | 265 _length); |
266 ret = false; | |
267 } | |
268 if (check_sample && _last_sampled_rs_lengths != 0) { | |
269 gclog_or_tty->print_cr("### YOUNG LIST has non-zero last sampled RS lengths"); | |
270 ret = false; | |
271 } | |
272 if (_head != NULL) { | |
273 gclog_or_tty->print_cr("### YOUNG LIST does not have a NULL head"); | |
274 ret = false; | |
275 } | |
276 if (!ret) { | |
277 gclog_or_tty->print_cr("### YOUNG LIST does not seem empty"); | |
278 } | |
279 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
280 return ret; |
342 | 281 } |
282 | |
283 void | |
284 YoungList::rs_length_sampling_init() { | |
285 _sampled_rs_lengths = 0; | |
286 _curr = _head; | |
287 } | |
288 | |
289 bool | |
290 YoungList::rs_length_sampling_more() { | |
291 return _curr != NULL; | |
292 } | |
293 | |
294 void | |
295 YoungList::rs_length_sampling_next() { | |
296 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
|
297 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
|
298 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
299 _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
|
300 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
301 // 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
|
302 // 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
|
303 // 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
|
304 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
|
305 // 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
|
306 _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
|
307 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
308 |
342 | 309 _curr = _curr->get_next_young_region(); |
310 if (_curr == NULL) { | |
311 _last_sampled_rs_lengths = _sampled_rs_lengths; | |
312 // gclog_or_tty->print_cr("last sampled RS lengths = %d", _last_sampled_rs_lengths); | |
313 } | |
314 } | |
315 | |
316 void | |
317 YoungList::reset_auxilary_lists() { | |
318 guarantee( is_empty(), "young list should be empty" ); | |
319 assert(check_list_well_formed(), "young list should be well formed"); | |
320 | |
321 // Add survivor regions to SurvRateGroup. | |
322 _g1h->g1_policy()->note_start_adding_survivor_regions(); | |
545 | 323 _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
|
324 |
4090
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
325 int young_index_in_cset = 0; |
342 | 326 for (HeapRegion* curr = _survivor_head; |
327 curr != NULL; | |
328 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
|
329 _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
|
330 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
331 // 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
|
332 // 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
|
333 // pause. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
334 _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
|
335 young_index_in_cset += 1; |
a88de71c4e3a
7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents:
4073
diff
changeset
|
336 } |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
337 assert((uint) young_index_in_cset == _survivor_length, "post-condition"); |
342 | 338 _g1h->g1_policy()->note_stop_adding_survivor_regions(); |
339 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
340 _head = _survivor_head; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
341 _length = _survivor_length; |
342 | 342 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
|
343 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
|
344 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
|
345 _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
|
346 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
347 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
348 // 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
|
349 // 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
|
350 // 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
|
351 // 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
|
352 |
545 | 353 _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */); |
342 | 354 |
355 assert(check_list_well_formed(), "young list should be well formed"); | |
356 } | |
357 | |
358 void YoungList::print() { | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
359 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
|
360 const char* names[] = {"YOUNG", "SURVIVOR"}; |
342 | 361 |
362 for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) { | |
363 gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]); | |
364 HeapRegion *curr = lists[list]; | |
365 if (curr == NULL) | |
366 gclog_or_tty->print_cr(" empty"); | |
367 while (curr != NULL) { | |
6027
8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents:
6011
diff
changeset
|
368 gclog_or_tty->print_cr(" "HR_FORMAT", P: "PTR_FORMAT "N: "PTR_FORMAT", age: %4d", |
8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents:
6011
diff
changeset
|
369 HR_FORMAT_PARAMS(curr), |
342 | 370 curr->prev_top_at_mark_start(), |
371 curr->next_top_at_mark_start(), | |
6027
8a2e5a6a19a4
7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents:
6011
diff
changeset
|
372 curr->age_in_surv_rate_group_cond()); |
342 | 373 curr = curr->get_next_young_region(); |
374 } | |
375 } | |
376 | |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
377 gclog_or_tty->cr(); |
342 | 378 } |
379 | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
380 void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
381 { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
382 // 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
|
383 // by installing a self pointer. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
384 HeapRegion* next = hr->get_next_dirty_cards_region(); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
385 if (next == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
386 HeapRegion* res = (HeapRegion*) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
387 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
|
388 NULL); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
389 if (res == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
390 HeapRegion* head; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
391 do { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
392 // Put the region to the dirty cards region list. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
393 head = _dirty_cards_region_list; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
394 next = (HeapRegion*) |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
395 Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
396 if (next == head) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
397 assert(hr->get_next_dirty_cards_region() == hr, |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
398 "hr->get_next_dirty_cards_region() != hr"); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
399 if (next == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
400 // The last region in the list points to itself. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
401 hr->set_next_dirty_cards_region(hr); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
402 } else { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
403 hr->set_next_dirty_cards_region(next); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
404 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
405 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
406 } while (next != head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
407 } |
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 |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
411 HeapRegion* G1CollectedHeap::pop_dirty_cards_region() |
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 HeapRegion* head; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
414 HeapRegion* hr; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
415 do { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
416 head = _dirty_cards_region_list; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
417 if (head == NULL) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
418 return NULL; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
419 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
420 HeapRegion* new_head = head->get_next_dirty_cards_region(); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
421 if (head == new_head) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
422 // The last region. |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
423 new_head = NULL; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
424 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
425 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
|
426 head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
427 } while (hr != head); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
428 assert(hr != NULL, "invariant"); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
429 hr->set_next_dirty_cards_region(NULL); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
430 return hr; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
431 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
432 |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
433 #ifdef ASSERT |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
434 // 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
|
435 // 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
|
436 // 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
|
437 // 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
|
438 // regions have been retired. It is used for debugging |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
439 // 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
|
440 // 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
|
441 // inaccurate, it is sufficient for G1 because the conservative |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
442 // implementation of is_scavengable() for G1 will indicate that |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
443 // all nmethods must be scanned during a partial collection. |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
444 bool G1CollectedHeap::is_in_partial_collection(const void* p) { |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
445 HeapRegion* hr = heap_region_containing(p); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
446 return hr != NULL && hr->in_collection_set(); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
447 } |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
448 #endif |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
449 |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
450 // Returns true if the reference points to an object that |
10405 | 451 // can move in an incremental collection. |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
452 bool G1CollectedHeap::is_scavengable(const void* p) { |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
453 G1CollectedHeap* g1h = G1CollectedHeap::heap(); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
454 G1CollectorPolicy* g1p = g1h->g1_policy(); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
455 HeapRegion* hr = heap_region_containing(p); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
456 if (hr == NULL) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
457 // null |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
458 assert(p == NULL, err_msg("Not NULL " PTR_FORMAT ,p)); |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
459 return false; |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
460 } else { |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
461 return !hr->isHumongous(); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
462 } |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
463 } |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
3356
diff
changeset
|
464 |
342 | 465 void G1CollectedHeap::check_ct_logs_at_safepoint() { |
466 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); | |
12343 | 467 CardTableModRefBS* ct_bs = g1_barrier_set(); |
342 | 468 |
469 // Count the dirty cards at the start. | |
470 CountNonCleanMemRegionClosure count1(this); | |
471 ct_bs->mod_card_iterate(&count1); | |
472 int orig_count = count1.n(); | |
473 | |
474 // First clear the logged cards. | |
475 ClearLoggedCardTableEntryClosure clear; | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
476 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
|
477 dcqs.iterate_closure_all_threads(&clear, false); |
342 | 478 clear.print_histo(); |
479 | |
480 // Now ensure that there's no dirty cards. | |
481 CountNonCleanMemRegionClosure count2(this); | |
482 ct_bs->mod_card_iterate(&count2); | |
483 if (count2.n() != 0) { | |
484 gclog_or_tty->print_cr("Card table has %d entries; %d originally", | |
485 count2.n(), orig_count); | |
486 } | |
487 guarantee(count2.n() == 0, "Card table should be clean."); | |
488 | |
489 RedirtyLoggedCardTableEntryClosure redirty; | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
490 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
|
491 dcqs.iterate_closure_all_threads(&redirty, false); |
342 | 492 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
|
493 clear.num_processed(), orig_count); |
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
494 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
|
495 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
|
496 redirty.num_processed(), clear.num_processed())); |
342 | 497 |
498 CountNonCleanMemRegionClosure count3(this); | |
499 ct_bs->mod_card_iterate(&count3); | |
500 if (count3.n() != orig_count) { | |
501 gclog_or_tty->print_cr("Should have restored them all: orig = %d, final = %d.", | |
502 orig_count, count3.n()); | |
503 guarantee(count3.n() >= orig_count, "Should have restored them all."); | |
504 } | |
505 } | |
506 | |
507 // Private class members. | |
508 | |
509 G1CollectedHeap* G1CollectedHeap::_g1h; | |
510 | |
511 // Private methods. | |
512 | |
2152 | 513 HeapRegion* |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
514 G1CollectedHeap::new_region_try_secondary_free_list(bool is_old) { |
2152 | 515 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); |
516 while (!_secondary_free_list.is_empty() || free_regions_coming()) { | |
517 if (!_secondary_free_list.is_empty()) { | |
518 if (G1ConcRegionFreeingVerbose) { | |
519 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
|
520 "secondary_free_list has %u entries", |
2152 | 521 _secondary_free_list.length()); |
522 } | |
523 // It looks as if there are free regions available on the | |
524 // secondary_free_list. Let's move them to the free_list and try | |
525 // again to allocate from it. | |
526 append_secondary_free_list(); | |
527 | |
528 assert(!_free_list.is_empty(), "if the secondary_free_list was not " | |
529 "empty we should have moved at least one entry to the free_list"); | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
530 HeapRegion* res = _free_list.remove_region(is_old); |
2152 | 531 if (G1ConcRegionFreeingVerbose) { |
532 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
533 "allocated "HR_FORMAT" from secondary_free_list", | |
534 HR_FORMAT_PARAMS(res)); | |
535 } | |
536 return res; | |
537 } | |
538 | |
10405 | 539 // Wait here until we get notified either when (a) there are no |
2152 | 540 // more free regions coming or (b) some regions have been moved on |
541 // the secondary_free_list. | |
542 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag); | |
543 } | |
544 | |
545 if (G1ConcRegionFreeingVerbose) { | |
546 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
547 "could not allocate from secondary_free_list"); | |
548 } | |
549 return NULL; | |
550 } | |
551 | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
552 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
|
553 assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords, |
2152 | 554 "the only time we use this to allocate a humongous region is " |
555 "when we are allocating a single humongous region"); | |
556 | |
557 HeapRegion* res; | |
558 if (G1StressConcRegionFreeing) { | |
559 if (!_secondary_free_list.is_empty()) { | |
560 if (G1ConcRegionFreeingVerbose) { | |
561 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
562 "forced to look at the secondary_free_list"); | |
563 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
564 res = new_region_try_secondary_free_list(is_old); |
2152 | 565 if (res != NULL) { |
566 return res; | |
567 } | |
568 } | |
569 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
570 |
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
571 res = _free_list.remove_region(is_old); |
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
572 |
2152 | 573 if (res == NULL) { |
574 if (G1ConcRegionFreeingVerbose) { | |
575 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " | |
576 "res == NULL, trying the secondary_free_list"); | |
577 } | |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
578 res = new_region_try_secondary_free_list(is_old); |
2152 | 579 } |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
580 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
|
581 // 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
|
582 // 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
|
583 // 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
|
584 // 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
|
585 assert(SafepointSynchronize::is_at_safepoint(), "invariant"); |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
586 |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
587 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
588 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
589 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
|
590 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
591 word_size * HeapWordSize); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
592 if (expand(word_size * HeapWordSize)) { |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
593 // 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
|
594 // 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
|
595 // region size, the free list should in theory not be empty. |
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
596 // In either case remove_region() will check for NULL. |
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
597 res = _free_list.remove_region(is_old); |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
598 } else { |
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
599 _expand_heap_after_alloc_failure = false; |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
600 } |
342 | 601 } |
602 return res; | |
603 } | |
604 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
605 uint G1CollectedHeap::humongous_obj_allocate_find_first(uint num_regions, |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
606 size_t word_size) { |
2361 | 607 assert(isHumongous(word_size), "word_size should be humongous"); |
608 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition"); | |
609 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
610 uint first = G1_NULL_HRS_INDEX; |
2152 | 611 if (num_regions == 1) { |
612 // Only one region to allocate, no need to go through the slower | |
10405 | 613 // path. The caller will attempt the expansion if this fails, so |
2152 | 614 // let's not try to expand here too. |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
615 HeapRegion* hr = new_region(word_size, true /* is_old */, false /* do_expand */); |
2152 | 616 if (hr != NULL) { |
617 first = hr->hrs_index(); | |
618 } else { | |
3766 | 619 first = G1_NULL_HRS_INDEX; |
2152 | 620 } |
621 } else { | |
622 // We can't allocate humongous regions while cleanupComplete() is | |
623 // running, since some of the regions we find to be empty might not | |
624 // yet be added to the free list and it is not straightforward to | |
625 // know which list they are on so that we can remove them. Note | |
626 // that we only need to do this if we need to allocate more than | |
627 // one region to satisfy the current humongous allocation | |
628 // request. If we are only allocating one region we use the common | |
629 // region allocation code (see above). | |
630 wait_while_free_regions_coming(); | |
2361 | 631 append_secondary_free_list_if_not_empty_with_lock(); |
2152 | 632 |
633 if (free_regions() >= num_regions) { | |
3766 | 634 first = _hrs.find_contiguous(num_regions); |
635 if (first != G1_NULL_HRS_INDEX) { | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
636 for (uint i = first; i < first + num_regions; ++i) { |
3766 | 637 HeapRegion* hr = region_at(i); |
2152 | 638 assert(hr->is_empty(), "sanity"); |
2361 | 639 assert(is_on_master_free_list(hr), "sanity"); |
2152 | 640 hr->set_pending_removal(true); |
641 } | |
642 _free_list.remove_all_pending(num_regions); | |
643 } | |
644 } | |
645 } | |
646 return first; | |
647 } | |
648 | |
2361 | 649 HeapWord* |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
650 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
|
651 uint num_regions, |
2361 | 652 size_t word_size) { |
3766 | 653 assert(first != G1_NULL_HRS_INDEX, "pre-condition"); |
2361 | 654 assert(isHumongous(word_size), "word_size should be humongous"); |
655 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition"); | |
656 | |
657 // 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
|
658 uint last = first + num_regions; |
2361 | 659 |
660 // We need to initialize the region(s) we just discovered. This is | |
661 // a bit tricky given that it can happen concurrently with | |
662 // refinement threads refining cards on these regions and | |
663 // potentially wanting to refine the BOT as they are scanning | |
664 // those cards (this can happen shortly after a cleanup; see CR | |
665 // 6991377). So we have to set up the region(s) carefully and in | |
666 // a specific order. | |
667 | |
668 // 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
|
669 size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords; |
2361 | 670 assert(word_size <= word_size_sum, "sanity"); |
671 | |
672 // This will be the "starts humongous" region. | |
3766 | 673 HeapRegion* first_hr = region_at(first); |
2361 | 674 // The header of the new object will be placed at the bottom of |
675 // the first region. | |
676 HeapWord* new_obj = first_hr->bottom(); | |
677 // This will be the new end of the first region in the series that | |
10405 | 678 // should also match the end of the last region in the series. |
2361 | 679 HeapWord* new_end = new_obj + word_size_sum; |
680 // This will be the new top of the first region that will reflect | |
681 // this allocation. | |
682 HeapWord* new_top = new_obj + word_size; | |
683 | |
684 // First, we need to zero the header of the space that we will be | |
685 // allocating. When we update top further down, some refinement | |
686 // threads might try to scan the region. By zeroing the header we | |
687 // ensure that any thread that will try to scan the region will | |
688 // come across the zero klass word and bail out. | |
689 // | |
690 // NOTE: It would not have been correct to have used | |
691 // CollectedHeap::fill_with_object() and make the space look like | |
692 // an int array. The thread that is doing the allocation will | |
693 // later update the object header to a potentially different array | |
694 // type and, for a very short period of time, the klass and length | |
695 // fields will be inconsistent. This could cause a refinement | |
696 // thread to calculate the object size incorrectly. | |
697 Copy::fill_to_words(new_obj, oopDesc::header_size(), 0); | |
698 | |
699 // We will set up the first region as "starts humongous". This | |
700 // will also update the BOT covering all the regions to reflect | |
701 // that there is a single object that starts at the bottom of the | |
702 // first region. | |
703 first_hr->set_startsHumongous(new_top, new_end); | |
704 | |
705 // Then, if there are any, we will set up the "continues | |
706 // humongous" regions. | |
707 HeapRegion* hr = NULL; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
708 for (uint i = first + 1; i < last; ++i) { |
3766 | 709 hr = region_at(i); |
2361 | 710 hr->set_continuesHumongous(first_hr); |
711 } | |
712 // If we have "continues humongous" regions (hr != NULL), then the | |
713 // end of the last one should match new_end. | |
714 assert(hr == NULL || hr->end() == new_end, "sanity"); | |
715 | |
716 // Up to this point no concurrent thread would have been able to | |
717 // do any scanning on any region in this series. All the top | |
718 // fields still point to bottom, so the intersection between | |
719 // [bottom,top] and [card_start,card_end] will be empty. Before we | |
720 // update the top fields, we'll do a storestore to make sure that | |
721 // no thread sees the update to top before the zeroing of the | |
722 // object header and the BOT initialization. | |
723 OrderAccess::storestore(); | |
724 | |
725 // Now that the BOT and the object header have been initialized, | |
726 // we can update top of the "starts humongous" region. | |
727 assert(first_hr->bottom() < new_top && new_top <= first_hr->end(), | |
728 "new_top should be in this region"); | |
729 first_hr->set_top(new_top); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
730 if (_hr_printer.is_active()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
731 HeapWord* bottom = first_hr->bottom(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
732 HeapWord* end = first_hr->orig_end(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
733 if ((first + 1) == last) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
734 // the series has a single humongous region |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
735 _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
736 } else { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
737 // the series has more than one humongous regions |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
738 _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
739 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
740 } |
2361 | 741 |
742 // Now, we will update the top fields of the "continues humongous" | |
743 // regions. The reason we need to do this is that, otherwise, | |
744 // these regions would look empty and this will confuse parts of | |
745 // G1. For example, the code that looks for a consecutive number | |
746 // of empty regions will consider them empty and try to | |
747 // re-allocate them. We can extend is_empty() to also include | |
748 // !continuesHumongous(), but it is easier to just update the top | |
749 // fields here. The way we set top for all regions (i.e., top == | |
750 // end for all regions but the last one, top == new_top for the | |
751 // last one) is actually used when we will free up the humongous | |
752 // region in free_humongous_region(). | |
753 hr = NULL; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
754 for (uint i = first + 1; i < last; ++i) { |
3766 | 755 hr = region_at(i); |
2361 | 756 if ((i + 1) == last) { |
757 // last continues humongous region | |
758 assert(hr->bottom() < new_top && new_top <= hr->end(), | |
759 "new_top should fall on this region"); | |
760 hr->set_top(new_top); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
761 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top); |
2361 | 762 } else { |
763 // not last one | |
764 assert(new_top > hr->end(), "new_top should be above this region"); | |
765 hr->set_top(hr->end()); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
766 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end()); |
2361 | 767 } |
768 } | |
769 // If we have continues humongous regions (hr != NULL), then the | |
770 // end of the last one should match new_end and its top should | |
771 // match new_top. | |
772 assert(hr == NULL || | |
773 (hr->end() == new_end && hr->top() == new_top), "sanity"); | |
774 | |
775 assert(first_hr->used() == word_size * HeapWordSize, "invariant"); | |
776 _summary_bytes_used += first_hr->used(); | |
777 _humongous_set.add(first_hr); | |
778 | |
779 return new_obj; | |
780 } | |
781 | |
342 | 782 // If could fit into free regions w/o expansion, try. |
783 // Otherwise, if can expand, do so. | |
784 // Otherwise, if using ex regions might help, try with ex given back. | |
1973 | 785 HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) { |
2152 | 786 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); |
787 | |
788 verify_region_sets_optional(); | |
342 | 789 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
790 size_t word_size_rounded = round_to(word_size, HeapRegion::GrainWords); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
791 uint num_regions = (uint) (word_size_rounded / HeapRegion::GrainWords); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
792 uint x_num = expansion_regions(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
793 uint fs = _hrs.free_suffix(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
794 uint first = humongous_obj_allocate_find_first(num_regions, word_size); |
3766 | 795 if (first == G1_NULL_HRS_INDEX) { |
2152 | 796 // The only thing we can do now is attempt expansion. |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
797 if (fs + x_num >= num_regions) { |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
798 // If the number of regions we're trying to allocate for this |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
799 // object is at most the number of regions in the free suffix, |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
800 // then the call to humongous_obj_allocate_find_first() above |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
801 // should have succeeded and we wouldn't be here. |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
802 // |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
803 // We should only be trying to expand when the free suffix is |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
804 // not sufficient for the object _and_ we have some expansion |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
805 // room available. |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
806 assert(num_regions > fs, "earlier allocation should have succeeded"); |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
807 |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
808 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
809 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
810 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
|
811 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
812 word_size * HeapWordSize); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
813 if (expand((num_regions - fs) * HeapRegion::GrainBytes)) { |
3766 | 814 // Even though the heap was expanded, it might not have |
815 // reached the desired size. So, we cannot assume that the | |
816 // allocation will succeed. | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
817 first = humongous_obj_allocate_find_first(num_regions, word_size); |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
818 } |
2152 | 819 } |
820 } | |
821 | |
2361 | 822 HeapWord* result = NULL; |
3766 | 823 if (first != G1_NULL_HRS_INDEX) { |
2361 | 824 result = |
825 humongous_obj_allocate_initialize_regions(first, num_regions, word_size); | |
826 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
|
827 |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
828 // A successful humongous object allocation changes the used space |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
829 // 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
|
830 // sizes and update the jstat counters here. |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
831 g1mm()->update_sizes(); |
2152 | 832 } |
833 | |
834 verify_region_sets_optional(); | |
2361 | 835 |
836 return result; | |
342 | 837 } |
838 | |
1973 | 839 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) { |
840 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
|
841 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
|
842 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
843 unsigned int dummy_gc_count_before; |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
844 int dummy_gclocker_retry_count = 0; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
845 return attempt_allocation(word_size, &dummy_gc_count_before, &dummy_gclocker_retry_count); |
342 | 846 } |
847 | |
848 HeapWord* | |
849 G1CollectedHeap::mem_allocate(size_t word_size, | |
1973 | 850 bool* gc_overhead_limit_was_exceeded) { |
851 assert_heap_not_locked_and_not_at_safepoint(); | |
342 | 852 |
10405 | 853 // Loop until the allocation is satisfied, or unsatisfied after GC. |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
854 for (int try_count = 1, gclocker_retry_count = 0; /* we'll return */; try_count += 1) { |
1973 | 855 unsigned int gc_count_before; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
856 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
857 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
858 if (!isHumongous(word_size)) { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
859 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
|
860 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
861 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
|
862 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
863 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
864 return result; |
342 | 865 } |
866 | |
867 // Create the garbage collection operation... | |
1973 | 868 VM_G1CollectForAllocation op(gc_count_before, word_size); |
342 | 869 // ...and get the VM thread to execute it. |
870 VMThread::execute(&op); | |
1973 | 871 |
872 if (op.prologue_succeeded() && op.pause_succeeded()) { | |
873 // If the operation was successful we'll return the result even | |
874 // if it is NULL. If the allocation attempt failed immediately | |
875 // after a Full GC, it's unlikely we'll be able to allocate now. | |
876 HeapWord* result = op.result(); | |
877 if (result != NULL && !isHumongous(word_size)) { | |
878 // Allocations that take place on VM operations do not do any | |
879 // card dirtying and we have to do it here. We only have to do | |
880 // this for non-humongous allocations, though. | |
881 dirty_young_block(result, word_size); | |
882 } | |
342 | 883 return result; |
1973 | 884 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
885 if (gclocker_retry_count > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
886 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
887 } |
1973 | 888 assert(op.result() == NULL, |
889 "the result should be NULL if the VM op did not succeed"); | |
342 | 890 } |
891 | |
892 // Give a warning if we seem to be looping forever. | |
893 if ((QueuedAllocationWarningCount > 0) && | |
894 (try_count % QueuedAllocationWarningCount == 0)) { | |
1973 | 895 warning("G1CollectedHeap::mem_allocate retries %d times", try_count); |
342 | 896 } |
897 } | |
1973 | 898 |
899 ShouldNotReachHere(); | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
900 return NULL; |
342 | 901 } |
902 | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
903 HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size, |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
904 unsigned int *gc_count_before_ret, |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
905 int* gclocker_retry_count_ret) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
906 // 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
|
907 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
908 assert_heap_not_locked_and_not_at_safepoint(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
909 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
|
910 "be called for humongous allocation requests"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
911 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
912 // 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
|
913 // (attempt_allocation()) failed to allocate. |
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 // 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
|
916 // 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
|
917 // 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
|
918 // return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
919 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
920 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
|
921 bool should_try_gc; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
922 unsigned int gc_count_before; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
923 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
924 { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
925 MutexLockerEx x(Heap_lock); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
926 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
927 result = _mutator_alloc_region.attempt_allocation_locked(word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
928 false /* bot_updates */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
929 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
930 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
931 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
932 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
933 // 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
|
934 // allocate a new region. So the mutator alloc region should be NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
935 assert(_mutator_alloc_region.get() == NULL, "only way to get here"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
936 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
937 if (GC_locker::is_active_and_needs_gc()) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
938 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
|
939 // 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
|
940 // can_expand_young_list() does this when it returns true. |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
941 result = _mutator_alloc_region.attempt_allocation_force(word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
942 false /* bot_updates */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
943 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
944 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
945 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
946 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
947 should_try_gc = false; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
948 } else { |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
949 // 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
|
950 // 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
|
951 // 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
|
952 // 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
|
953 // 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
|
954 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
|
955 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
|
956 } else { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
957 // 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
|
958 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
|
959 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
|
960 } |
2433
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 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
963 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
964 if (should_try_gc) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
965 bool succeeded; |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
966 result = do_collection_pause(word_size, gc_count_before, &succeeded, |
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
967 GCCause::_g1_inc_collection_pause); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
968 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
969 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
|
970 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
971 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
972 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
973 if (succeeded) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
974 // 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
|
975 // 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
|
976 // further. We'll just return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
977 MutexLockerEx x(Heap_lock); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
978 *gc_count_before_ret = total_collections(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
979 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
980 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
981 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
982 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
983 MutexLockerEx x(Heap_lock); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
984 *gc_count_before_ret = total_collections(); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
985 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
986 } |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
987 // 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
|
988 // 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
|
989 // then retry the allocation. |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
990 GC_locker::stall_until_clear(); |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
991 (*gclocker_retry_count_ret) += 1; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
992 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
993 |
10405 | 994 // 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
|
995 // 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
|
996 // 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
|
997 // allocation attempt in case another thread successfully |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
998 // 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
|
999 // 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
|
1000 // 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
|
1001 // iteration (after taking the Heap_lock). |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1002 result = _mutator_alloc_region.attempt_allocation(word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1003 false /* bot_updates */); |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
1004 if (result != NULL) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1005 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1006 } |
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 // 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
|
1009 if ((QueuedAllocationWarningCount > 0) && |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1010 (try_count % QueuedAllocationWarningCount == 0)) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1011 warning("G1CollectedHeap::attempt_allocation_slow() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1012 "retries %d times", try_count); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1013 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1014 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1015 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1016 ShouldNotReachHere(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1017 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1018 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1019 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1020 HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size, |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1021 unsigned int * gc_count_before_ret, |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1022 int* gclocker_retry_count_ret) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1023 // 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
|
1024 // 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
|
1025 // 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
|
1026 // 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
|
1027 // 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
|
1028 // 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
|
1029 // 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
|
1030 // 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
|
1031 // 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
|
1032 // much as possible. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1033 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1034 assert_heap_not_locked_and_not_at_safepoint(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1035 assert(isHumongous(word_size), "attempt_allocation_humongous() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1036 "should only be called for humongous allocations"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1037 |
4834
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1038 // 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
|
1039 // 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
|
1040 // 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
|
1041 // 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
|
1042 // 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
|
1043 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
|
1044 word_size)) { |
4834
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1045 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
|
1046 } |
6a78aa6ac1ff
7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents:
4833
diff
changeset
|
1047 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1048 // 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
|
1049 // 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
|
1050 // 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
|
1051 // return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1052 HeapWord* result = NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1053 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
|
1054 bool should_try_gc; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1055 unsigned int gc_count_before; |
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 { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1058 MutexLockerEx x(Heap_lock); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1059 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1060 // 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
|
1061 // 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
|
1062 // collection hoping that there's enough space in the heap. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1063 result = humongous_obj_allocate(word_size); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1064 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1065 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1066 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1067 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1068 if (GC_locker::is_active_and_needs_gc()) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1069 should_try_gc = false; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1070 } else { |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1071 // 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
|
1072 // 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
|
1073 // 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
|
1074 // 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
|
1075 // 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
|
1076 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
|
1077 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
|
1078 } else { |
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1079 // 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
|
1080 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
|
1081 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
|
1082 } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1083 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1084 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1085 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1086 if (should_try_gc) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1087 // 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
|
1088 // 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
|
1089 // 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
|
1090 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1091 bool succeeded; |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
1092 result = do_collection_pause(word_size, gc_count_before, &succeeded, |
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
1093 GCCause::_g1_humongous_allocation); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1094 if (result != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1095 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
|
1096 return result; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1097 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1098 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1099 if (succeeded) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1100 // 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
|
1101 // 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
|
1102 // further. We'll just return NULL. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1103 MutexLockerEx x(Heap_lock); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
1104 *gc_count_before_ret = total_collections(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1105 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1106 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1107 } else { |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1108 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) { |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1109 MutexLockerEx x(Heap_lock); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1110 *gc_count_before_ret = total_collections(); |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1111 return NULL; |
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1112 } |
6106
1d478c993020
7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents:
6064
diff
changeset
|
1113 // 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
|
1114 // 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
|
1115 // then retry the allocation. |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1116 GC_locker::stall_until_clear(); |
8853
2e093b564241
7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents:
8038
diff
changeset
|
1117 (*gclocker_retry_count_ret) += 1; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1118 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1119 |
10405 | 1120 // 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
|
1121 // 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
|
1122 // 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
|
1123 // allocation attempt in case another thread successfully |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1124 // 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
|
1125 // warning if we seem to be looping forever. |
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 if ((QueuedAllocationWarningCount > 0) && |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1128 (try_count % QueuedAllocationWarningCount == 0)) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1129 warning("G1CollectedHeap::attempt_allocation_humongous() " |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1130 "retries %d times", try_count); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1131 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1132 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1133 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1134 ShouldNotReachHere(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1135 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1136 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1137 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1138 HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1139 bool expect_null_mutator_alloc_region) { |
2152 | 1140 assert_at_safepoint(true /* should_be_vm_thread */); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1141 assert(_mutator_alloc_region.get() == NULL || |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1142 !expect_null_mutator_alloc_region, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1143 "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
|
1144 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1145 if (!isHumongous(word_size)) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1146 return _mutator_alloc_region.attempt_allocation_locked(word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1147 false /* bot_updates */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1148 } else { |
4829
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1149 HeapWord* result = humongous_obj_allocate(word_size); |
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1150 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
|
1151 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
|
1152 } |
9509c20bba28
6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents:
4787
diff
changeset
|
1153 return result; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1154 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1155 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1156 ShouldNotReachHere(); |
342 | 1157 } |
1158 | |
1159 class PostMCRemSetClearClosure: public HeapRegionClosure { | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1160 G1CollectedHeap* _g1h; |
342 | 1161 ModRefBarrierSet* _mr_bs; |
1162 public: | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1163 PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) : |
12080 | 1164 _g1h(g1h), _mr_bs(mr_bs) {} |
1165 | |
342 | 1166 bool doHeapRegion(HeapRegion* r) { |
12080 | 1167 HeapRegionRemSet* hrrs = r->rem_set(); |
1168 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1169 if (r->continuesHumongous()) { |
12080 | 1170 // We'll assert that the strong code root list and RSet is empty |
1171 assert(hrrs->strong_code_roots_list_length() == 0, "sanity"); | |
1172 assert(hrrs->occupied() == 0, "RSet should be empty"); | |
342 | 1173 return false; |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1174 } |
12080 | 1175 |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1176 _g1h->reset_gc_time_stamps(r); |
12080 | 1177 hrrs->clear(); |
342 | 1178 // You might think here that we could clear just the cards |
1179 // corresponding to the used region. But no: if we leave a dirty card | |
1180 // in a region we might allocate into, then it would prevent that card | |
1181 // from being enqueued, and cause it to be missed. | |
1182 // Re: the performance cost: we shouldn't be doing full GC anyway! | |
1183 _mr_bs->clear(MemRegion(r->bottom(), r->end())); | |
12080 | 1184 |
342 | 1185 return false; |
1186 } | |
1187 }; | |
1188 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1189 void G1CollectedHeap::clear_rsets_post_compaction() { |
12343 | 1190 PostMCRemSetClearClosure rs_clear(this, g1_barrier_set()); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1191 heap_region_iterate(&rs_clear); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1192 } |
342 | 1193 |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1194 class RebuildRSOutOfRegionClosure: public HeapRegionClosure { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1195 G1CollectedHeap* _g1h; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1196 UpdateRSOopClosure _cl; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1197 int _worker_i; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1198 public: |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1199 RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) : |
1861 | 1200 _cl(g1->g1_rem_set(), worker_i), |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1201 _worker_i(worker_i), |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1202 _g1h(g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1203 { } |
1960
878b57474103
6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents:
1883
diff
changeset
|
1204 |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1205 bool doHeapRegion(HeapRegion* r) { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1206 if (!r->continuesHumongous()) { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1207 _cl.set_from(r); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1208 r->oop_iterate(&_cl); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1209 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1210 return false; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1211 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1212 }; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1213 |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1214 class ParRebuildRSTask: public AbstractGangTask { |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1215 G1CollectedHeap* _g1; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1216 public: |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1217 ParRebuildRSTask(G1CollectedHeap* g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1218 : AbstractGangTask("ParRebuildRSTask"), |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1219 _g1(g1) |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1220 { } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1221 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1222 void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1223 RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id); |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
1224 _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
|
1225 _g1->workers()->active_workers(), |
626
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1226 HeapRegion::RebuildRSClaimValue); |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1227 } |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1228 }; |
87fa6e083d82
6760309: G1: update remembered sets during Full GCs
apetrusenko
parents:
620
diff
changeset
|
1229 |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1230 class PostCompactionPrinterClosure: public HeapRegionClosure { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1231 private: |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1232 G1HRPrinter* _hr_printer; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1233 public: |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1234 bool doHeapRegion(HeapRegion* hr) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1235 assert(!hr->is_young(), "not expecting to find young regions"); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1236 // We only generate output for non-empty regions. |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1237 if (!hr->is_empty()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1238 if (!hr->isHumongous()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1239 _hr_printer->post_compaction(hr, G1HRPrinter::Old); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1240 } else if (hr->startsHumongous()) { |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1241 if (hr->region_num() == 1) { |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1242 // single humongous region |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1243 _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1244 } else { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1245 _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1246 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1247 } else { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1248 assert(hr->continuesHumongous(), "only way to get here"); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1249 _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1250 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1251 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1252 return false; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1253 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1254 |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1255 PostCompactionPrinterClosure(G1HRPrinter* hr_printer) |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1256 : _hr_printer(hr_printer) { } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1257 }; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1258 |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1259 void G1CollectedHeap::print_hrs_post_compaction() { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1260 PostCompactionPrinterClosure cl(hr_printer()); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1261 heap_region_iterate(&cl); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1262 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
1263 |
1973 | 1264 bool G1CollectedHeap::do_collection(bool explicit_gc, |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
1265 bool clear_all_soft_refs, |
342 | 1266 size_t word_size) { |
2152 | 1267 assert_at_safepoint(true /* should_be_vm_thread */); |
1268 | |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1269 if (GC_locker::check_active_before_gc()) { |
1973 | 1270 return false; |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1271 } |
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
1272 |
10405 | 1273 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
|
1274 gc_timer->register_gc_start(); |
10405 | 1275 |
1276 SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer(); | |
1277 gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start()); | |
1278 | |
2125
7246a374a9f2
6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents:
2039
diff
changeset
|
1279 SvcGCMarker sgcm(SvcGCMarker::FULL); |
342 | 1280 ResourceMark rm; |
1281 | |
4872
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4787
diff
changeset
|
1282 print_heap_before_gc(); |
10405 | 1283 trace_heap_before_gc(gc_tracer); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
1284 |
17866
270d7cb38f40
8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents:
17844
diff
changeset
|
1285 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
|
1286 |
2152 | 1287 verify_region_sets_optional(); |
342 | 1288 |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1289 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
|
1290 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
|
1291 |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1292 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
|
1293 |
342 | 1294 { |
1295 IsGCActiveMark x; | |
1296 | |
1297 // Timing | |
6030 | 1298 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
|
1299 gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps); |
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1300 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); |
6030 | 1301 |
342 | 1302 { |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
1303 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
|
1304 TraceCollectorStats tcs(g1mm()->full_collection_counters()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1305 TraceMemoryManagerStats tms(true /* fullGC */, gc_cause()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1306 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1307 double start = os::elapsedTime(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1308 g1_policy()->record_full_collection_start(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1309 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1310 // 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
|
1311 // 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
|
1312 // 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
|
1313 // following two methods. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1314 wait_while_free_regions_coming(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1315 // 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
|
1316 // 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
|
1317 // 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
|
1318 // 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
|
1319 // early. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1320 _cm->root_regions()->abort(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1321 _cm->root_regions()->wait_until_scan_finished(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1322 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
|
1323 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1324 gc_prologue(true); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1325 increment_total_collections(true /* full gc */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1326 increment_old_marking_cycles_started(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1327 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1328 assert(used() == recalculate_used(), "Should be equal"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1329 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1330 verify_before_gc(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1331 |
10405 | 1332 pre_full_gc_dump(gc_timer); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1333 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1334 COMPILER2_PRESENT(DerivedPointerTable::clear()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1335 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1336 // Disable discovery and empty the discovered lists |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1337 // for the CM ref processor. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1338 ref_processor_cm()->disable_discovery(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1339 ref_processor_cm()->abandon_partial_discovery(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1340 ref_processor_cm()->verify_no_references_recorded(); |
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 // 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
|
1343 // 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
|
1344 // wait_until_scan_finished() below. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1345 concurrent_mark()->abort(); |
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 // Make sure we'll choose a new allocation region afterwards. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1348 release_mutator_alloc_region(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1349 abandon_gc_alloc_regions(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1350 g1_rem_set()->cleanupHRRS(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1351 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1352 // 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
|
1353 // 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
|
1354 // before the start GC event. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1355 _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
|
1356 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1357 // 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
|
1358 // 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
|
1359 // 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
|
1360 // after this full GC. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1361 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
|
1362 g1_policy()->clear_incremental_cset(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1363 g1_policy()->stop_incremental_cset_building(); |
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 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
|
1366 g1_policy()->set_gcs_are_young(true); |
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 // See the comments in g1CollectedHeap.hpp and |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1369 // G1CollectedHeap::ref_processing_init() about |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1370 // how reference processing currently works in G1. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1371 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1372 // 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
|
1373 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
|
1374 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1375 // 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
|
1376 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
|
1377 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1378 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
|
1379 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
|
1380 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1381 // Do collection work |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1382 { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1383 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
|
1384 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
|
1385 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1386 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1387 assert(free_regions() == 0, "we should not have added any free regions"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1388 rebuild_region_sets(false /* free_list_only */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1389 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1390 // Enqueue any discovered reference objects that have |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1391 // not been removed from the discovered lists. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1392 ref_processor_stw()->enqueue_discovered_references(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1393 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1394 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1395 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1396 MemoryService::track_memory_usage(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1397 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1398 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1399 ref_processor_stw()->verify_no_references_recorded(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1400 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1401 // 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
|
1402 ClassLoaderDataGraph::purge(); |
12080 | 1403 MetaspaceAux::verify_metrics(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1404 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1405 // 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
|
1406 // 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
|
1407 // 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
|
1408 // 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
|
1409 assert(!ref_processor_cm()->discovery_enabled(), "Postcondition"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1410 ref_processor_cm()->verify_no_references_recorded(); |
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 reset_gc_time_stamp(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1413 // Since everything potentially moved, we will clear all remembered |
10405 | 1414 // 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
|
1415 // 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
|
1416 clear_rsets_post_compaction(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1417 check_gc_time_stamps(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1418 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1419 // Resize the heap if necessary. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1420 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
|
1421 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1422 if (_hr_printer.is_active()) { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1423 // 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
|
1424 // 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
|
1425 // the end GC event. |
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 print_hrs_post_compaction(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1428 _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
|
1429 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1430 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1431 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
|
1432 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
|
1433 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
|
1434 hot_card_cache->reset_hot_cache(); |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1435 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1436 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1437 // Rebuild remembered sets of all regions. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1438 if (G1CollectedHeap::use_parallel_gc_threads()) { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1439 uint n_workers = |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1440 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1441 workers()->active_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1442 Threads::number_of_non_daemon_threads()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1443 assert(UseDynamicNumberOfGCThreads || |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1444 n_workers == workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1445 "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
|
1446 workers()->set_active_workers(n_workers); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1447 // 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
|
1448 // 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
|
1449 // 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
|
1450 // 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
|
1451 // may be code that is "possibly_parallel". |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1452 set_par_threads(n_workers); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1453 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1454 ParRebuildRSTask rebuild_rs_task(this); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1455 assert(check_heap_region_claim_values( |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1456 HeapRegion::InitialClaimValue), "sanity check"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1457 assert(UseDynamicNumberOfGCThreads || |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1458 workers()->active_workers() == workers()->total_workers(), |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1459 "Unless dynamic should use total workers"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1460 // 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
|
1461 assert(workers()->active_workers() > 0, |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1462 "Active workers not properly set"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1463 set_par_threads(workers()->active_workers()); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1464 workers()->run_task(&rebuild_rs_task); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1465 set_par_threads(0); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1466 assert(check_heap_region_claim_values( |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1467 HeapRegion::RebuildRSClaimValue), "sanity check"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1468 reset_heap_region_claim_values(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1469 } else { |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1470 RebuildRSOutOfRegionClosure rebuild_rs(this); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1471 heap_region_iterate(&rebuild_rs); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1472 } |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1473 |
12080 | 1474 // Rebuild the strong code root lists for each region |
1475 rebuild_strong_code_roots(); | |
1476 | |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1477 if (true) { // FIXME |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1478 MetaspaceGC::compute_new_size(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1479 } |
342 | 1480 |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1481 #ifdef TRACESPINNING |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1482 ParallelTaskTerminator::print_termination_counts(); |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1483 #endif |
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
1484 |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1485 // Discard all rset updates |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1486 JavaThread::dirty_card_queue_set().abandon_logs(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1487 assert(!G1DeferredRSUpdate |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1488 || (G1DeferredRSUpdate && |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1489 (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any"); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1490 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1491 _young_list->reset_sampled_info(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1492 // 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
|
1493 // entire heap tagged as young. |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1494 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
|
1495 "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
|
1496 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1497 // 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
|
1498 increment_old_marking_cycles_completed(false /* concurrent */); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1499 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1500 _hrs.verify_optional(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1501 verify_region_sets_optional(); |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1502 |
10373
3a4805ad0005
8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents:
10372
diff
changeset
|
1503 verify_after_gc(); |
3a4805ad0005
8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents:
10372
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 |
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
1511 init_mutator_alloc_region(); |
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, |
1647 bool* succeeded) { | |
2152 | 1648 assert_at_safepoint(true /* should_be_vm_thread */); |
1973 | 1649 |
1650 *succeeded = true; | |
1651 // Let's attempt the allocation first. | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1652 HeapWord* result = |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1653 attempt_allocation_at_safepoint(word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1654 false /* expect_null_mutator_alloc_region */); |
1973 | 1655 if (result != NULL) { |
1656 assert(*succeeded, "sanity"); | |
1657 return result; | |
1658 } | |
342 | 1659 |
1660 // In a G1 heap, we're supposed to keep allocation from failing by | |
1661 // incremental pauses. Therefore, at least for now, we'll favor | |
1662 // expansion over collection. (This might change in the future if we can | |
1663 // do something smarter than full collection to satisfy a failed alloc.) | |
1664 result = expand_and_allocate(word_size); | |
1665 if (result != NULL) { | |
1973 | 1666 assert(*succeeded, "sanity"); |
342 | 1667 return result; |
1668 } | |
1669 | |
1973 | 1670 // Expansion didn't work, we'll try to do a Full GC. |
1671 bool gc_succeeded = do_collection(false, /* explicit_gc */ | |
1672 false, /* clear_all_soft_refs */ | |
1673 word_size); | |
1674 if (!gc_succeeded) { | |
1675 *succeeded = false; | |
1676 return NULL; | |
1677 } | |
1678 | |
1679 // Retry the allocation | |
1680 result = attempt_allocation_at_safepoint(word_size, | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1681 true /* expect_null_mutator_alloc_region */); |
342 | 1682 if (result != NULL) { |
1973 | 1683 assert(*succeeded, "sanity"); |
342 | 1684 return result; |
1685 } | |
1686 | |
1973 | 1687 // Then, try a Full GC that will collect all soft references. |
1688 gc_succeeded = do_collection(false, /* explicit_gc */ | |
1689 true, /* clear_all_soft_refs */ | |
1690 word_size); | |
1691 if (!gc_succeeded) { | |
1692 *succeeded = false; | |
1693 return NULL; | |
1694 } | |
1695 | |
1696 // Retry the allocation once more | |
1697 result = attempt_allocation_at_safepoint(word_size, | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1698 true /* expect_null_mutator_alloc_region */); |
342 | 1699 if (result != NULL) { |
1973 | 1700 assert(*succeeded, "sanity"); |
342 | 1701 return result; |
1702 } | |
1703 | |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1360
diff
changeset
|
1704 assert(!collector_policy()->should_clear_all_soft_refs(), |
1973 | 1705 "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
|
1706 |
342 | 1707 // What else? We might try synchronous finalization later. If the total |
1708 // space available is large enough for the allocation, then a more | |
1709 // complete compaction phase than we've tried so far might be | |
1710 // appropriate. | |
1973 | 1711 assert(*succeeded, "sanity"); |
342 | 1712 return NULL; |
1713 } | |
1714 | |
1715 // Attempting to expand the heap sufficiently | |
1716 // to support an allocation of the given "word_size". If | |
1717 // successful, perform the allocation and return the address of the | |
1718 // allocated block, or else "NULL". | |
1719 | |
1720 HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) { | |
2152 | 1721 assert_at_safepoint(true /* should_be_vm_thread */); |
1722 | |
1723 verify_region_sets_optional(); | |
1973 | 1724 |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1725 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
|
1726 ergo_verbose1(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1727 "attempt heap expansion", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1728 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
|
1729 ergo_format_byte("allocation request"), |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1730 word_size * HeapWordSize); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1731 if (expand(expand_bytes)) { |
3766 | 1732 _hrs.verify_optional(); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1733 verify_region_sets_optional(); |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1734 return attempt_allocation_at_safepoint(word_size, |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
1735 false /* expect_null_mutator_alloc_region */); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1736 } |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1737 return NULL; |
342 | 1738 } |
1739 | |
3766 | 1740 void G1CollectedHeap::update_committed_space(HeapWord* old_end, |
1741 HeapWord* new_end) { | |
1742 assert(old_end != new_end, "don't call this otherwise"); | |
1743 assert((HeapWord*) _g1_storage.high() == new_end, "invariant"); | |
1744 | |
1745 // Update the committed mem region. | |
1746 _g1_committed.set_end(new_end); | |
1747 // Tell the card table about the update. | |
1748 Universe::heap()->barrier_set()->resize_covered_region(_g1_committed); | |
1749 // Tell the BOT about the update. | |
1750 _bot_shared->resize(_g1_committed.word_size()); | |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1751 // Tell the hot card cache about the update |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
1752 _cg1r->hot_card_cache()->resize_card_counts(capacity()); |
3766 | 1753 } |
1754 | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1755 bool G1CollectedHeap::expand(size_t expand_bytes) { |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1756 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes); |
342 | 1757 aligned_expand_bytes = align_size_up(aligned_expand_bytes, |
1758 HeapRegion::GrainBytes); | |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1759 ergo_verbose2(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1760 "expand the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1761 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
|
1762 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
|
1763 expand_bytes, aligned_expand_bytes); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1764 |
12345
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1765 if (_g1_storage.uncommitted_size() == 0) { |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1766 ergo_verbose0(ErgoHeapSizing, |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1767 "did not expand the heap", |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1768 ergo_format_reason("heap already fully expanded")); |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1769 return false; |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1770 } |
9de9169ddde6
8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents:
12343
diff
changeset
|
1771 |
3766 | 1772 // First commit the memory. |
1773 HeapWord* old_end = (HeapWord*) _g1_storage.high(); | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1774 bool successful = _g1_storage.expand_by(aligned_expand_bytes); |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1775 if (successful) { |
3766 | 1776 // Then propagate this update to the necessary data structures. |
1777 HeapWord* new_end = (HeapWord*) _g1_storage.high(); | |
1778 update_committed_space(old_end, new_end); | |
1779 | |
1780 FreeRegionList expansion_list("Local Expansion List"); | |
1781 MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list); | |
1782 assert(mr.start() == old_end, "post-condition"); | |
1783 // mr might be a smaller region than what was requested if | |
1784 // expand_by() was unable to allocate the HeapRegion instances | |
1785 assert(mr.end() <= new_end, "post-condition"); | |
1786 | |
1787 size_t actual_expand_bytes = mr.byte_size(); | |
1788 assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition"); | |
1789 assert(actual_expand_bytes == expansion_list.total_capacity_bytes(), | |
1790 "post-condition"); | |
1791 if (actual_expand_bytes < aligned_expand_bytes) { | |
1792 // We could not expand _hrs to the desired size. In this case we | |
1793 // need to shrink the committed space accordingly. | |
1794 assert(mr.end() < new_end, "invariant"); | |
1795 | |
1796 size_t diff_bytes = aligned_expand_bytes - actual_expand_bytes; | |
1797 // First uncommit the memory. | |
1798 _g1_storage.shrink_by(diff_bytes); | |
1799 // Then propagate this update to the necessary data structures. | |
1800 update_committed_space(new_end, mr.end()); | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1801 } |
3766 | 1802 _free_list.add_as_tail(&expansion_list); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1803 |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1804 if (_hr_printer.is_active()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1805 HeapWord* curr = mr.start(); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1806 while (curr < mr.end()) { |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1807 HeapWord* curr_end = curr + HeapRegion::GrainWords; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1808 _hr_printer.commit(curr, curr_end); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1809 curr = curr_end; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1810 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1811 assert(curr == mr.end(), "post-condition"); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1812 } |
3920
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
1813 g1_policy()->record_new_heap_size(n_regions()); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1814 } else { |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1815 ergo_verbose0(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1816 "did not expand the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1817 ergo_format_reason("heap expansion operation failed")); |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1818 // The expansion of the virtual storage space was unsuccessful. |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1819 // 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
|
1820 if (G1ExitOnExpansionFailure && |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1821 _g1_storage.uncommitted_size() >= aligned_expand_bytes) { |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1822 // We had head room... |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
10099
diff
changeset
|
1823 vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion"); |
342 | 1824 } |
1825 } | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
1826 return successful; |
342 | 1827 } |
1828 | |
3766 | 1829 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) { |
342 | 1830 size_t aligned_shrink_bytes = |
1831 ReservedSpace::page_align_size_down(shrink_bytes); | |
1832 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes, | |
1833 HeapRegion::GrainBytes); | |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1834 uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1835 |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1836 uint num_regions_removed = _hrs.shrink_by(num_regions_to_remove); |
3766 | 1837 HeapWord* old_end = (HeapWord*) _g1_storage.high(); |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1838 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
|
1839 |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1840 ergo_verbose3(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1841 "shrink the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1842 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
|
1843 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
|
1844 ergo_format_byte("attempted shrinking amount"), |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1845 shrink_bytes, aligned_shrink_bytes, shrunk_bytes); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1846 if (num_regions_removed > 0) { |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1847 _g1_storage.shrink_by(shrunk_bytes); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1848 HeapWord* new_end = (HeapWord*) _g1_storage.high(); |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1849 |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1850 if (_hr_printer.is_active()) { |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1851 HeapWord* curr = old_end; |
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1852 while (curr > new_end) { |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1853 HeapWord* curr_end = curr; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1854 curr -= HeapRegion::GrainWords; |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1855 _hr_printer.uncommit(curr, curr_end); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1856 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1857 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1858 |
10242
b0d20fa374b4
8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents:
10193
diff
changeset
|
1859 _expansion_regions += num_regions_removed; |
3766 | 1860 update_committed_space(old_end, new_end); |
1861 HeapRegionRemSet::shrink_heap(n_regions()); | |
3920
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
1862 g1_policy()->record_new_heap_size(n_regions()); |
3914
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1863 } else { |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1864 ergo_verbose0(ErgoHeapSizing, |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1865 "did not shrink the heap", |
20213c8a3c40
7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents:
3886
diff
changeset
|
1866 ergo_format_reason("heap shrinking operation failed")); |
342 | 1867 } |
1868 } | |
1869 | |
1870 void G1CollectedHeap::shrink(size_t shrink_bytes) { | |
2152 | 1871 verify_region_sets_optional(); |
1872 | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1873 // 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
|
1874 // 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
|
1875 // below will make sure of that and do any remaining clean up. |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1876 abandon_gc_alloc_regions(); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1877 |
2152 | 1878 // Instead of tearing down / rebuilding the free lists here, we |
1879 // could instead use the remove_all_pending() method on free_list to | |
1880 // remove only the ones that we need to remove. | |
4072 | 1881 tear_down_region_sets(true /* free_list_only */); |
342 | 1882 shrink_helper(shrink_bytes); |
4072 | 1883 rebuild_region_sets(true /* free_list_only */); |
2152 | 1884 |
3766 | 1885 _hrs.verify_optional(); |
2152 | 1886 verify_region_sets_optional(); |
342 | 1887 } |
1888 | |
1889 // Public methods. | |
1890 | |
1891 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away | |
1892 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list | |
1893 #endif // _MSC_VER | |
1894 | |
1895 | |
1896 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : | |
1897 SharedHeap(policy_), | |
1898 _g1_policy(policy_), | |
1111 | 1899 _dirty_card_queue_set(false), |
1705 | 1900 _into_cset_dirty_card_queue_set(false), |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1901 _is_alive_closure_cm(this), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1902 _is_alive_closure_stw(this), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1903 _ref_processor_cm(NULL), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
1904 _ref_processor_stw(NULL), |
342 | 1905 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)), |
1906 _bot_shared(NULL), | |
10405 | 1907 _evac_failure_scan_stack(NULL), |
342 | 1908 _mark_in_progress(false), |
2152 | 1909 _cg1r(NULL), _summary_bytes_used(0), |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
1910 _g1mm(NULL), |
342 | 1911 _refine_cte_cl(NULL), |
1912 _full_collection(false), | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1913 _free_list("Master Free List", new MasterFreeRegionListMtSafeChecker()), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1914 _secondary_free_list("Secondary Free List", new SecondaryFreeRegionListMtSafeChecker()), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1915 _old_set("Old Set", false /* humongous */, new OldRegionSetMtSafeChecker()), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
1916 _humongous_set("Master Humongous Set", true /* humongous */, new HumongousRegionSetMtSafeChecker()), |
2152 | 1917 _free_regions_coming(false), |
342 | 1918 _young_list(new YoungList(this)), |
1919 _gc_time_stamp(0), | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
1920 _retained_old_gc_alloc_region(NULL), |
6595 | 1921 _survivor_plab_stats(YoungPLABSize, PLABWeight), |
1922 _old_plab_stats(OldPLABSize, PLABWeight), | |
4781
bacb651cf5bf
7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents:
4728
diff
changeset
|
1923 _expand_heap_after_alloc_failure(true), |
526 | 1924 _surviving_young_words(NULL), |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
1925 _old_marking_cycles_started(0), |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
1926 _old_marking_cycles_completed(0), |
10405 | 1927 _concurrent_cycle_started(false), |
20212
d7e2d5f2846b
8027553: Change the in_cset_fast_test functionality to use the G1BiasedArray abstraction
tschatzl
parents:
20198
diff
changeset
|
1928 _in_cset_fast_test(), |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1929 _dirty_cards_region_list(NULL), |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1930 _worker_cset_start_region(NULL), |
10405 | 1931 _worker_cset_start_region_time_stamp(NULL), |
1932 _gc_timer_stw(new (ResourceObj::C_HEAP, mtGC) STWGCTimer()), | |
1933 _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()), | |
1934 _gc_tracer_stw(new (ResourceObj::C_HEAP, mtGC) G1NewTracer()), | |
1935 _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) G1OldTracer()) { | |
1936 | |
1937 _g1h = this; | |
342 | 1938 if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) { |
1939 vm_exit_during_initialization("Failed necessary allocation."); | |
1940 } | |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1941 |
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1942 _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2; |
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
1943 |
342 | 1944 int n_queues = MAX2((int)ParallelGCThreads, 1); |
1945 _task_queues = new RefToScanQueueSet(n_queues); | |
1946 | |
17758
ae7336d6337e
8034868: Extract G1 From Card Cache into separate class
tschatzl
parents:
17757
diff
changeset
|
1947 uint n_rem_sets = HeapRegionRemSet::num_par_rem_sets(); |
342 | 1948 assert(n_rem_sets > 0, "Invariant."); |
1949 | |
6197 | 1950 _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC); |
1951 _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC); | |
10405 | 1952 _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
|
1953 |
342 | 1954 for (int i = 0; i < n_queues; i++) { |
1955 RefToScanQueue* q = new RefToScanQueue(); | |
1956 q->initialize(); | |
1957 _task_queues->register_queue(i, q); | |
10405 | 1958 ::new (&_evacuation_failed_info_array[i]) EvacuationFailedInfo(); |
1959 } | |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1960 clear_cset_start_regions(); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
1961 |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1962 // Initialize the G1EvacuationFailureALot counters and flags. |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1963 NOT_PRODUCT(reset_evacuation_should_fail();) |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
1964 |
342 | 1965 guarantee(_task_queues != NULL, "task_queues allocation failure."); |
1966 } | |
1967 | |
1968 jint G1CollectedHeap::initialize() { | |
1166 | 1969 CollectedHeap::pre_initialize(); |
342 | 1970 os::enable_vtime(); |
1971 | |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1972 G1Log::init(); |
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
1973 |
342 | 1974 // Necessary to satisfy locking discipline assertions. |
1975 | |
1976 MutexLocker x(Heap_lock); | |
1977 | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1978 // 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
|
1979 // it will be used then. |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1980 _hr_printer.set_active(G1PrintHeapRegions); |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
1981 |
342 | 1982 // While there are no constraints in the GC code that HeapWordSize |
1983 // be any particular value, there are multiple other areas in the | |
1984 // system which believe this to be true (e.g. oop->object_size in some | |
1985 // cases incorrectly returns the size in wordSize units rather than | |
1986 // HeapWordSize). | |
1987 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize"); | |
1988 | |
1989 size_t init_byte_size = collector_policy()->initial_heap_byte_size(); | |
1990 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
|
1991 size_t heap_alignment = collector_policy()->heap_alignment(); |
342 | 1992 |
1993 // Ensure that the sizes are properly aligned. | |
1994 Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap"); | |
1995 Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap"); | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
12082
diff
changeset
|
1996 Universe::check_alignment(max_byte_size, heap_alignment, "g1 heap"); |
342 | 1997 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
1998 _refine_cte_cl = new RefineCardTableEntryClosure(); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
1999 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2000 _cg1r = new ConcurrentG1Refine(this, _refine_cte_cl); |
342 | 2001 |
2002 // Reserve the maximum. | |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
620
diff
changeset
|
2003 |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2004 // When compressed oops are enabled, the preferred heap base |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2005 // is calculated by subtracting the requested size from the |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2006 // 32Gb boundary and using the result as the base address for |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2007 // heap reservation. If the requested size is not aligned to |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2008 // HeapRegion::GrainBytes (i.e. the alignment that is passed |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2009 // into the ReservedHeapSpace constructor) then the actual |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2010 // base of the reserved heap may end up differing from the |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2011 // address that was requested (i.e. the preferred heap base). |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2012 // 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
|
2013 // compressed oops mode. |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
3823
diff
changeset
|
2014 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2015 ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size, |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
12082
diff
changeset
|
2016 heap_alignment); |
342 | 2017 |
2018 // It is important to do this in a way such that concurrent readers can't | |
10405 | 2019 // temporarily think something is in the heap. (I've actually seen this |
342 | 2020 // happen in asserts: DLD.) |
2021 _reserved.set_word_size(0); | |
2022 _reserved.set_start((HeapWord*)heap_rs.base()); | |
2023 _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size())); | |
2024 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2025 _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes); |
342 | 2026 |
2027 // Create the gen rem set (and barrier set) for the entire reserved region. | |
2028 _rem_set = collector_policy()->create_rem_set(_reserved, 2); | |
2029 set_barrier_set(rem_set()->bs()); | |
12343 | 2030 if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) { |
2031 vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS"); | |
342 | 2032 return JNI_ENOMEM; |
2033 } | |
2034 | |
2035 // Also create a G1 rem set. | |
12343 | 2036 _g1_rem_set = new G1RemSet(this, g1_barrier_set()); |
342 | 2037 |
2038 // Carve out the G1 part of the heap. | |
2039 | |
2040 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size); | |
2041 _g1_reserved = MemRegion((HeapWord*)g1_rs.base(), | |
2042 g1_rs.size()/HeapWordSize); | |
2043 | |
2044 _g1_storage.initialize(g1_rs, 0); | |
2045 _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0); | |
3766 | 2046 _hrs.initialize((HeapWord*) _g1_reserved.start(), |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
12233
diff
changeset
|
2047 (HeapWord*) _g1_reserved.end()); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
12233
diff
changeset
|
2048 assert(_hrs.max_length() == _expansion_regions, |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
12233
diff
changeset
|
2049 err_msg("max length: %u expansion regions: %u", |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
12233
diff
changeset
|
2050 _hrs.max_length(), _expansion_regions)); |
342 | 2051 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2052 // Do later initialization work for concurrent refinement. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2053 _cg1r->init(); |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
2054 |
807
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2055 // 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
|
2056 // in the remembered set structures. |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2057 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
|
2058 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
|
2059 |
d44bdab1c03d
6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents:
796
diff
changeset
|
2060 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
|
2061 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
|
2062 guarantee(HeapRegion::CardsPerRegion < max_cards_per_region, |
942
2c79770d1f6e
6819085: G1: use larger and/or user settable region size
tonyp
parents:
941
diff
changeset
|
2063 "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
|
2064 |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
2065 FreeRegionList::set_unrealistically_long_length(max_regions() + 1); |
2152 | 2066 |
342 | 2067 _bot_shared = new G1BlockOffsetSharedArray(_reserved, |
2068 heap_word_size(init_byte_size)); | |
2069 | |
2070 _g1h = this; | |
2071 | |
20212
d7e2d5f2846b
8027553: Change the in_cset_fast_test functionality to use the G1BiasedArray abstraction
tschatzl
parents:
20198
diff
changeset
|
2072 _in_cset_fast_test.initialize(_g1_reserved.start(), _g1_reserved.end(), HeapRegion::GrainBytes); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
2073 |
342 | 2074 // Create the ConcurrentMark data structure and thread. |
2075 // (Must do this late, so that "max_regions" is defined.) | |
7397
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2076 _cm = new ConcurrentMark(this, heap_rs); |
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2077 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
|
2078 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
|
2079 return JNI_ENOMEM; |
442f942757c0
8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents:
7207
diff
changeset
|
2080 } |
342 | 2081 _cmThread = _cm->cmThread(); |
2082 | |
2083 // Initialize the from_card cache structure of HeapRegionRemSet. | |
2084 HeapRegionRemSet::init_heap(max_regions()); | |
2085 | |
677 | 2086 // Now expand into the initial heap size. |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
2087 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
|
2088 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
|
2089 return JNI_ENOMEM; |
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
2090 } |
342 | 2091 |
2092 // Perform any initialization actions delegated to the policy. | |
2093 g1_policy()->init(); | |
2094 | |
2095 JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon, | |
2096 SATB_Q_FL_lock, | |
1111 | 2097 G1SATBProcessCompletedThreshold, |
342 | 2098 Shared_SATB_Q_lock); |
794 | 2099 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2100 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
|
2101 DirtyCardQ_CBL_mon, |
794 | 2102 DirtyCardQ_FL_lock, |
1111 | 2103 concurrent_g1_refine()->yellow_zone(), |
2104 concurrent_g1_refine()->red_zone(), | |
794 | 2105 Shared_DirtyCardQ_lock); |
2106 | |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
2107 if (G1DeferredRSUpdate) { |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2108 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
|
2109 DirtyCardQ_CBL_mon, |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
2110 DirtyCardQ_FL_lock, |
1111 | 2111 -1, // never trigger processing |
2112 -1, // no limit on length | |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
2113 Shared_DirtyCardQ_lock, |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
2114 &JavaThread::dirty_card_queue_set()); |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
2115 } |
1705 | 2116 |
2117 // Initialize the card queue set used to hold cards containing | |
2118 // references into the collection set. | |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
2119 _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
|
2120 DirtyCardQ_CBL_mon, |
1705 | 2121 DirtyCardQ_FL_lock, |
2122 -1, // never trigger processing | |
2123 -1, // no limit on length | |
2124 Shared_DirtyCardQ_lock, | |
2125 &JavaThread::dirty_card_queue_set()); | |
2126 | |
342 | 2127 // In case we're keeping closure specialization stats, initialize those |
2128 // counts and that mechanism. | |
2129 SpecializationStats::clear(); | |
2130 | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2131 // Here we allocate the dummy full region that is required by the |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2132 // G1AllocRegion class. If we don't pass an address in the reserved |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2133 // space here, lots of asserts fire. |
3766 | 2134 |
2135 HeapRegion* dummy_region = new_heap_region(0 /* index of bottom region */, | |
2136 _g1_reserved.start()); | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2137 // 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
|
2138 // 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
|
2139 // region will complain that it cannot support allocations without |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2140 // BOT updates. So we'll tag the dummy region as young to avoid that. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2141 dummy_region->set_young(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2142 // Make sure it's full. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2143 dummy_region->set_top(dummy_region->end()); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2144 G1AllocRegion::setup(this, dummy_region); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2145 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2146 init_mutator_alloc_region(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2147 |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
2148 // 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
|
2149 // values in the heap have been properly initialized. |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
2150 _g1mm = new G1MonitoringSupport(this); |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
2151 |
17764 | 2152 G1StringDedup::initialize(); |
2153 | |
342 | 2154 return JNI_OK; |
2155 } | |
2156 | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2157 void G1CollectedHeap::stop() { |
17992 | 2158 // Stop all concurrent threads. We do this to make sure these threads |
2159 // 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
|
2160 // that are destroyed during shutdown. |
17992 | 2161 _cg1r->stop(); |
2162 _cmThread->stop(); | |
2163 if (G1StringDedup::is_enabled()) { | |
2164 G1StringDedup::stop(); | |
2165 } | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2166 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17937
diff
changeset
|
2167 |
12233
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2168 size_t G1CollectedHeap::conservative_max_heap_alignment() { |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2169 return HeapRegion::max_region_size(); |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2170 } |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
12179
diff
changeset
|
2171 |
342 | 2172 void G1CollectedHeap::ref_processing_init() { |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2173 // Reference processing in G1 currently works as follows: |
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2174 // |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2175 // * There are two reference processor instances. One is |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2176 // used to record and process discovered references |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2177 // during concurrent marking; the other is used to |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2178 // record and process references during STW pauses |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2179 // (both full and incremental). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2180 // * Both ref processors need to 'span' the entire heap as |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2181 // the regions in the collection set may be dotted around. |
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 // * For the concurrent marking ref processor: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2184 // * Reference discovery is enabled at initial marking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2185 // * Reference discovery is disabled and the discovered |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2186 // references processed etc during remarking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2187 // * Reference discovery is MT (see below). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2188 // * Reference discovery requires a barrier (see below). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2189 // * Reference processing may or may not be MT |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2190 // (depending on the value of ParallelRefProcEnabled |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2191 // and ParallelGCThreads). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2192 // * A full GC disables reference discovery by the CM |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2193 // ref processor and abandons any entries on it's |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2194 // discovered lists. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2195 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2196 // * For the STW processor: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2197 // * 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
|
2198 // * Processing and enqueueing during a full GC is non-MT. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2199 // * During a full GC, references are processed after marking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2200 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2201 // * 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
|
2202 // of an incremental evacuation pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2203 // * References are processed near the end of a STW evacuation pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2204 // * For both types of GC: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2205 // * Discovery is atomic - i.e. not concurrent. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2206 // * Reference discovery will not need a barrier. |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
2207 |
342 | 2208 SharedHeap::ref_processing_init(); |
2209 MemRegion mr = reserved_region(); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2210 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2211 // Concurrent Mark ref processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2212 _ref_processor_cm = |
2369
92da084fefc9
6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents:
2361
diff
changeset
|
2213 new ReferenceProcessor(mr, // span |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2214 ParallelRefProcEnabled && (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2215 // mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2216 (int) ParallelGCThreads, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2217 // degree of mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2218 (ParallelGCThreads > 1) || (ConcGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2219 // mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2220 (int) MAX2(ParallelGCThreads, ConcGCThreads), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2221 // degree of mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2222 false, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2223 // 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
|
2224 &_is_alive_closure_cm); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2225 // is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2226 // (for efficiency/performance) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2227 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2228 // STW ref processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2229 _ref_processor_stw = |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2230 new ReferenceProcessor(mr, // span |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2231 ParallelRefProcEnabled && (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2232 // mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2233 MAX2((int)ParallelGCThreads, 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2234 // degree of mt processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2235 (ParallelGCThreads > 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2236 // mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2237 MAX2((int)ParallelGCThreads, 1), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2238 // degree of mt discovery |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2239 true, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2240 // Reference discovery is atomic |
17976
8e20ef014b08
8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents:
17948
diff
changeset
|
2241 &_is_alive_closure_stw); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2242 // is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
2243 // (for efficiency/performance) |
342 | 2244 } |
2245 | |
2246 size_t G1CollectedHeap::capacity() const { | |
2247 return _g1_committed.byte_size(); | |
2248 } | |
2249 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2250 void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2251 assert(!hr->continuesHumongous(), "pre-condition"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2252 hr->reset_gc_time_stamp(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2253 if (hr->startsHumongous()) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2254 uint first_index = hr->hrs_index() + 1; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2255 uint last_index = hr->last_hc_index(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2256 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
|
2257 HeapRegion* chr = region_at(i); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2258 assert(chr->continuesHumongous(), "sanity"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2259 chr->reset_gc_time_stamp(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2260 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2261 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2262 } |
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 #ifndef PRODUCT |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2265 class CheckGCTimeStampsHRClosure : public HeapRegionClosure { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2266 private: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2267 unsigned _gc_time_stamp; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2268 bool _failures; |
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 public: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2271 CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) : |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2272 _gc_time_stamp(gc_time_stamp), _failures(false) { } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2273 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2274 virtual bool doHeapRegion(HeapRegion* hr) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2275 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
|
2276 if (_gc_time_stamp != region_gc_time_stamp) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2277 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
|
2278 "expected %d", HR_FORMAT_PARAMS(hr), |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2279 region_gc_time_stamp, _gc_time_stamp); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2280 _failures = true; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2281 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2282 return false; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2283 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2284 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2285 bool failures() { return _failures; } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2286 }; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2287 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2288 void G1CollectedHeap::check_gc_time_stamps() { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2289 CheckGCTimeStampsHRClosure cl(_gc_time_stamp); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2290 heap_region_iterate(&cl); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2291 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
|
2292 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2293 #endif // PRODUCT |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2294 |
1705 | 2295 void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl, |
2296 DirtyCardQueue* into_cset_dcq, | |
2297 bool concurrent, | |
17844
8847586c9037
8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents:
17833
diff
changeset
|
2298 uint worker_i) { |
889 | 2299 // 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
|
2300 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
|
2301 hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq); |
889 | 2302 |
342 | 2303 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); |
2304 int n_completed_buffers = 0; | |
1705 | 2305 while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) { |
342 | 2306 n_completed_buffers++; |
2307 } | |
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
|
2308 g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i, n_completed_buffers); |
342 | 2309 dcqs.clear_n_completed_buffers(); |
2310 assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!"); | |
2311 } | |
2312 | |
2313 | |
2314 // Computes the sum of the storage used by the various regions. | |
2315 | |
2316 size_t G1CollectedHeap::used() const { | |
862
36b5611220a7
6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents:
861
diff
changeset
|
2317 assert(Heap_lock->owner() != NULL, |
36b5611220a7
6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents:
861
diff
changeset
|
2318 "Should be owned on this thread's behalf."); |
342 | 2319 size_t result = _summary_bytes_used; |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
2320 // Read only once in case it is set to NULL concurrently |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2321 HeapRegion* hr = _mutator_alloc_region.get(); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
2322 if (hr != NULL) |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
2323 result += hr->used(); |
342 | 2324 return result; |
2325 } | |
2326 | |
846
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2327 size_t G1CollectedHeap::used_unlocked() const { |
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2328 size_t result = _summary_bytes_used; |
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2329 return result; |
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2330 } |
42d84bbbecf4
6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents:
845
diff
changeset
|
2331 |
342 | 2332 class SumUsedClosure: public HeapRegionClosure { |
2333 size_t _used; | |
2334 public: | |
2335 SumUsedClosure() : _used(0) {} | |
2336 bool doHeapRegion(HeapRegion* r) { | |
2337 if (!r->continuesHumongous()) { | |
2338 _used += r->used(); | |
2339 } | |
2340 return false; | |
2341 } | |
2342 size_t result() { return _used; } | |
2343 }; | |
2344 | |
2345 size_t G1CollectedHeap::recalculate_used() const { | |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2346 double recalculate_used_start = os::elapsedTime(); |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2347 |
342 | 2348 SumUsedClosure blk; |
3766 | 2349 heap_region_iterate(&blk); |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2350 |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
2351 g1_policy()->phase_times()->record_evac_fail_recalc_used_time((os::elapsedTime() - recalculate_used_start) * 1000.0); |
342 | 2352 return blk.result(); |
2353 } | |
2354 | |
2355 size_t G1CollectedHeap::unsafe_max_alloc() { | |
2152 | 2356 if (free_regions() > 0) return HeapRegion::GrainBytes; |
342 | 2357 // otherwise, is there space in the current allocation region? |
2358 | |
2359 // We need to store the current allocation region in a local variable | |
2360 // here. The problem is that this method doesn't take any locks and | |
2361 // there may be other threads which overwrite the current allocation | |
2362 // region field. attempt_allocation(), for example, sets it to NULL | |
2363 // and this can happen *after* the NULL check here but before the call | |
2364 // to free(), resulting in a SIGSEGV. Note that this doesn't appear | |
2365 // to be a problem in the optimized build, since the two loads of the | |
2366 // current allocation region field are optimized away. | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2367 HeapRegion* hr = _mutator_alloc_region.get(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2368 if (hr == NULL) { |
342 | 2369 return 0; |
2370 } | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
2371 return hr->free(); |
342 | 2372 } |
2373 | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2374 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
|
2375 switch (cause) { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2376 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
|
2377 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
|
2378 case GCCause::_g1_humongous_allocation: return true; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2379 default: return false; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2380 } |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2381 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2382 |
3285
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2383 #ifndef PRODUCT |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2384 void G1CollectedHeap::allocate_dummy_regions() { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2385 // Let's fill up most of the region |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2386 size_t word_size = HeapRegion::GrainWords - 1024; |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2387 // 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
|
2388 guarantee(isHumongous(word_size), "sanity"); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2389 |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2390 for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2391 // Let's use the existing mechanism for the allocation |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2392 HeapWord* dummy_obj = humongous_obj_allocate(word_size); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2393 if (dummy_obj != NULL) { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2394 MemRegion mr(dummy_obj, word_size); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2395 CollectedHeap::fill_with_object(mr); |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2396 } else { |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2397 // 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
|
2398 // again. Let's get out of the loop. |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2399 break; |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2400 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2401 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2402 } |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2403 #endif // !PRODUCT |
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
2404 |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2405 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
|
2406 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
|
2407 _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
|
2408 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
|
2409 _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
|
2410 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2411 _old_marking_cycles_started++; |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2412 } |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2413 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2414 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
|
2415 MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2416 |
2030
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2417 // 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
|
2418 // 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
|
2419 // 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
|
2420 // assert here. |
fb712ff22571
7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents:
1995
diff
changeset
|
2421 |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2422 // 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
|
2423 // 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
|
2424 // interrupt a concurrent cycle), the number of full collections |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2425 // 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
|
2426 // 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
|
2427 // behind the number of full collections started. |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2428 |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2429 // 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
|
2430 assert(concurrent || |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2431 (_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
|
2432 (_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
|
2433 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
|
2434 "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
|
2435 _old_marking_cycles_started, _old_marking_cycles_completed)); |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2436 |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2437 // 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
|
2438 assert(!concurrent || |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2439 (_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
|
2440 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
|
2441 "_old_marking_cycles_started = %u " |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2442 "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
|
2443 _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
|
2444 |
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2445 _old_marking_cycles_completed += 1; |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2446 |
1840
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2447 // 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
|
2448 // we wake up any waiters (especially when ExplicitInvokesConcurrent |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2449 // is set) so that if a waiter requests another System.gc() it doesn't |
10405 | 2450 // 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
|
2451 if (concurrent) { |
1840
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2452 _cmThread->clear_in_progress(); |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2453 } |
4e0094bc41fa
6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents:
1833
diff
changeset
|
2454 |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2455 // 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
|
2456 // System.gc() with (with ExplicitGCInvokesConcurrent set or not) |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2457 // 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
|
2458 // waiting in VM_G1IncCollectionPause::doit_epilogue(). |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2459 FullGCCount_lock->notify_all(); |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2460 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2461 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
2462 void G1CollectedHeap::register_concurrent_cycle_start(const Ticks& start_time) { |
10405 | 2463 _concurrent_cycle_started = true; |
2464 _gc_timer_cm->register_gc_start(start_time); | |
2465 | |
2466 _gc_tracer_cm->report_gc_start(gc_cause(), _gc_timer_cm->gc_start()); | |
2467 trace_heap_before_gc(_gc_tracer_cm); | |
2468 } | |
2469 | |
2470 void G1CollectedHeap::register_concurrent_cycle_end() { | |
2471 if (_concurrent_cycle_started) { | |
2472 if (_cm->has_aborted()) { | |
2473 _gc_tracer_cm->report_concurrent_mode_failure(); | |
2474 } | |
12179
f175e3678be2
8020692: TestGCEventMixed.java failed because of timestamp in event after end event
ehelin
parents:
12116
diff
changeset
|
2475 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
2476 _gc_timer_cm->register_gc_end(); |
10405 | 2477 _gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions()); |
2478 | |
2479 _concurrent_cycle_started = false; | |
2480 } | |
2481 } | |
2482 | |
2483 void G1CollectedHeap::trace_heap_after_concurrent_cycle() { | |
2484 if (_concurrent_cycle_started) { | |
2485 trace_heap_after_gc(_gc_tracer_cm); | |
2486 } | |
2487 } | |
2488 | |
2489 G1YCType G1CollectedHeap::yc_type() { | |
2490 bool is_young = g1_policy()->gcs_are_young(); | |
2491 bool is_initial_mark = g1_policy()->during_initial_mark_pause(); | |
2492 bool is_during_mark = mark_in_progress(); | |
2493 | |
2494 if (is_initial_mark) { | |
2495 return InitialMark; | |
2496 } else if (is_during_mark) { | |
2497 return DuringMark; | |
2498 } else if (is_young) { | |
2499 return Normal; | |
2500 } else { | |
2501 return Mixed; | |
2502 } | |
2503 } | |
2504 | |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2505 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
|
2506 assert_heap_not_locked(); |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2507 |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2508 unsigned int gc_count_before; |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2509 unsigned int old_marking_count_before; |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2510 bool retry_gc; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2511 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2512 do { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2513 retry_gc = false; |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2514 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2515 { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2516 MutexLocker ml(Heap_lock); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2517 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2518 // 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
|
2519 gc_count_before = total_collections(); |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2520 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
|
2521 } |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2522 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2523 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
|
2524 // 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
|
2525 // 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
|
2526 // we are not requesting a post-GC allocation. |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2527 VM_G1IncCollectionPause op(gc_count_before, |
1973 | 2528 0, /* word_size */ |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2529 true, /* should_initiate_conc_mark */ |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2530 g1_policy()->max_pause_time_ms(), |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2531 cause); |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2532 |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2533 VMThread::execute(&op); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2534 if (!op.pause_succeeded()) { |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2535 if (old_marking_count_before == _old_marking_cycles_started) { |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2536 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
|
2537 } else { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2538 // 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
|
2539 // 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
|
2540 // 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
|
2541 } |
5963
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2542 |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2543 if (retry_gc) { |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2544 if (GC_locker::is_active_and_needs_gc()) { |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2545 GC_locker::stall_until_clear(); |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2546 } |
64bf7c8270cb
7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents:
4912
diff
changeset
|
2547 } |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2548 } |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2549 } else { |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2550 if (cause == GCCause::_gc_locker |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2551 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
|
2552 |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2553 // 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
|
2554 // 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
|
2555 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
|
2556 0, /* word_size */ |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2557 false, /* should_initiate_conc_mark */ |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2558 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
|
2559 cause); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2560 VMThread::execute(&op); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2561 } else { |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2562 // Schedule a Full GC. |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
2563 VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause); |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2564 VMThread::execute(&op); |
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2565 } |
1088
3fc996d4edd2
6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents:
1045
diff
changeset
|
2566 } |
4910
caa4652b4414
7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents:
4875
diff
changeset
|
2567 } while (retry_gc); |
342 | 2568 } |
2569 | |
2570 bool G1CollectedHeap::is_in(const void* p) const { | |
4708 | 2571 if (_g1_committed.contains(p)) { |
2572 // Given that we know that p is in the committed space, | |
2573 // heap_region_containing_raw() should successfully | |
2574 // return the containing region. | |
2575 HeapRegion* hr = heap_region_containing_raw(p); | |
342 | 2576 return hr->is_in(p); |
2577 } else { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2578 return false; |
342 | 2579 } |
2580 } | |
2581 | |
2582 // Iteration functions. | |
2583 | |
2584 // Iterates an OopClosure over all ref-containing fields of objects | |
2585 // within a HeapRegion. | |
2586 | |
2587 class IterateOopClosureRegionClosure: public HeapRegionClosure { | |
2588 MemRegion _mr; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2589 ExtendedOopClosure* _cl; |
342 | 2590 public: |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2591 IterateOopClosureRegionClosure(MemRegion mr, ExtendedOopClosure* cl) |
342 | 2592 : _mr(mr), _cl(cl) {} |
2593 bool doHeapRegion(HeapRegion* r) { | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2594 if (!r->continuesHumongous()) { |
342 | 2595 r->oop_iterate(_cl); |
2596 } | |
2597 return false; | |
2598 } | |
2599 }; | |
2600 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2601 void G1CollectedHeap::oop_iterate(ExtendedOopClosure* cl) { |
342 | 2602 IterateOopClosureRegionClosure blk(_g1_committed, cl); |
3766 | 2603 heap_region_iterate(&blk); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2604 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2605 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2606 void G1CollectedHeap::oop_iterate(MemRegion mr, ExtendedOopClosure* cl) { |
342 | 2607 IterateOopClosureRegionClosure blk(mr, cl); |
3766 | 2608 heap_region_iterate(&blk); |
342 | 2609 } |
2610 | |
2611 // Iterates an ObjectClosure over all objects within a HeapRegion. | |
2612 | |
2613 class IterateObjectClosureRegionClosure: public HeapRegionClosure { | |
2614 ObjectClosure* _cl; | |
2615 public: | |
2616 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {} | |
2617 bool doHeapRegion(HeapRegion* r) { | |
2618 if (! r->continuesHumongous()) { | |
2619 r->object_iterate(_cl); | |
2620 } | |
2621 return false; | |
2622 } | |
2623 }; | |
2624 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
2625 void G1CollectedHeap::object_iterate(ObjectClosure* cl) { |
342 | 2626 IterateObjectClosureRegionClosure blk(cl); |
3766 | 2627 heap_region_iterate(&blk); |
342 | 2628 } |
2629 | |
2630 // Calls a SpaceClosure on a HeapRegion. | |
2631 | |
2632 class SpaceClosureRegionClosure: public HeapRegionClosure { | |
2633 SpaceClosure* _cl; | |
2634 public: | |
2635 SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {} | |
2636 bool doHeapRegion(HeapRegion* r) { | |
2637 _cl->do_space(r); | |
2638 return false; | |
2639 } | |
2640 }; | |
2641 | |
2642 void G1CollectedHeap::space_iterate(SpaceClosure* cl) { | |
2643 SpaceClosureRegionClosure blk(cl); | |
3766 | 2644 heap_region_iterate(&blk); |
342 | 2645 } |
2646 | |
3766 | 2647 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const { |
2648 _hrs.iterate(cl); | |
342 | 2649 } |
2650 | |
2651 void | |
2652 G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl, | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2653 uint worker_id, |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
2654 uint no_of_par_workers, |
342 | 2655 jint claim_value) { |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2656 const uint regions = n_regions(); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
2657 const uint max_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
2658 no_of_par_workers : |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
2659 1); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
2660 assert(UseDynamicNumberOfGCThreads || |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
2661 no_of_par_workers == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
2662 "Non dynamic should use fixed number of workers"); |
355 | 2663 // try to spread out the starting points of the workers |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2664 const HeapRegion* start_hr = |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2665 start_region_for_worker(worker_id, no_of_par_workers); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2666 const uint start_index = start_hr->hrs_index(); |
355 | 2667 |
2668 // each worker will actually look at all regions | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2669 for (uint count = 0; count < regions; ++count) { |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2670 const uint index = (start_index + count) % regions; |
355 | 2671 assert(0 <= index && index < regions, "sanity"); |
2672 HeapRegion* r = region_at(index); | |
2673 // we'll ignore "continues humongous" regions (we'll process them | |
2674 // when we come across their corresponding "start humongous" | |
2675 // region) and regions already claimed | |
2676 if (r->claim_value() == claim_value || r->continuesHumongous()) { | |
2677 continue; | |
2678 } | |
2679 // OK, try to claim it | |
342 | 2680 if (r->claimHeapRegion(claim_value)) { |
355 | 2681 // success! |
2682 assert(!r->continuesHumongous(), "sanity"); | |
2683 if (r->startsHumongous()) { | |
2684 // If the region is "starts humongous" we'll iterate over its | |
2685 // "continues humongous" first; in fact we'll do them | |
2686 // first. The order is important. In on case, calling the | |
2687 // closure on the "starts humongous" region might de-allocate | |
2688 // and clear all its "continues humongous" regions and, as a | |
2689 // result, we might end up processing them twice. So, we'll do | |
2690 // them first (notice: most closures will ignore them anyway) and | |
2691 // then we'll do the "starts humongous" region. | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2692 for (uint ch_index = index + 1; ch_index < regions; ++ch_index) { |
355 | 2693 HeapRegion* chr = region_at(ch_index); |
2694 | |
2695 // if the region has already been claimed or it's not | |
2696 // "continues humongous" we're done | |
2697 if (chr->claim_value() == claim_value || | |
2698 !chr->continuesHumongous()) { | |
2699 break; | |
2700 } | |
2701 | |
10405 | 2702 // No one should have claimed it directly. We can given |
355 | 2703 // that we claimed its "starts humongous" region. |
2704 assert(chr->claim_value() != claim_value, "sanity"); | |
2705 assert(chr->humongous_start_region() == r, "sanity"); | |
2706 | |
2707 if (chr->claimHeapRegion(claim_value)) { | |
10405 | 2708 // we should always be able to claim it; no one else should |
355 | 2709 // be trying to claim this region |
2710 | |
2711 bool res2 = cl->doHeapRegion(chr); | |
2712 assert(!res2, "Should not abort"); | |
2713 | |
2714 // Right now, this holds (i.e., no closure that actually | |
2715 // does something with "continues humongous" regions | |
2716 // clears them). We might have to weaken it in the future, | |
2717 // but let's leave these two asserts here for extra safety. | |
2718 assert(chr->continuesHumongous(), "should still be the case"); | |
2719 assert(chr->humongous_start_region() == r, "sanity"); | |
2720 } else { | |
2721 guarantee(false, "we should not reach here"); | |
2722 } | |
2723 } | |
2724 } | |
2725 | |
2726 assert(!r->continuesHumongous(), "sanity"); | |
2727 bool res = cl->doHeapRegion(r); | |
2728 assert(!res, "Should not abort"); | |
2729 } | |
2730 } | |
2731 } | |
2732 | |
390 | 2733 class ResetClaimValuesClosure: public HeapRegionClosure { |
2734 public: | |
2735 bool doHeapRegion(HeapRegion* r) { | |
2736 r->set_claim_value(HeapRegion::InitialClaimValue); | |
2737 return false; | |
2738 } | |
2739 }; | |
2740 | |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2741 void G1CollectedHeap::reset_heap_region_claim_values() { |
390 | 2742 ResetClaimValuesClosure blk; |
2743 heap_region_iterate(&blk); | |
2744 } | |
2745 | |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2746 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
|
2747 ResetClaimValuesClosure blk; |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2748 collection_set_iterate(&blk); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2749 } |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
2750 |
355 | 2751 #ifdef ASSERT |
2752 // This checks whether all regions in the heap have the correct claim | |
2753 // value. I also piggy-backed on this a check to ensure that the | |
2754 // humongous_start_region() information on "continues humongous" | |
2755 // regions is correct. | |
2756 | |
2757 class CheckClaimValuesClosure : public HeapRegionClosure { | |
2758 private: | |
2759 jint _claim_value; | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2760 uint _failures; |
355 | 2761 HeapRegion* _sh_region; |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2762 |
355 | 2763 public: |
2764 CheckClaimValuesClosure(jint claim_value) : | |
2765 _claim_value(claim_value), _failures(0), _sh_region(NULL) { } | |
2766 bool doHeapRegion(HeapRegion* r) { | |
2767 if (r->claim_value() != _claim_value) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2768 gclog_or_tty->print_cr("Region " HR_FORMAT ", " |
355 | 2769 "claim value = %d, should be %d", |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2770 HR_FORMAT_PARAMS(r), |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2771 r->claim_value(), _claim_value); |
355 | 2772 ++_failures; |
2773 } | |
2774 if (!r->isHumongous()) { | |
2775 _sh_region = NULL; | |
2776 } else if (r->startsHumongous()) { | |
2777 _sh_region = r; | |
2778 } else if (r->continuesHumongous()) { | |
2779 if (r->humongous_start_region() != _sh_region) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2780 gclog_or_tty->print_cr("Region " HR_FORMAT ", " |
355 | 2781 "HS = "PTR_FORMAT", should be "PTR_FORMAT, |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2782 HR_FORMAT_PARAMS(r), |
355 | 2783 r->humongous_start_region(), |
2784 _sh_region); | |
2785 ++_failures; | |
342 | 2786 } |
2787 } | |
355 | 2788 return false; |
2789 } | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2790 uint failures() { return _failures; } |
355 | 2791 }; |
2792 | |
2793 bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) { | |
2794 CheckClaimValuesClosure cl(claim_value); | |
2795 heap_region_iterate(&cl); | |
2796 return cl.failures() == 0; | |
2797 } | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2798 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2799 class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure { |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2800 private: |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2801 jint _claim_value; |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2802 uint _failures; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2803 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2804 public: |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2805 CheckClaimValuesInCSetHRClosure(jint claim_value) : |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2806 _claim_value(claim_value), _failures(0) { } |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2807 |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2808 uint failures() { return _failures; } |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2809 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2810 bool doHeapRegion(HeapRegion* hr) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2811 assert(hr->in_collection_set(), "how?"); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2812 assert(!hr->isHumongous(), "H-region in CSet"); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2813 if (hr->claim_value() != _claim_value) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2814 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
|
2815 "claim value = %d, should be %d", |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2816 HR_FORMAT_PARAMS(hr), |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2817 hr->claim_value(), _claim_value); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2818 _failures += 1; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2819 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2820 return false; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2821 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2822 }; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2823 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2824 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
|
2825 CheckClaimValuesInCSetHRClosure cl(claim_value); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2826 collection_set_iterate(&cl); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2827 return cl.failures() == 0; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2828 } |
355 | 2829 #endif // ASSERT |
342 | 2830 |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2831 // 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
|
2832 // 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
|
2833 void G1CollectedHeap::clear_cset_start_regions() { |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2834 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
|
2835 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
|
2836 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2837 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
|
2838 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
|
2839 _worker_cset_start_region[i] = NULL; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2840 _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
|
2841 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2842 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2843 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2844 // 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
|
2845 // 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
|
2846 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
|
2847 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
|
2848 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2849 HeapRegion* result = NULL; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2850 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
|
2851 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2852 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
|
2853 // 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
|
2854 // 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
|
2855 // 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
|
2856 // (when the collection set is empty). |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2857 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
|
2858 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
|
2859 return result; |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2860 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2861 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2862 // 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
|
2863 // 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
|
2864 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2865 // 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
|
2866 // 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
|
2867 // avoid contention. |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2868 // If we have: |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2869 // n collection set regions |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2870 // p threads |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2871 // 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
|
2872 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2873 result = g1_policy()->collection_set(); |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2874 if (G1CollectedHeap::use_parallel_gc_threads()) { |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2875 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
|
2876 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
|
2877 assert(UseDynamicNumberOfGCThreads || |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2878 active_workers == workers()->total_workers(), |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2879 "Unless dynamic should use total workers"); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2880 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2881 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
|
2882 uint start_ind = 0; |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2883 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2884 if (worker_i > 0 && |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2885 _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
|
2886 // Previous workers starting region is valid |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2887 // so let's iterate from there |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2888 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
|
2889 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
|
2890 } |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2891 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
2892 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
|
2893 result = result->next_in_collection_set(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2894 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2895 } |
4709
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2896 |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2897 // 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
|
2898 // (when the collection set is empty). |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2899 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
|
2900 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
|
2901 "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
|
2902 _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
|
2903 OrderAccess::storestore(); |
fd2b426c30db
7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents:
4708
diff
changeset
|
2904 _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
|
2905 return result; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2906 } |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
2907 |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2908 HeapRegion* G1CollectedHeap::start_region_for_worker(uint worker_i, |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2909 uint no_of_par_workers) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2910 uint worker_num = |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2911 G1CollectedHeap::use_parallel_gc_threads() ? no_of_par_workers : 1U; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2912 assert(UseDynamicNumberOfGCThreads || |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2913 no_of_par_workers == workers()->total_workers(), |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2914 "Non dynamic should use fixed number of workers"); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2915 const uint start_index = n_regions() * worker_i / worker_num; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2916 return region_at(start_index); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2917 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
2918 |
342 | 2919 void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) { |
2920 HeapRegion* r = g1_policy()->collection_set(); | |
2921 while (r != NULL) { | |
2922 HeapRegion* next = r->next_in_collection_set(); | |
2923 if (cl->doHeapRegion(r)) { | |
2924 cl->incomplete(); | |
2925 return; | |
2926 } | |
2927 r = next; | |
2928 } | |
2929 } | |
2930 | |
2931 void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r, | |
2932 HeapRegionClosure *cl) { | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2933 if (r == NULL) { |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2934 // 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
|
2935 return; |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2936 } |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
2937 |
342 | 2938 assert(r->in_collection_set(), |
2939 "Start region must be a member of the collection set."); | |
2940 HeapRegion* cur = r; | |
2941 while (cur != NULL) { | |
2942 HeapRegion* next = cur->next_in_collection_set(); | |
2943 if (cl->doHeapRegion(cur) && false) { | |
2944 cl->incomplete(); | |
2945 return; | |
2946 } | |
2947 cur = next; | |
2948 } | |
2949 cur = g1_policy()->collection_set(); | |
2950 while (cur != r) { | |
2951 HeapRegion* next = cur->next_in_collection_set(); | |
2952 if (cl->doHeapRegion(cur) && false) { | |
2953 cl->incomplete(); | |
2954 return; | |
2955 } | |
2956 cur = next; | |
2957 } | |
2958 } | |
2959 | |
20304
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2960 HeapRegion* G1CollectedHeap::next_compaction_region(const HeapRegion* from) const { |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2961 // We're not using an iterator given that it will wrap around when |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2962 // it reaches the last region and this is not what we want here. |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2963 for (uint index = from->hrs_index() + 1; index < n_regions(); index++) { |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2964 HeapRegion* hr = region_at(index); |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2965 if (!hr->isHumongous()) { |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2966 return hr; |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2967 } |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2968 } |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2969 return NULL; |
a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents:
20282
diff
changeset
|
2970 } |
342 | 2971 |
2972 Space* G1CollectedHeap::space_containing(const void* addr) const { | |
2973 Space* res = heap_region_containing(addr); | |
2974 return res; | |
2975 } | |
2976 | |
2977 HeapWord* G1CollectedHeap::block_start(const void* addr) const { | |
2978 Space* sp = space_containing(addr); | |
2979 if (sp != NULL) { | |
2980 return sp->block_start(addr); | |
2981 } | |
2982 return NULL; | |
2983 } | |
2984 | |
2985 size_t G1CollectedHeap::block_size(const HeapWord* addr) const { | |
2986 Space* sp = space_containing(addr); | |
2987 assert(sp != NULL, "block_size of address outside of heap"); | |
2988 return sp->block_size(addr); | |
2989 } | |
2990 | |
2991 bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const { | |
2992 Space* sp = space_containing(addr); | |
2993 return sp->block_is_obj(addr); | |
2994 } | |
2995 | |
2996 bool G1CollectedHeap::supports_tlab_allocation() const { | |
2997 return true; | |
2998 } | |
2999 | |
3000 size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const { | |
17727 | 3001 return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes; |
3002 } | |
3003 | |
3004 size_t G1CollectedHeap::tlab_used(Thread* ignored) const { | |
3005 return young_list()->eden_used_bytes(); | |
3006 } | |
3007 | |
3008 // For G1 TLABs should not contain humongous objects, so the maximum TLAB size | |
3009 // must be smaller than the humongous object limit. | |
3010 size_t G1CollectedHeap::max_tlab_size() const { | |
3011 return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment); | |
342 | 3012 } |
3013 | |
3014 size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const { | |
3015 // Return the remaining space in the cur alloc region, but not less than | |
3016 // the min TLAB size. | |
1313
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
3017 |
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
3018 // Also, this value can be at most the humongous object threshold, |
10405 | 3019 // 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
|
3020 // humongous objects. |
664ae0c5e0e5
6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents:
1282
diff
changeset
|
3021 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
3022 HeapRegion* hr = _mutator_alloc_region.get(); |
17727 | 3023 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
|
3024 if (hr == NULL) { |
17727 | 3025 return max_tlab; |
342 | 3026 } else { |
17727 | 3027 return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab); |
342 | 3028 } |
3029 } | |
3030 | |
3031 size_t G1CollectedHeap::max_capacity() const { | |
2188
c33825b68624
6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents:
2173
diff
changeset
|
3032 return _g1_reserved.byte_size(); |
342 | 3033 } |
3034 | |
3035 jlong G1CollectedHeap::millis_since_last_gc() { | |
3036 // assert(false, "NYI"); | |
3037 return 0; | |
3038 } | |
3039 | |
3040 void G1CollectedHeap::prepare_for_verify() { | |
3041 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) { | |
3042 ensure_parsability(false); | |
3043 } | |
3044 g1_rem_set()->prepare_for_verify(); | |
3045 } | |
3046 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3047 bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr, |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3048 VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3049 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3050 case VerifyOption_G1UsePrevMarking: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3051 return hr->obj_allocated_since_prev_marking(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3052 case VerifyOption_G1UseNextMarking: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3053 return hr->obj_allocated_since_next_marking(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3054 case VerifyOption_G1UseMarkWord: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3055 return false; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3056 default: |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3057 ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3058 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3059 return false; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3060 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3061 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3062 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
|
3063 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3064 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
|
3065 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
|
3066 case VerifyOption_G1UseMarkWord: return NULL; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3067 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3068 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3069 return NULL; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3070 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3071 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3072 bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3073 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3074 case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3075 case VerifyOption_G1UseNextMarking: return isMarkedNext(obj); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3076 case VerifyOption_G1UseMarkWord: return obj->is_gc_marked(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3077 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3078 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3079 return false; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3080 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3081 |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3082 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
|
3083 switch (vo) { |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3084 case VerifyOption_G1UsePrevMarking: return "PTAMS"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3085 case VerifyOption_G1UseNextMarking: return "NTAMS"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3086 case VerifyOption_G1UseMarkWord: return "NONE"; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3087 default: ShouldNotReachHere(); |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3088 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3089 return NULL; // keep some compilers happy |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3090 } |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3091 |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
3092 class VerifyRootsClosure: public OopClosure { |
12080 | 3093 private: |
3094 G1CollectedHeap* _g1h; | |
3095 VerifyOption _vo; | |
3096 bool _failures; | |
3097 public: | |
3098 // _vo == UsePrevMarking -> use "prev" marking information, | |
3099 // _vo == UseNextMarking -> use "next" marking information, | |
3100 // _vo == UseMarkWord -> use mark word from object header. | |
3101 VerifyRootsClosure(VerifyOption vo) : | |
3102 _g1h(G1CollectedHeap::heap()), | |
3103 _vo(vo), | |
3104 _failures(false) { } | |
3105 | |
3106 bool failures() { return _failures; } | |
3107 | |
3108 template <class T> void do_oop_nv(T* p) { | |
3109 T heap_oop = oopDesc::load_heap_oop(p); | |
3110 if (!oopDesc::is_null(heap_oop)) { | |
3111 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
3112 if (_g1h->is_obj_dead_cond(obj, _vo)) { | |
3113 gclog_or_tty->print_cr("Root location "PTR_FORMAT" " | |
3114 "points to dead obj "PTR_FORMAT, p, (void*) obj); | |
3115 if (_vo == VerifyOption_G1UseMarkWord) { | |
3116 gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark())); | |
3117 } | |
3118 obj->print_on(gclog_or_tty); | |
3119 _failures = true; | |
3120 } | |
3121 } | |
3122 } | |
3123 | |
3124 void do_oop(oop* p) { do_oop_nv(p); } | |
3125 void do_oop(narrowOop* p) { do_oop_nv(p); } | |
3126 }; | |
3127 | |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
3128 class G1VerifyCodeRootOopClosure: public OopClosure { |
12080 | 3129 G1CollectedHeap* _g1h; |
3130 OopClosure* _root_cl; | |
3131 nmethod* _nm; | |
3132 VerifyOption _vo; | |
3133 bool _failures; | |
3134 | |
3135 template <class T> void do_oop_work(T* p) { | |
3136 // First verify that this root is live | |
3137 _root_cl->do_oop(p); | |
3138 | |
3139 if (!G1VerifyHeapRegionCodeRoots) { | |
3140 // We're not verifying the code roots attached to heap region. | |
3141 return; | |
3142 } | |
3143 | |
3144 // Don't check the code roots during marking verification in a full GC | |
3145 if (_vo == VerifyOption_G1UseMarkWord) { | |
3146 return; | |
3147 } | |
3148 | |
3149 // Now verify that the current nmethod (which contains p) is | |
3150 // in the code root list of the heap region containing the | |
3151 // object referenced by p. | |
3152 | |
3153 T heap_oop = oopDesc::load_heap_oop(p); | |
3154 if (!oopDesc::is_null(heap_oop)) { | |
3155 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
3156 | |
3157 // Now fetch the region containing the object | |
3158 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
3159 HeapRegionRemSet* hrrs = hr->rem_set(); | |
3160 // Verify that the strong code root list for this region | |
3161 // contains the nmethod | |
3162 if (!hrrs->strong_code_roots_list_contains(_nm)) { | |
3163 gclog_or_tty->print_cr("Code root location "PTR_FORMAT" " | |
3164 "from nmethod "PTR_FORMAT" not in strong " | |
3165 "code roots for region ["PTR_FORMAT","PTR_FORMAT")", | |
3166 p, _nm, hr->bottom(), hr->end()); | |
3167 _failures = true; | |
3168 } | |
3169 } | |
3170 } | |
3171 | |
3172 public: | |
3173 G1VerifyCodeRootOopClosure(G1CollectedHeap* g1h, OopClosure* root_cl, VerifyOption vo): | |
3174 _g1h(g1h), _root_cl(root_cl), _vo(vo), _nm(NULL), _failures(false) {} | |
3175 | |
3176 void do_oop(oop* p) { do_oop_work(p); } | |
3177 void do_oop(narrowOop* p) { do_oop_work(p); } | |
3178 | |
3179 void set_nmethod(nmethod* nm) { _nm = nm; } | |
3180 bool failures() { return _failures; } | |
3181 }; | |
3182 | |
3183 class G1VerifyCodeRootBlobClosure: public CodeBlobClosure { | |
3184 G1VerifyCodeRootOopClosure* _oop_cl; | |
3185 | |
3186 public: | |
3187 G1VerifyCodeRootBlobClosure(G1VerifyCodeRootOopClosure* oop_cl): | |
3188 _oop_cl(oop_cl) {} | |
3189 | |
3190 void do_code_blob(CodeBlob* cb) { | |
3191 nmethod* nm = cb->as_nmethod_or_null(); | |
3192 if (nm != NULL) { | |
3193 _oop_cl->set_nmethod(nm); | |
3194 nm->oops_do(_oop_cl); | |
3195 } | |
3196 } | |
3197 }; | |
3198 | |
3199 class YoungRefCounterClosure : public OopClosure { | |
3200 G1CollectedHeap* _g1h; | |
3201 int _count; | |
3202 public: | |
3203 YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {} | |
3204 void do_oop(oop* p) { if (_g1h->is_in_young(*p)) { _count++; } } | |
3205 void do_oop(narrowOop* p) { ShouldNotReachHere(); } | |
3206 | |
3207 int count() { return _count; } | |
3208 void reset_count() { _count = 0; }; | |
3209 }; | |
3210 | |
3211 class VerifyKlassClosure: public KlassClosure { | |
3212 YoungRefCounterClosure _young_ref_counter_closure; | |
3213 OopClosure *_oop_closure; | |
3214 public: | |
3215 VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {} | |
3216 void do_klass(Klass* k) { | |
3217 k->oops_do(_oop_closure); | |
3218 | |
3219 _young_ref_counter_closure.reset_count(); | |
3220 k->oops_do(&_young_ref_counter_closure); | |
3221 if (_young_ref_counter_closure.count() > 0) { | |
3222 guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k)); | |
3223 } | |
3224 } | |
3225 }; | |
3226 | |
342 | 3227 class VerifyLivenessOopClosure: public OopClosure { |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3228 G1CollectedHeap* _g1h; |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3229 VerifyOption _vo; |
342 | 3230 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3231 VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo): |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3232 _g1h(g1h), _vo(vo) |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3233 { } |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3234 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
|
3235 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
|
3236 |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3237 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
|
3238 oop obj = oopDesc::load_decode_heap_oop(p); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3239 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
|
3240 "Dead object referenced by a not dead object"); |
342 | 3241 } |
3242 }; | |
3243 | |
3244 class VerifyObjsInRegionClosure: public ObjectClosure { | |
811 | 3245 private: |
342 | 3246 G1CollectedHeap* _g1h; |
3247 size_t _live_bytes; | |
3248 HeapRegion *_hr; | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3249 VerifyOption _vo; |
342 | 3250 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3251 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3252 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3253 // _vo == UseMarkWord -> use mark word from object header. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3254 VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo) |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3255 : _live_bytes(0), _hr(hr), _vo(vo) { |
342 | 3256 _g1h = G1CollectedHeap::heap(); |
3257 } | |
3258 void do_object(oop o) { | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3259 VerifyLivenessOopClosure isLive(_g1h, _vo); |
342 | 3260 assert(o != NULL, "Huh?"); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3261 if (!_g1h->is_obj_dead_cond(o, _vo)) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3262 // If the object is alive according to the mark word, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3263 // then verify that the marking information agrees. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3264 // Note we can't verify the contra-positive of the |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3265 // above: if the object is dead (according to the mark |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3266 // 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
|
3267 // but has since became dead, or may have been allocated |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3268 // since the last marking. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3269 if (_vo == VerifyOption_G1UseMarkWord) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3270 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
|
3271 } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3272 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3273 o->oop_iterate_no_header(&isLive); |
1389
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3274 if (!_hr->obj_allocated_since_prev_marking(o)) { |
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3275 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
|
3276 _live_bytes += (obj_size * HeapWordSize); |
5dbd9300cf9c
6943926: G1: Integer overflow during heap region verification
johnc
parents:
1388
diff
changeset
|
3277 } |
342 | 3278 } |
3279 } | |
3280 size_t live_bytes() { return _live_bytes; } | |
3281 }; | |
3282 | |
3283 class PrintObjsInRegionClosure : public ObjectClosure { | |
3284 HeapRegion *_hr; | |
3285 G1CollectedHeap *_g1; | |
3286 public: | |
3287 PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) { | |
3288 _g1 = G1CollectedHeap::heap(); | |
3289 }; | |
3290 | |
3291 void do_object(oop o) { | |
3292 if (o != NULL) { | |
3293 HeapWord *start = (HeapWord *) o; | |
3294 size_t word_sz = o->size(); | |
3295 gclog_or_tty->print("\nPrinting obj "PTR_FORMAT" of size " SIZE_FORMAT | |
3296 " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n", | |
3297 (void*) o, word_sz, | |
3298 _g1->isMarkedPrev(o), | |
3299 _g1->isMarkedNext(o), | |
3300 _hr->obj_allocated_since_prev_marking(o)); | |
3301 HeapWord *end = start + word_sz; | |
3302 HeapWord *cur; | |
3303 int *val; | |
3304 for (cur = start; cur < end; cur++) { | |
3305 val = (int *) cur; | |
3306 gclog_or_tty->print("\t "PTR_FORMAT":"PTR_FORMAT"\n", val, *val); | |
3307 } | |
3308 } | |
3309 } | |
3310 }; | |
3311 | |
3312 class VerifyRegionClosure: public HeapRegionClosure { | |
811 | 3313 private: |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3314 bool _par; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3315 VerifyOption _vo; |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
3316 bool _failures; |
811 | 3317 public: |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3318 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3319 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3320 // _vo == UseMarkWord -> use mark word from object header. |
6008 | 3321 VerifyRegionClosure(bool par, VerifyOption vo) |
3322 : _par(par), | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3323 _vo(vo), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3324 _failures(false) {} |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3325 |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3326 bool failures() { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3327 return _failures; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3328 } |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3329 |
342 | 3330 bool doHeapRegion(HeapRegion* r) { |
637
25e146966e7c
6817419: G1: Enable extensive verification for humongous regions
iveresov
parents:
636
diff
changeset
|
3331 if (!r->continuesHumongous()) { |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3332 bool failures = false; |
6008 | 3333 r->verify(_vo, &failures); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3334 if (failures) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3335 _failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3336 } else { |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3337 VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3338 r->object_iterate(¬_dead_yet_cl); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3339 if (_vo != VerifyOption_G1UseNextMarking) { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3340 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
|
3341 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
|
3342 "max_live_bytes "SIZE_FORMAT" " |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3343 "< calculated "SIZE_FORMAT, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3344 r->bottom(), r->end(), |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3345 r->max_live_bytes(), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3346 not_dead_yet_cl.live_bytes()); |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3347 _failures = true; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3348 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3349 } else { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
3350 // 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
|
3351 // 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
|
3352 // finalized yet. |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3353 } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3354 } |
342 | 3355 } |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3356 return false; // stop the region iteration if we hit a failure |
342 | 3357 } |
3358 }; | |
3359 | |
12080 | 3360 // This is the task used for parallel verification of the heap regions |
390 | 3361 |
3362 class G1ParVerifyTask: public AbstractGangTask { | |
3363 private: | |
3364 G1CollectedHeap* _g1h; | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3365 VerifyOption _vo; |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3366 bool _failures; |
390 | 3367 |
3368 public: | |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3369 // _vo == UsePrevMarking -> use "prev" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3370 // _vo == UseNextMarking -> use "next" marking information, |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3371 // _vo == UseMarkWord -> use mark word from object header. |
6008 | 3372 G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) : |
390 | 3373 AbstractGangTask("Parallel verify task"), |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3374 _g1h(g1h), |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3375 _vo(vo), |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3376 _failures(false) { } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3377 |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3378 bool failures() { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3379 return _failures; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3380 } |
390 | 3381 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
3382 void work(uint worker_id) { |
637
25e146966e7c
6817419: G1: Enable extensive verification for humongous regions
iveresov
parents:
636
diff
changeset
|
3383 HandleMark hm; |
6008 | 3384 VerifyRegionClosure blk(true, _vo); |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
3385 _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
|
3386 _g1h->workers()->active_workers(), |
390 | 3387 HeapRegion::ParVerifyClaimValue); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3388 if (blk.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3389 _failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3390 } |
390 | 3391 } |
3392 }; | |
3393 | |
12080 | 3394 void G1CollectedHeap::verify(bool silent, VerifyOption vo) { |
8855
24ef5fb05e0f
8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents:
8853
diff
changeset
|
3395 if (SafepointSynchronize::is_at_safepoint()) { |
12080 | 3396 assert(Thread::current()->is_VM_thread(), |
3397 "Expected to be executed serially by the VM thread at this point"); | |
3398 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3399 if (!silent) { gclog_or_tty->print("Roots "); } |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3400 VerifyRootsClosure rootsCl(vo); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
3401 VerifyKlassClosure klassCl(this, &rootsCl); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3402 CLDToKlassAndOopClosure cldCl(&klassCl, &rootsCl, false); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3403 |
3293
1f4413413144
7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents:
3289
diff
changeset
|
3404 // 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
|
3405 // 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
|
3406 // 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
|
3407 G1VerifyCodeRootOopClosure codeRootsCl(this, &rootsCl, vo); |
7426d8d76305
8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents:
20256
diff
changeset
|
3408 G1VerifyCodeRootBlobClosure blobsCl(&codeRootsCl); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3409 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3410 process_all_roots(true, // activate StrongRootsScope |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3411 SO_AllCodeCache, // roots scanning options |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3412 &rootsCl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3413 &cldCl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
3414 &blobsCl); |
20257
7426d8d76305
8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents:
20256
diff
changeset
|
3415 |
12080 | 3416 bool failures = rootsCl.failures() || codeRootsCl.failures(); |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3417 |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3418 if (vo != VerifyOption_G1UseMarkWord) { |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3419 // 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
|
3420 // 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
|
3421 // verifying the region sets will fail. So we only verify |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3422 // the region sets when not in a full GC. |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3423 if (!silent) { gclog_or_tty->print("HeapRegionSets "); } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3424 verify_region_sets(); |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3425 } |
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3426 |
2152 | 3427 if (!silent) { gclog_or_tty->print("HeapRegions "); } |
390 | 3428 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) { |
3429 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
3430 "sanity check"); | |
3431 | |
6008 | 3432 G1ParVerifyTask task(this, vo); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3433 assert(UseDynamicNumberOfGCThreads || |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3434 workers()->active_workers() == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3435 "If not dynamic should be using all the workers"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3436 int n_workers = workers()->active_workers(); |
390 | 3437 set_par_threads(n_workers); |
3438 workers()->run_task(&task); | |
3439 set_par_threads(0); | |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3440 if (task.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3441 failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3442 } |
390 | 3443 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3444 // 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
|
3445 // The implication is that n_workers is > 0. |
390 | 3446 assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue), |
3447 "sanity check"); | |
3448 | |
3449 reset_heap_region_claim_values(); | |
3450 | |
3451 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
3452 "sanity check"); | |
3453 } else { | |
6008 | 3454 VerifyRegionClosure blk(false, vo); |
3766 | 3455 heap_region_iterate(&blk); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3456 if (blk.failures()) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3457 failures = true; |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3458 } |
390 | 3459 } |
2152 | 3460 if (!silent) gclog_or_tty->print("RemSet "); |
342 | 3461 rem_set()->verify(); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3462 |
17764 | 3463 if (G1StringDedup::is_enabled()) { |
3464 if (!silent) gclog_or_tty->print("StrDedup "); | |
3465 G1StringDedup::verify(); | |
3466 } | |
3467 | |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3468 if (failures) { |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3469 gclog_or_tty->print_cr("Heap:"); |
4073
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3470 // 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
|
3471 // 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
|
3472 // print_extended_on() instead of print_on(). |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3473 print_extended_on(gclog_or_tty); |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
3474 gclog_or_tty->cr(); |
1547
fb1a39993f69
6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents:
1545
diff
changeset
|
3475 #ifndef PRODUCT |
1044 | 3476 if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) { |
1388 | 3477 concurrent_mark()->print_reachable("at-verification-failure", |
3772
6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
johnc
parents:
3766
diff
changeset
|
3478 vo, false /* all */); |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3479 } |
1547
fb1a39993f69
6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents:
1545
diff
changeset
|
3480 #endif |
1020
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3481 gclog_or_tty->flush(); |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3482 } |
ff2402f6a50b
6882730: G1: parallel heap verification messes up region dump
tonyp
parents:
1019
diff
changeset
|
3483 guarantee(!failures, "there should not have been any failures"); |
342 | 3484 } else { |
17764 | 3485 if (!silent) { |
3486 gclog_or_tty->print("(SKIPPING Roots, HeapRegionSets, HeapRegions, RemSet"); | |
3487 if (G1StringDedup::is_enabled()) { | |
3488 gclog_or_tty->print(", StrDedup"); | |
3489 } | |
3490 gclog_or_tty->print(") "); | |
3491 } | |
342 | 3492 } |
3493 } | |
3494 | |
12080 | 3495 void G1CollectedHeap::verify(bool silent) { |
3496 verify(silent, VerifyOption_G1UsePrevMarking); | |
3497 } | |
3498 | |
3499 double G1CollectedHeap::verify(bool guard, const char* msg) { | |
3500 double verify_time_ms = 0.0; | |
3501 | |
3502 if (guard && total_collections() >= VerifyGCStartAt) { | |
3503 double verify_start = os::elapsedTime(); | |
3504 HandleMark hm; // Discard invalid handles created during verification | |
3505 prepare_for_verify(); | |
3506 Universe::verify(VerifyOption_G1UsePrevMarking, msg); | |
3507 verify_time_ms = (os::elapsedTime() - verify_start) * 1000; | |
3508 } | |
3509 | |
3510 return verify_time_ms; | |
3511 } | |
3512 | |
3513 void G1CollectedHeap::verify_before_gc() { | |
3514 double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:"); | |
3515 g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms); | |
3516 } | |
3517 | |
3518 void G1CollectedHeap::verify_after_gc() { | |
3519 double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:"); | |
3520 g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms); | |
3521 } | |
3522 | |
342 | 3523 class PrintRegionClosure: public HeapRegionClosure { |
3524 outputStream* _st; | |
3525 public: | |
3526 PrintRegionClosure(outputStream* st) : _st(st) {} | |
3527 bool doHeapRegion(HeapRegion* r) { | |
3528 r->print_on(_st); | |
3529 return false; | |
3530 } | |
3531 }; | |
3532 | |
17833
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3533 bool G1CollectedHeap::is_obj_dead_cond(const oop obj, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3534 const HeapRegion* hr, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3535 const VerifyOption vo) const { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3536 switch (vo) { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3537 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3538 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3539 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3540 default: ShouldNotReachHere(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3541 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3542 return false; // keep some compilers happy |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3543 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3544 |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3545 bool G1CollectedHeap::is_obj_dead_cond(const oop obj, |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3546 const VerifyOption vo) const { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3547 switch (vo) { |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3548 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3549 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3550 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3551 default: ShouldNotReachHere(); |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3552 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3553 return false; // keep some compilers happy |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3554 } |
bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
tschatzl
parents:
17774
diff
changeset
|
3555 |
342 | 3556 void G1CollectedHeap::print_on(outputStream* st) const { |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3557 st->print(" %-20s", "garbage-first heap"); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3558 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
|
3559 capacity()/K, used_unlocked()/K); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3560 st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")", |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3561 _g1_storage.low_boundary(), |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3562 _g1_storage.high(), |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3563 _g1_storage.high_boundary()); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3564 st->cr(); |
3986
65a8ff39a6da
7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents:
3983
diff
changeset
|
3565 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
|
3566 uint young_regions = _young_list->length(); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3567 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
|
3568 (size_t) young_regions * HeapRegion::GrainBytes / K); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3569 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
|
3570 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
|
3571 (size_t) survivor_regions * HeapRegion::GrainBytes / K); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3572 st->cr(); |
6863
04155d9c8c76
8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file
johnc
parents:
6819
diff
changeset
|
3573 MetaspaceAux::print_on(st); |
4073
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3574 } |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3575 |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3576 void G1CollectedHeap::print_extended_on(outputStream* st) const { |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3577 print_on(st); |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3578 |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3579 // Print the per-region information. |
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
4072
diff
changeset
|
3580 st->cr(); |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3581 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
|
3582 "HS=humongous(starts), HC=humongous(continues), " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3583 "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
|
3584 "PTAMS=previous top-at-mark-start, " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3585 "NTAMS=next top-at-mark-start)"); |
342 | 3586 PrintRegionClosure blk(st); |
3766 | 3587 heap_region_iterate(&blk); |
342 | 3588 } |
3589 | |
9076
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3590 void G1CollectedHeap::print_on_error(outputStream* st) const { |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3591 this->CollectedHeap::print_on_error(st); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3592 |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3593 if (_cm != NULL) { |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3594 st->cr(); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3595 _cm->print_on_error(st); |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3596 } |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3597 } |
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
8855
diff
changeset
|
3598 |
342 | 3599 void G1CollectedHeap::print_gc_threads_on(outputStream* st) const { |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
3600 if (G1CollectedHeap::use_parallel_gc_threads()) { |
1019 | 3601 workers()->print_worker_threads_on(st); |
3602 } | |
3603 _cmThread->print_on(st); | |
342 | 3604 st->cr(); |
1019 | 3605 _cm->print_worker_threads_on(st); |
3606 _cg1r->print_worker_threads_on(st); | |
17764 | 3607 if (G1StringDedup::is_enabled()) { |
3608 G1StringDedup::print_worker_threads_on(st); | |
3609 } | |
342 | 3610 } |
3611 | |
3612 void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const { | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
3613 if (G1CollectedHeap::use_parallel_gc_threads()) { |
342 | 3614 workers()->threads_do(tc); |
3615 } | |
3616 tc->do_thread(_cmThread); | |
794 | 3617 _cg1r->threads_do(tc); |
17764 | 3618 if (G1StringDedup::is_enabled()) { |
3619 G1StringDedup::threads_do(tc); | |
3620 } | |
342 | 3621 } |
3622 | |
3623 void G1CollectedHeap::print_tracing_info() const { | |
3624 // We'll overload this to mean "trace GC pause statistics." | |
3625 if (TraceGen0Time || TraceGen1Time) { | |
3626 // The "G1CollectorPolicy" is keeping track of these stats, so delegate | |
3627 // to that. | |
3628 g1_policy()->print_tracing_info(); | |
3629 } | |
751 | 3630 if (G1SummarizeRSetStats) { |
342 | 3631 g1_rem_set()->print_summary_info(); |
3632 } | |
1282 | 3633 if (G1SummarizeConcMark) { |
342 | 3634 concurrent_mark()->print_summary_info(); |
3635 } | |
3636 g1_policy()->print_yg_surv_rate_info(); | |
3637 SpecializationStats::print(); | |
3638 } | |
3639 | |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3640 #ifndef PRODUCT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3641 // Helpful for debugging RSet issues. |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3642 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3643 class PrintRSetsClosure : public HeapRegionClosure { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3644 private: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3645 const char* _msg; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3646 size_t _occupied_sum; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3647 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3648 public: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3649 bool doHeapRegion(HeapRegion* r) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3650 HeapRegionRemSet* hrrs = r->rem_set(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3651 size_t occupied = hrrs->occupied(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3652 _occupied_sum += occupied; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3653 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3654 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
|
3655 HR_FORMAT_PARAMS(r)); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3656 if (occupied == 0) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3657 gclog_or_tty->print_cr(" RSet is empty"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3658 } else { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3659 hrrs->print(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3660 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3661 gclog_or_tty->print_cr("----------"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3662 return false; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3663 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3664 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3665 PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3666 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3667 gclog_or_tty->print_cr("========================================"); |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17935
diff
changeset
|
3668 gclog_or_tty->print_cr("%s", msg); |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3669 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3670 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3671 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3672 ~PrintRSetsClosure() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3673 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
|
3674 gclog_or_tty->print_cr("========================================"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3675 gclog_or_tty->cr(); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3676 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3677 }; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3678 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3679 void G1CollectedHeap::print_cset_rsets() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3680 PrintRSetsClosure cl("Printing CSet RSets"); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3681 collection_set_iterate(&cl); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3682 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3683 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3684 void G1CollectedHeap::print_all_rsets() { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3685 PrintRSetsClosure cl("Printing All RSets");; |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3686 heap_region_iterate(&cl); |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3687 } |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3688 #endif // PRODUCT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3689 |
342 | 3690 G1CollectedHeap* G1CollectedHeap::heap() { |
3691 assert(_sh->kind() == CollectedHeap::G1CollectedHeap, | |
3692 "not a garbage-first heap"); | |
3693 return _g1h; | |
3694 } | |
3695 | |
3696 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) { | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1166
diff
changeset
|
3697 // always_do_update_barrier = false; |
342 | 3698 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer"); |
3699 // Fill TLAB's and such | |
17727 | 3700 accumulate_statistics_all_tlabs(); |
342 | 3701 ensure_parsability(true); |
12339
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3702 |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3703 if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) && |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3704 (total_collections() % G1SummarizeRSetStatsPeriod == 0)) { |
c319b188c7b2
8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents:
12305
diff
changeset
|
3705 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
|
3706 } |
342 | 3707 } |
3708 | |
3709 void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) { | |
10372
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3710 |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3711 if (G1SummarizeRSetStats && |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3712 (G1SummarizeRSetStatsPeriod > 0) && |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3713 // 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
|
3714 ((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
|
3715 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
|
3716 } |
e72f7eecc96d
8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
10327
diff
changeset
|
3717 |
342 | 3718 // FIXME: what is this about? |
3719 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled" | |
3720 // is set. | |
3721 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(), | |
3722 "derived pointer present")); | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1166
diff
changeset
|
3723 // always_do_update_barrier = true; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3724 |
17727 | 3725 resize_all_tlabs(); |
3726 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3727 // We have just completed a GC. Update the soft reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3728 // policy with the new heap occupancy |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3729 Universe::update_heap_info_at_gc(); |
342 | 3730 } |
3731 | |
1973 | 3732 HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size, |
3733 unsigned int gc_count_before, | |
12113
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
3734 bool* succeeded, |
f7d3b4387a16
8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents:
12082
diff
changeset
|
3735 GCCause::Cause gc_cause) { |
1973 | 3736 assert_heap_not_locked_and_not_at_safepoint(); |
342 | 3737 g1_policy()->record_stop_world_start(); |
1973 | 3738 VM_G1IncCollectionPause op(gc_count_before, |
3739 word_size, | |
3740 false, /* should_initiate_conc_mark */ | |
3741 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
|
3742 gc_cause); |
1973 | 3743 VMThread::execute(&op); |
3744 | |
3745 HeapWord* result = op.result(); | |
3746 bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded(); | |
3747 assert(result == NULL || ret_succeeded, | |
3748 "the result should be NULL if the VM did not succeed"); | |
3749 *succeeded = ret_succeeded; | |
3750 | |
3751 assert_heap_not_locked(); | |
3752 return result; | |
342 | 3753 } |
3754 | |
3755 void | |
3756 G1CollectedHeap::doConcurrentMark() { | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3757 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
|
3758 if (!_cmThread->in_progress()) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3759 _cmThread->set_started(); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3760 CGC_lock->notify(); |
342 | 3761 } |
3762 } | |
3763 | |
3764 size_t G1CollectedHeap::pending_card_num() { | |
3765 size_t extra_cards = 0; | |
3766 JavaThread *curr = Threads::first(); | |
3767 while (curr != NULL) { | |
3768 DirtyCardQueue& dcq = curr->dirty_card_queue(); | |
3769 extra_cards += dcq.size(); | |
3770 curr = curr->next(); | |
3771 } | |
3772 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); | |
3773 size_t buffer_size = dcqs.buffer_size(); | |
3774 size_t buffer_num = dcqs.completed_buffers_num(); | |
6611 | 3775 |
3776 // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes | |
3777 // in bytes - not the number of 'entries'. We need to convert | |
3778 // into a number of cards. | |
3779 return (buffer_size * buffer_num + extra_cards) / oopSize; | |
342 | 3780 } |
3781 | |
3782 size_t G1CollectedHeap::cards_scanned() { | |
1861 | 3783 return g1_rem_set()->cardsScanned(); |
342 | 3784 } |
3785 | |
3786 void | |
3787 G1CollectedHeap::setup_surviving_young_words() { | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3788 assert(_surviving_young_words == NULL, "pre-condition"); |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3789 uint array_length = g1_policy()->young_cset_region_length(); |
6197 | 3790 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC); |
342 | 3791 if (_surviving_young_words == NULL) { |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
10099
diff
changeset
|
3792 vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR, |
342 | 3793 "Not enough space for young surv words summary."); |
3794 } | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3795 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
|
3796 #ifdef ASSERT |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
3797 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
|
3798 assert( _surviving_young_words[i] == 0, "memset above" ); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3799 } |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
3800 #endif // !ASSERT |
342 | 3801 } |
3802 | |
3803 void | |
3804 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) { | |
3805 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
|
3806 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
|
3807 for (uint i = 0; i < array_length; ++i) { |
342 | 3808 _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
|
3809 } |
342 | 3810 } |
3811 | |
3812 void | |
3813 G1CollectedHeap::cleanup_surviving_young_words() { | |
3814 guarantee( _surviving_young_words != NULL, "pre-condition" ); | |
6197 | 3815 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC); |
342 | 3816 _surviving_young_words = NULL; |
3817 } | |
3818 | |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3819 #ifdef ASSERT |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3820 class VerifyCSetClosure: public HeapRegionClosure { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3821 public: |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3822 bool doHeapRegion(HeapRegion* hr) { |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3823 // 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
|
3824 // 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
|
3825 // 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
|
3826 // 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
|
3827 // 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
|
3828 // 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
|
3829 // 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
|
3830 // 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
|
3831 // evacuation failure handling. |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3832 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
|
3833 |
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3834 // 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
|
3835 // perform on CSet regions. |
1261
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3836 return false; |
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3837 } |
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3838 }; |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
3839 #endif // ASSERT |
1261
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
3840 |
1709 | 3841 #if TASKQUEUE_STATS |
3842 void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) { | |
3843 st->print_raw_cr("GC Task Stats"); | |
3844 st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr(); | |
3845 st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr(); | |
3846 } | |
3847 | |
3848 void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const { | |
3849 print_taskqueue_stats_hdr(st); | |
3850 | |
3851 TaskQueueStats totals; | |
1755
8e5955ddf8e4
6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents:
1719
diff
changeset
|
3852 const int n = workers() != NULL ? workers()->total_workers() : 1; |
1709 | 3853 for (int i = 0; i < n; ++i) { |
3854 st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr(); | |
3855 totals += task_queue(i)->stats; | |
3856 } | |
3857 st->print_raw("tot "); totals.print(st); st->cr(); | |
3858 | |
3859 DEBUG_ONLY(totals.verify()); | |
3860 } | |
3861 | |
3862 void G1CollectedHeap::reset_taskqueue_stats() { | |
1755
8e5955ddf8e4
6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents:
1719
diff
changeset
|
3863 const int n = workers() != NULL ? workers()->total_workers() : 1; |
1709 | 3864 for (int i = 0; i < n; ++i) { |
3865 task_queue(i)->stats.reset(); | |
3866 } | |
3867 } | |
3868 #endif // TASKQUEUE_STATS | |
3869 | |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3870 void G1CollectedHeap::log_gc_header() { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3871 if (!G1Log::fine()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3872 return; |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3873 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3874 |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
3875 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
|
3876 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3877 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
|
3878 .append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)") |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3879 .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : ""); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3880 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3881 gclog_or_tty->print("[%s", (const char*)gc_cause_str); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3882 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3883 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3884 void G1CollectedHeap::log_gc_footer(double pause_time_sec) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3885 if (!G1Log::fine()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3886 return; |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3887 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3888 |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3889 if (G1Log::finer()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3890 if (evacuation_failed()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3891 gclog_or_tty->print(" (to-space exhausted)"); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3892 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3893 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
|
3894 g1_policy()->phase_times()->note_gc_end(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3895 g1_policy()->phase_times()->print(pause_time_sec); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3896 g1_policy()->print_detailed_heap_transition(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3897 } else { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3898 if (evacuation_failed()) { |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3899 gclog_or_tty->print("--"); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3900 } |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3901 g1_policy()->print_heap_transition(); |
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3902 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
|
3903 } |
7207
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
3904 gclog_or_tty->flush(); |
6752
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 |
1973 | 3907 bool |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3908 G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) { |
2152 | 3909 assert_at_safepoint(true /* should_be_vm_thread */); |
3910 guarantee(!is_gc_active(), "collection is not reentrant"); | |
3911 | |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3912 if (GC_locker::check_active_before_gc()) { |
1973 | 3913 return false; |
1359
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3914 } |
23b1b27ac76c
6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents:
1313
diff
changeset
|
3915 |
13400
86e6d691f2e1
8028128: Add a type safe alternative for working with counter based data
mgronlun
parents:
13062
diff
changeset
|
3916 _gc_timer_stw->register_gc_start(); |
10405 | 3917 |
3918 _gc_tracer_stw->report_gc_start(gc_cause(), _gc_timer_stw->gc_start()); | |
3919 | |
2125
7246a374a9f2
6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents:
2039
diff
changeset
|
3920 SvcGCMarker sgcm(SvcGCMarker::MINOR); |
2039
7c5250dbd584
6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents:
2038
diff
changeset
|
3921 ResourceMark rm; |
7c5250dbd584
6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents:
2038
diff
changeset
|
3922 |
4872
aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
never
parents:
4787
diff
changeset
|
3923 print_heap_before_gc(); |
10405 | 3924 trace_heap_before_gc(_gc_tracer_stw); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3925 |
2152 | 3926 verify_region_sets_optional(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
3927 verify_dirty_young_regions(); |
2152 | 3928 |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3929 // 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
|
3930 // 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
|
3931 // for the duration of this pause. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3932 g1_policy()->decide_on_conc_mark_initiation(); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3933 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3934 // 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
|
3935 assert(!g1_policy()->during_initial_mark_pause() || |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3936 g1_policy()->gcs_are_young(), "sanity"); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3937 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3938 // 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
|
3939 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
|
3940 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3941 // 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
|
3942 // 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
|
3943 // 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
|
3944 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
|
3945 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
3946 // 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
|
3947 { |
10405 | 3948 EvacuationInfo evacuation_info; |
3949 | |
1656
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3950 if (g1_policy()->during_initial_mark_pause()) { |
4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
tonyp
parents:
1611
diff
changeset
|
3951 // 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
|
3952 // full collection counter. |
6120
37552638d24a
7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents:
6109
diff
changeset
|
3953 increment_old_marking_cycles_started(); |
10405 | 3954 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
|
3955 } |
10405 | 3956 |
3957 _gc_tracer_stw->report_yc_type(yc_type()); | |
3958 | |
6007
5c86f8211d1e
7160728: Introduce an extra logging level for G1 logging
brutisso
parents:
5987
diff
changeset
|
3959 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty); |
6030 | 3960 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
3961 int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
3962 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
|
3963 double pause_start_sec = os::elapsedTime(); |
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
3964 g1_policy()->phase_times()->note_gc_start(active_workers); |
6752
9646b7ff4d14
7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents:
6725
diff
changeset
|
3965 log_gc_header(); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3966 |
3289
b52782ae3880
6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents:
3285
diff
changeset
|
3967 TraceCollectorStats tcs(g1mm()->incremental_collection_counters()); |
3356
78542e2b5e35
7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents:
3323
diff
changeset
|
3968 TraceMemoryManagerStats tms(false /* fullGC */, gc_cause()); |
1089
db0d5eba9d20
6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents:
1088
diff
changeset
|
3969 |
2361 | 3970 // If the secondary_free_list is not empty, append it to the |
3971 // free_list. No need to wait for the cleanup operation to finish; | |
3972 // the region allocation code will check the secondary_free_list | |
3973 // and wait if necessary. If the G1StressConcRegionFreeing flag is | |
3974 // set, skip this step so that the region allocation code has to | |
3975 // get entries from the secondary_free_list. | |
2152 | 3976 if (!G1StressConcRegionFreeing) { |
2361 | 3977 append_secondary_free_list_if_not_empty_with_lock(); |
2152 | 3978 } |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3979 |
12080 | 3980 assert(check_young_list_well_formed(), "young list should be well formed"); |
3981 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue), | |
3982 "sanity check"); | |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3983 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3984 // 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
|
3985 // 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
|
3986 // it will be set. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
3987 |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3988 { // 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
|
3989 IsGCActiveMark x; |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3990 |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3991 gc_prologue(false); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3992 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
|
3993 increment_gc_time_stamp(); |
342 | 3994 |
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
|
3995 verify_before_gc(); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3996 |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3997 COMPILER2_PRESENT(DerivedPointerTable::clear()); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
3998 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
3999 // Please see comment in g1CollectedHeap.hpp and |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4000 // G1CollectedHeap::ref_processing_init() to see how |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4001 // reference processing currently works in G1. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4002 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4003 // Enable discovery in the STW reference processor |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4004 ref_processor_stw()->enable_discovery(true /*verify_disabled*/, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4005 true /*verify_no_refs*/); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4006 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4007 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4008 // We want to temporarily turn off discovery by the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4009 // CM ref processor, if necessary, and turn it back on |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4010 // on again later if we do. Using a scoped |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4011 // NoRefDiscovery object will do this. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4012 NoRefDiscovery no_cm_discovery(ref_processor_cm()); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4013 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4014 // 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
|
4015 // of the collection set!). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4016 release_mutator_alloc_region(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4017 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4018 // We should call this after we retire the mutator alloc |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4019 // region(s) so that all the ALLOC / RETIRE events are generated |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4020 // before the start GC event. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4021 _hr_printer.start_gc(false /* full */, (size_t) total_collections()); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4022 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4023 // 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
|
4024 // 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
|
4025 // 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
|
4026 // |
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4027 // 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
|
4028 // |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4029 // The elapsed time induced by the start time below deliberately elides |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4030 // 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
|
4031 double sample_start_time_sec = os::elapsedTime(); |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4032 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4033 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4034 gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4035 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4036 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
|
4037 #endif // YOUNG_LIST_VERBOSE |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4038 |
10098
71013d764f6e
8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents:
8855
diff
changeset
|
4039 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
|
4040 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4041 double scan_wait_start = os::elapsedTime(); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4042 // 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
|
4043 // 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
|
4044 // 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
|
4045 // moving them during the GC. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4046 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
|
4047 double wait_time_ms = 0.0; |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4048 if (waited) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4049 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
|
4050 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
|
4051 } |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4052 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
|
4053 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4054 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4055 gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4056 _young_list->print(); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4057 #endif // YOUNG_LIST_VERBOSE |
342 | 4058 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4059 if (g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4060 concurrent_mark()->checkpointRootsInitialPre(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4061 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4062 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4063 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4064 gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4065 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4066 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
|
4067 #endif // YOUNG_LIST_VERBOSE |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4068 |
10405 | 4069 g1_policy()->finalize_cset(target_pause_time_ms, evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4070 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4071 _cm->note_start_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4072 // We should not verify the per-thread SATB buffers given that |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4073 // we have not filtered them yet (we'll do so during the |
4912
a9647476d1a4
7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents:
4910
diff
changeset
|
4074 // GC). We also call this after finalize_cset() to |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4075 // ensure that the CSet has been finalized. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4076 _cm->verify_no_cset_oops(true /* verify_stacks */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4077 true /* verify_enqueued_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4078 false /* verify_thread_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4079 true /* verify_fingers */); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4080 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4081 if (_hr_printer.is_active()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4082 HeapRegion* hr = g1_policy()->collection_set(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4083 while (hr != NULL) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4084 G1HRPrinter::RegionType type; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4085 if (!hr->is_young()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4086 type = G1HRPrinter::Old; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4087 } else if (hr->is_survivor()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4088 type = G1HRPrinter::Survivor; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4089 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4090 type = G1HRPrinter::Eden; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4091 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4092 _hr_printer.cset(hr); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4093 hr = hr->next_in_collection_set(); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4094 } |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4095 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4096 |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
4097 #ifdef ASSERT |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4098 VerifyCSetClosure cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4099 collection_set_iterate(&cl); |
3777
e8b0b0392037
7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents:
3774
diff
changeset
|
4100 #endif // ASSERT |
1707 | 4101 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4102 setup_surviving_young_words(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4103 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4104 // Initialize the GC alloc regions. |
10405 | 4105 init_gc_alloc_regions(evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4106 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4107 // Actually do the work... |
10405 | 4108 evacuate_collection_set(evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4109 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4110 // We do this to mainly verify the per-thread SATB buffers |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4111 // (which have been filtered by now) since we didn't verify |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4112 // them earlier. No point in re-checking the stacks / enqueued |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4113 // buffers given that the CSet has not changed since last time |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4114 // we checked. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4115 _cm->verify_no_cset_oops(false /* verify_stacks */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4116 false /* verify_enqueued_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4117 true /* verify_thread_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4118 true /* verify_fingers */); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4119 |
10405 | 4120 free_collection_set(g1_policy()->collection_set(), evacuation_info); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4121 g1_policy()->clear_collection_set(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4122 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4123 cleanup_surviving_young_words(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4124 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4125 // Start a new incremental collection set for the next pause. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4126 g1_policy()->start_incremental_cset_building(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4127 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4128 clear_cset_fast_test(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4129 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4130 _young_list->reset_sampled_info(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4131 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4132 // Don't check the whole heap at this point as the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4133 // GC alloc regions from this pause have been tagged |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4134 // as survivors and moved on to the survivor list. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4135 // Survivor regions will fail the !is_young() check. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4136 assert(check_young_list_empty(false /* check_heap */), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4137 "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
|
4138 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4139 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4140 gclog_or_tty->print_cr("Before recording survivors.\nYoung List:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4141 _young_list->print(); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4142 #endif // YOUNG_LIST_VERBOSE |
342 | 4143 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4144 g1_policy()->record_survivor_regions(_young_list->survivor_length(), |
10405 | 4145 _young_list->first_survivor_region(), |
4146 _young_list->last_survivor_region()); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4147 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4148 _young_list->reset_auxilary_lists(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4149 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4150 if (evacuation_failed()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4151 _summary_bytes_used = recalculate_used(); |
10405 | 4152 uint n_queues = MAX2((int)ParallelGCThreads, 1); |
4153 for (uint i = 0; i < n_queues; i++) { | |
4154 if (_evacuation_failed_info_array[i].has_failed()) { | |
4155 _gc_tracer_stw->report_evacuation_failed(_evacuation_failed_info_array[i]); | |
4156 } | |
4157 } | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4158 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4159 // The "used" of the the collection set have already been subtracted |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4160 // when they were freed. Add in the bytes evacuated. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4161 _summary_bytes_used += g1_policy()->bytes_copied_during_gc(); |
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 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4164 if (g1_policy()->during_initial_mark_pause()) { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
4165 // 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
|
4166 // 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
|
4167 // appropriate initialization is done on the CM object. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4168 concurrent_mark()->checkpointRootsInitialPost(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4169 set_marking_started(); |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4170 // 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
|
4171 // 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
|
4172 // the current thread has completed its logging output. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4173 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4174 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4175 allocate_dummy_regions(); |
3285
49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
tonyp
parents:
2433
diff
changeset
|
4176 |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4177 #if YOUNG_LIST_VERBOSE |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4178 gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4179 _young_list->print(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4180 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
|
4181 #endif // YOUNG_LIST_VERBOSE |
342 | 4182 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4183 init_mutator_alloc_region(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4184 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4185 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4186 size_t expand_bytes = g1_policy()->expansion_amount(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4187 if (expand_bytes > 0) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4188 size_t bytes_before = capacity(); |
4785 | 4189 // No need for an ergo verbose message here, |
4190 // expansion_amount() does this when it returns a value > 0. | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4191 if (!expand(expand_bytes)) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4192 // We failed to expand the heap so let's verify that |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4193 // committed/uncommitted amount match the backing store |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4194 assert(capacity() == _g1_storage.committed_size(), "committed size mismatch"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4195 assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4196 } |
3920
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4197 } |
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4198 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4199 |
10405 | 4200 // 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
|
4201 // has just got initialized after the previous CSet was freed. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4202 _cm->verify_no_cset_oops(true /* verify_stacks */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4203 true /* verify_enqueued_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4204 true /* verify_thread_buffers */, |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4205 true /* verify_fingers */); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4206 _cm->note_end_of_gc(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4207 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4208 // 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
|
4209 // 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
|
4210 // 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
|
4211 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
|
4212 double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS; |
10405 | 4213 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
|
4214 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4215 MemoryService::track_memory_usage(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4216 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4217 // 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
|
4218 // update buffers to bring the RSets up-to-date if |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4219 // G1HRRSFlushLogBuffersOnVerify has been set. While scanning |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4220 // 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
|
4221 // regions we just allocated to (i.e., the GC alloc |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4222 // regions). However, during the last GC we called |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4223 // set_saved_mark() on all the GC alloc regions, so card |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4224 // scanning might skip the [saved_mark_word()...top()] area of |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4225 // those regions (i.e., the area we allocated objects into |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4226 // during the last GC). But it shouldn't. Given that |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4227 // saved_mark_word() is conditional on whether the GC time stamp |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4228 // 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
|
4229 // 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
|
4230 // regions and saved_mark_word() will simply return top() for |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4231 // 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
|
4232 // than iterating over the regions and fixing them. In fact, the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4233 // GC time stamp increment here also ensures that |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4234 // saved_mark_word() will return top() between pauses, i.e., |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4235 // during concurrent refinement. So we don't need the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4236 // is_gc_active() check to decided which top to use when |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4237 // scanning cards (see CR 7039627). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4238 increment_gc_time_stamp(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4239 |
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
|
4240 verify_after_gc(); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4241 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4242 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4243 ref_processor_stw()->verify_no_references_recorded(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4244 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4245 // 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
|
4246 } |
af2ab04e0038
6929868: G1: introduce min / max young gen size bounds
brutisso
parents:
3919
diff
changeset
|
4247 |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4248 // 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
|
4249 // 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
|
4250 // 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
|
4251 // RETIRE events are generated before the end GC event. |
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4252 _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
|
4253 |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4254 if (mark_in_progress()) { |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4255 concurrent_mark()->update_g1_committed(); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4256 } |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
4257 |
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
4258 #ifdef TRACESPINNING |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4259 ParallelTaskTerminator::print_termination_counts(); |
546
05c6d52fa7a9
6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents:
545
diff
changeset
|
4260 #endif |
342 | 4261 |
838
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4262 gc_epilogue(false); |
0316eac49d5a
6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents:
811
diff
changeset
|
4263 } |
6121
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4264 |
7207
0f80645e9c26
8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents:
6863
diff
changeset
|
4265 // 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
|
4266 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
|
4267 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4268 // 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
|
4269 // 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
|
4270 // 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
|
4271 // logging output either. |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4272 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4273 _hrs.verify_optional(); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4274 verify_region_sets_optional(); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4275 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4276 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
|
4277 TASKQUEUE_STATS_ONLY(reset_taskqueue_stats()); |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4278 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4279 print_heap_after_gc(); |
10405 | 4280 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
|
4281 |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4282 // 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
|
4283 // 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
|
4284 // 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
|
4285 // before any GC notifications are raised. |
b9442ac22f59
7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents:
6120
diff
changeset
|
4286 g1mm()->update_sizes(); |
10405 | 4287 |
4288 _gc_tracer_stw->report_evacuation_info(&evacuation_info); | |
4289 _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
|
4290 _gc_timer_stw->register_gc_end(); |
10405 | 4291 _gc_tracer_stw->report_gc_end(_gc_timer_stw->gc_end(), _gc_timer_stw->time_partitions()); |
4292 } | |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4293 // 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
|
4294 // 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
|
4295 // that came from the pause. |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4296 |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4297 if (should_start_conc_mark) { |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4298 // CAUTION: after the doConcurrentMark() call below, |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4299 // the concurrent marking thread(s) could be running |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4300 // concurrently with us. Make sure that anything after |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4301 // 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
|
4302 // 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
|
4303 // not start until the safepoint itself is released in |
20192 | 4304 // SuspendibleThreadSet::desynchronize(). |
4831
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4305 doConcurrentMark(); |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4306 } |
7ca7be5a6a0b
7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents:
4829
diff
changeset
|
4307 |
1973 | 4308 return true; |
342 | 4309 } |
4310 | |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4311 size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose) |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4312 { |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4313 size_t gclab_word_size; |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4314 switch (purpose) { |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4315 case GCAllocForSurvived: |
6595 | 4316 gclab_word_size = _survivor_plab_stats.desired_plab_sz(); |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4317 break; |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4318 case GCAllocForTenured: |
6595 | 4319 gclab_word_size = _old_plab_stats.desired_plab_sz(); |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4320 break; |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4321 default: |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4322 assert(false, "unknown GCAllocPurpose"); |
6595 | 4323 gclab_word_size = _old_plab_stats.desired_plab_sz(); |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4324 break; |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4325 } |
6595 | 4326 |
4327 // Prevent humongous PLAB sizes for two reasons: | |
4328 // * PLABs are allocated using a similar paths as oops, but should | |
4329 // never be in a humongous region | |
4330 // * Allowing humongous PLABs needlessly churns the region free lists | |
4331 return MIN2(_humongous_object_threshold_in_words, gclab_word_size); | |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4332 } |
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4333 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4334 void G1CollectedHeap::init_mutator_alloc_region() { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4335 assert(_mutator_alloc_region.get() == NULL, "pre-condition"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4336 _mutator_alloc_region.init(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4337 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4338 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4339 void G1CollectedHeap::release_mutator_alloc_region() { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4340 _mutator_alloc_region.release(); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4341 assert(_mutator_alloc_region.get() == NULL, "post-condition"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
4342 } |
1391
79e419e5ea3b
6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents:
1390
diff
changeset
|
4343 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4344 void G1CollectedHeap::use_retained_old_gc_alloc_region(EvacuationInfo& evacuation_info) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4345 HeapRegion* retained_region = _retained_old_gc_alloc_region; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4346 _retained_old_gc_alloc_region = NULL; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4347 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4348 // We will discard the current GC alloc region if: |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4349 // a) it's in the collection set (it can happen!), |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4350 // b) it's already full (no point in using it), |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4351 // c) it's empty (this means that it was emptied during |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4352 // a cleanup and it should be on the free list now), or |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4353 // d) it's humongous (this means that it was emptied |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4354 // during a cleanup and was added to the free list, but |
10405 | 4355 // has been subsequently used to allocate a humongous |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4356 // object that may be less than the region size). |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4357 if (retained_region != NULL && |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4358 !retained_region->in_collection_set() && |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4359 !(retained_region->top() == retained_region->end()) && |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4360 !retained_region->is_empty() && |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4361 !retained_region->isHumongous()) { |
20274
a8137787acfe
8047821: G1 Does not use the save_marks functionality as intended
mgerdin
parents:
20270
diff
changeset
|
4362 retained_region->record_top_and_timestamp(); |
4072 | 4363 // The retained region was added to the old region set when it was |
4364 // retired. We have to remove it now, since we don't allow regions | |
4365 // we allocate to in the region sets. We'll re-add it later, when | |
4366 // it's retired again. | |
4367 _old_set.remove(retained_region); | |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4368 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
|
4369 retained_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
|
4370 _old_gc_alloc_region.set(retained_region); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4371 _hr_printer.reuse(retained_region); |
10405 | 4372 evacuation_info.set_alloc_regions_used_before(retained_region->used()); |
4373 } | |
4374 } | |
4375 | |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4376 void G1CollectedHeap::init_gc_alloc_regions(EvacuationInfo& evacuation_info) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4377 assert_at_safepoint(true /* should_be_vm_thread */); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4378 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4379 _survivor_gc_alloc_region.init(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4380 _old_gc_alloc_region.init(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4381 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4382 use_retained_old_gc_alloc_region(evacuation_info); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4383 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4384 |
10405 | 4385 void G1CollectedHeap::release_gc_alloc_regions(uint no_of_gc_workers, EvacuationInfo& evacuation_info) { |
4386 evacuation_info.set_allocation_regions(_survivor_gc_alloc_region.count() + | |
4387 _old_gc_alloc_region.count()); | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4388 _survivor_gc_alloc_region.release(); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4389 // If we have an old GC alloc region to release, we'll save it in |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4390 // _retained_old_gc_alloc_region. If we don't |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4391 // _retained_old_gc_alloc_region will become NULL. This is what we |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4392 // want either way so no reason to check explicitly for either |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4393 // condition. |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4394 _retained_old_gc_alloc_region = _old_gc_alloc_region.release(); |
6595 | 4395 |
4396 if (ResizePLAB) { | |
6819 | 4397 _survivor_plab_stats.adjust_desired_plab_sz(no_of_gc_workers); |
4398 _old_plab_stats.adjust_desired_plab_sz(no_of_gc_workers); | |
6595 | 4399 } |
342 | 4400 } |
4401 | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4402 void G1CollectedHeap::abandon_gc_alloc_regions() { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4403 assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4404 assert(_old_gc_alloc_region.get() == NULL, "pre-condition"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4405 _retained_old_gc_alloc_region = NULL; |
342 | 4406 } |
4407 | |
4408 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) { | |
4409 _drain_in_progress = false; | |
4410 set_evac_failure_closure(cl); | |
6197 | 4411 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true); |
342 | 4412 } |
4413 | |
4414 void G1CollectedHeap::finalize_for_evac_failure() { | |
4415 assert(_evac_failure_scan_stack != NULL && | |
4416 _evac_failure_scan_stack->length() == 0, | |
4417 "Postcondition"); | |
4418 assert(!_drain_in_progress, "Postcondition"); | |
1045 | 4419 delete _evac_failure_scan_stack; |
342 | 4420 _evac_failure_scan_stack = NULL; |
4421 } | |
4422 | |
4423 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
|
4424 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
|
4425 |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4426 double remove_self_forwards_start = os::elapsedTime(); |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4427 |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4428 G1ParRemoveSelfForwardPtrsTask rsfp_task(this); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4429 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4430 if (G1CollectedHeap::use_parallel_gc_threads()) { |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4431 set_par_threads(); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4432 workers()->run_task(&rsfp_task); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4433 set_par_threads(0); |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
4434 } else { |
4783
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4435 rsfp_task.work(0); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4436 } |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4437 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4438 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
|
4439 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4440 // 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
|
4441 reset_cset_heap_region_claim_values(); |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4442 |
023652e49ac0
7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents:
4781
diff
changeset
|
4443 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); |
342 | 4444 |
4445 // 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
|
4446 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
|
4447 _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
|
4448 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
|
4449 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
|
4450 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
|
4451 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
|
4452 } |
ad747ee9d0b1
8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents:
7455
diff
changeset
|
4453 _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
|
4454 _preserved_marks_of_objs.clear(true); |
17757
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4455 |
eff02b5bd56c
8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents:
17756
diff
changeset
|
4456 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0); |
342 | 4457 } |
4458 | |
4459 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) { | |
4460 _evac_failure_scan_stack->push(obj); | |
4461 } | |
4462 | |
4463 void G1CollectedHeap::drain_evac_failure_scan_stack() { | |
4464 assert(_evac_failure_scan_stack != NULL, "precondition"); | |
4465 | |
4466 while (_evac_failure_scan_stack->length() > 0) { | |
4467 oop obj = _evac_failure_scan_stack->pop(); | |
4468 _evac_failure_closure->set_region(heap_region_containing(obj)); | |
4469 obj->oop_iterate_backwards(_evac_failure_closure); | |
4470 } | |
4471 } | |
4472 | |
4473 oop | |
10405 | 4474 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
|
4475 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
|
4476 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
|
4477 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
|
4478 (HeapWord*) old)); |
342 | 4479 markOop m = old->mark(); |
4480 oop forward_ptr = old->forward_to_atomic(old); | |
4481 if (forward_ptr == NULL) { | |
4482 // Forward-to-self succeeded. | |
10405 | 4483 assert(_par_scan_state != NULL, "par scan state"); |
4484 OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure(); | |
4485 uint queue_num = _par_scan_state->queue_num(); | |
4486 | |
4487 _evacuation_failed = true; | |
4488 _evacuation_failed_info_array[queue_num].register_copy_failure(old->size()); | |
342 | 4489 if (_evac_failure_closure != cl) { |
4490 MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag); | |
4491 assert(!_drain_in_progress, | |
4492 "Should only be true while someone holds the lock."); | |
4493 // Set the global evac-failure closure to the current thread's. | |
4494 assert(_evac_failure_closure == NULL, "Or locking has failed."); | |
4495 set_evac_failure_closure(cl); | |
4496 // Now do the common part. | |
4497 handle_evacuation_failure_common(old, m); | |
4498 // Reset to NULL. | |
4499 set_evac_failure_closure(NULL); | |
4500 } else { | |
4501 // The lock is already held, and this is recursive. | |
4502 assert(_drain_in_progress, "This should only be the recursive case."); | |
4503 handle_evacuation_failure_common(old, m); | |
4504 } | |
4505 return old; | |
4506 } 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
|
4507 // 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
|
4508 // 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
|
4509 // 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
|
4510 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
|
4511 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
|
4512 "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
|
4513 (HeapWord*) old, (HeapWord*) forward_ptr)); |
342 | 4514 return forward_ptr; |
4515 } | |
4516 } | |
4517 | |
4518 void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) { | |
4519 preserve_mark_if_necessary(old, m); | |
4520 | |
4521 HeapRegion* r = heap_region_containing(old); | |
4522 if (!r->evacuation_failed()) { | |
4523 r->set_evacuation_failed(true); | |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
4524 _hr_printer.evac_failure(r); |
342 | 4525 } |
4526 | |
4527 push_on_evac_failure_scan_stack(old); | |
4528 | |
4529 if (!_drain_in_progress) { | |
4530 // prevent recursion in copy_to_survivor_space() | |
4531 _drain_in_progress = true; | |
4532 drain_evac_failure_scan_stack(); | |
4533 _drain_in_progress = false; | |
4534 } | |
4535 } | |
4536 | |
4537 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
|
4538 assert(evacuation_failed(), "Oversaving!"); |
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4539 // 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
|
4540 // case of a promotion failure. |
74ee0db180fa
6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents:
2037
diff
changeset
|
4541 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
|
4542 _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
|
4543 _preserved_marks_of_objs.push(m); |
342 | 4544 } |
4545 } | |
4546 | |
4547 HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose, | |
4548 size_t word_size) { | |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4549 if (purpose == GCAllocForSurvived) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4550 HeapWord* result = survivor_attempt_allocation(word_size); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4551 if (result != NULL) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4552 return result; |
342 | 4553 } else { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4554 // Let's try to allocate in the old gen in case we can fit the |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4555 // object there. |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4556 return old_attempt_allocation(word_size); |
342 | 4557 } |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4558 } else { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4559 assert(purpose == GCAllocForTenured, "sanity"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4560 HeapWord* result = old_attempt_allocation(word_size); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4561 if (result != NULL) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4562 return result; |
342 | 4563 } else { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4564 // Let's try to allocate in the survivors in case we can fit the |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4565 // object there. |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4566 return survivor_attempt_allocation(word_size); |
342 | 4567 } |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4568 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4569 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4570 ShouldNotReachHere(); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4571 // Trying to keep some compilers happy. |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
4572 return NULL; |
342 | 4573 } |
4574 | |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4575 G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) : |
20215
983092f35ff7
8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents:
20212
diff
changeset
|
4576 ParGCAllocBuffer(gclab_word_size), _retired(true) { } |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4577 |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4578 void G1ParCopyHelper::mark_object(oop obj) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4579 #ifdef ASSERT |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4580 HeapRegion* hr = _g1->heap_region_containing(obj); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4581 assert(hr != NULL, "sanity"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4582 assert(!hr->in_collection_set(), "should not mark objects in the CSet"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4583 #endif // ASSERT |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4584 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4585 // 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
|
4586 _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
|
4587 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4588 |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4589 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
|
4590 #ifdef ASSERT |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4591 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
|
4592 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
|
4593 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
|
4594 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4595 HeapRegion* from_hr = _g1->heap_region_containing(from_obj); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4596 assert(from_hr != NULL, "sanity"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4597 assert(from_hr->in_collection_set(), "from obj should be in the CSet"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4598 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4599 HeapRegion* to_hr = _g1->heap_region_containing(to_obj); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4600 assert(to_hr != NULL, "sanity"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4601 assert(!to_hr->in_collection_set(), "should not mark objects in the CSet"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4602 #endif // ASSERT |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4603 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4604 // 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
|
4605 // 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
|
4606 // 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
|
4607 // image which we know should not be changing. |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4608 _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
|
4609 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4610 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4611 template <class T> |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4612 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
|
4613 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
|
4614 _scanned_klass->record_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4615 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4616 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4617 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4618 template <G1Barrier barrier, G1Mark do_mark_object> |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
838
diff
changeset
|
4619 template <class T> |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
17652
diff
changeset
|
4620 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
|
4621 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
|
4622 |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4623 if (oopDesc::is_null(heap_oop)) { |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4624 return; |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4625 } |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4626 |
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4627 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
|
4628 |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4629 assert(_worker_id == _par_scan_state->queue_num(), "sanity"); |
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4630 |
1261
0414c1049f15
6923991: G1: improve scalability of RSet scanning
iveresov
parents:
1245
diff
changeset
|
4631 if (_g1->in_cset_fast_test(obj)) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4632 oop forwardee; |
526 | 4633 if (obj->is_forwarded()) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4634 forwardee = obj->forwardee(); |
526 | 4635 } else { |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
4636 forwardee = _par_scan_state->copy_to_survivor_space(obj); |
342 | 4637 } |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4638 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
|
4639 oopDesc::encode_store_heap_oop(p, forwardee); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4640 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
|
4641 // 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
|
4642 // 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
|
4643 mark_forwarded_object(obj, forwardee); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4644 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4645 |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4646 if (barrier == G1BarrierKlass) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4647 do_klass_barrier(p, forwardee); |
342 | 4648 } |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4649 } else { |
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4650 // 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
|
4651 // 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
|
4652 if (do_mark_object == G1MarkFromRoot) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4653 mark_object(obj); |
3886
eeae91c9baba
7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents:
3869
diff
changeset
|
4654 } |
526 | 4655 } |
4656 | |
17688
2c2ae9e5f65d
8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents:
17687
diff
changeset
|
4657 if (barrier == G1BarrierEvac) { |
4836
d30fa85f9994
6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents:
4834
diff
changeset
|
4658 _par_scan_state->update_rs(_from, p, _worker_id); |
526 | 4659 } |
17636
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4660 } |
889068b9a088
8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents:
17634
diff
changeset
|
4661 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4662 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
|
4663 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
|
4664 |
342 | 4665 class G1ParEvacuateFollowersClosure : public VoidClosure { |
4666 protected: | |
4667 G1CollectedHeap* _g1h; | |
4668 G1ParScanThreadState* _par_scan_state; | |
4669 RefToScanQueueSet* _queues; | |
4670 ParallelTaskTerminator* _terminator; | |
4671 | |
4672 G1ParScanThreadState* par_scan_state() { return _par_scan_state; } | |
4673 RefToScanQueueSet* queues() { return _queues; } | |
4674 ParallelTaskTerminator* terminator() { return _terminator; } | |
4675 | |
4676 public: | |
4677 G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h, | |
4678 G1ParScanThreadState* par_scan_state, | |
4679 RefToScanQueueSet* queues, | |
4680 ParallelTaskTerminator* terminator) | |
4681 : _g1h(g1h), _par_scan_state(par_scan_state), | |
4682 _queues(queues), _terminator(terminator) {} | |
4683 | |
1862
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4684 void do_void(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4685 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4686 private: |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4687 inline bool offer_termination(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4688 }; |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4689 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4690 bool G1ParEvacuateFollowersClosure::offer_termination() { |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4691 G1ParScanThreadState* const pss = par_scan_state(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4692 pss->start_term_time(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4693 const bool res = terminator()->offer_termination(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4694 pss->end_term_time(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4695 return res; |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4696 } |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4697 |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4698 void G1ParEvacuateFollowersClosure::do_void() { |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4699 G1ParScanThreadState* const pss = par_scan_state(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4700 pss->trim_queue(); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4701 do { |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
4702 pss->steal_and_trim_queue(queues()); |
1862
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4703 } while (!offer_termination()); |
b14ec34b1e07
6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents:
1861
diff
changeset
|
4704 } |
342 | 4705 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4706 class G1KlassScanClosure : public KlassClosure { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4707 G1ParCopyHelper* _closure; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4708 bool _process_only_dirty; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4709 int _count; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4710 public: |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4711 G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4712 : _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
|
4713 void do_klass(Klass* klass) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4714 // 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
|
4715 // 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
|
4716 if (!_process_only_dirty || klass->has_modified_oops()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4717 // 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
|
4718 klass->clear_modified_oops(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4719 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4720 // 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
|
4721 // 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
|
4722 _closure->set_scanned_klass(klass); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4723 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4724 klass->oops_do(_closure); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4725 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4726 _closure->set_scanned_klass(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4727 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4728 _count++; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4729 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4730 }; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4731 |
342 | 4732 class G1ParTask : public AbstractGangTask { |
4733 protected: | |
4734 G1CollectedHeap* _g1h; | |
4735 RefToScanQueueSet *_queues; | |
4736 ParallelTaskTerminator _terminator; | |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4737 uint _n_workers; |
342 | 4738 |
4739 Mutex _stats_lock; | |
4740 Mutex* stats_lock() { return &_stats_lock; } | |
4741 | |
4742 size_t getNCards() { | |
4743 return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1) | |
4744 / G1BlockOffsetSharedArray::N_bytes; | |
4745 } | |
4746 | |
4747 public: | |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
4748 G1ParTask(G1CollectedHeap* g1h, RefToScanQueueSet *task_queues) |
342 | 4749 : AbstractGangTask("G1 collection"), |
4750 _g1h(g1h), | |
4751 _queues(task_queues), | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4752 _terminator(0, _queues), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4753 _stats_lock(Mutex::leaf, "parallel G1 stats lock", true) |
342 | 4754 {} |
4755 | |
4756 RefToScanQueueSet* queues() { return _queues; } | |
4757 | |
4758 RefToScanQueue *work_queue(int i) { | |
4759 return queues()->queue(i); | |
4760 } | |
4761 | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4762 ParallelTaskTerminator* terminator() { return &_terminator; } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4763 |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4764 virtual void set_for_termination(int active_workers) { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4765 // This task calls set_n_termination() in par_non_clean_card_iterate_work() |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4766 // in the young space (_par_seq_tasks) in the G1 heap |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4767 // for SequentialSubTasksDone. |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4768 // This task also uses SubTasksDone in SharedHeap and G1CollectedHeap |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4769 // both of which need setting by set_n_termination(). |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4770 _g1h->SharedHeap::set_n_termination(active_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4771 _g1h->set_n_termination(active_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4772 terminator()->reset_for_reuse(active_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4773 _n_workers = active_workers; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4774 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
4775 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4776 // Helps out with CLD processing. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4777 // |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4778 // During InitialMark we need to: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4779 // 1) Scavenge all CLDs for the young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4780 // 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
|
4781 template <G1Mark do_mark_object> |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4782 class G1CLDClosure : public CLDClosure { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4783 G1ParCopyClosure<G1BarrierNone, do_mark_object>* _oop_closure; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4784 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
|
4785 G1KlassScanClosure _klass_in_cld_closure; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4786 bool _claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4787 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4788 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4789 G1CLDClosure(G1ParCopyClosure<G1BarrierNone, do_mark_object>* oop_closure, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4790 bool only_young, bool claim) |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4791 : _oop_closure(oop_closure), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4792 _oop_in_klass_closure(oop_closure->g1(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4793 oop_closure->pss(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4794 oop_closure->rp()), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4795 _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
|
4796 _claim(claim) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4797 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4798 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4799 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4800 void do_cld(ClassLoaderData* cld) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4801 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
|
4802 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4803 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4804 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4805 class G1CodeBlobClosure: public CodeBlobClosure { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4806 OopClosure* _f; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4807 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4808 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4809 G1CodeBlobClosure(OopClosure* f) : _f(f) {} |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4810 void do_code_blob(CodeBlob* blob) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4811 nmethod* that = blob->as_nmethod_or_null(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4812 if (that != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4813 if (!that->test_set_oops_do_mark()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4814 that->oops_do(_f); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4815 that->fix_oop_relocations(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4816 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4817 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4818 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4819 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4820 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4821 void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
4822 if (worker_id >= _n_workers) return; // no work needed this round |
1611 | 4823 |
4824 double start_time_ms = os::elapsedTime() * 1000.0; | |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4825 _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms); |
1611 | 4826 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4827 { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4828 ResourceMark rm; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4829 HandleMark hm; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4830 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4831 ReferenceProcessor* rp = _g1h->ref_processor_stw(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4832 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
4833 G1ParScanThreadState pss(_g1h, worker_id, rp); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4834 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
4835 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4836 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
|
4837 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4838 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
|
4839 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4840 // Non-IM young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4841 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
|
4842 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
|
4843 only_young, // Only process dirty klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4844 false); // No need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4845 // IM young GC. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4846 // Strong roots closures. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4847 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
|
4848 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
|
4849 false, // Process all klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4850 true); // Need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4851 // Weak roots closures. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4852 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
|
4853 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
|
4854 false, // Process all klasses. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4855 true); // Need to claim CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4856 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4857 G1CodeBlobClosure scan_only_code_cl(&scan_only_root_cl); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4858 G1CodeBlobClosure scan_mark_code_cl(&scan_mark_root_cl); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4859 // IM Weak code roots are handled later. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4860 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4861 OopClosure* strong_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4862 OopClosure* weak_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4863 CLDClosure* strong_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4864 CLDClosure* weak_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4865 CodeBlobClosure* strong_code_cl; |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4866 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4867 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
|
4868 // We also need to mark copied objects. |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4869 strong_root_cl = &scan_mark_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4870 strong_cld_cl = &scan_mark_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4871 strong_code_cl = &scan_mark_code_cl; |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4872 if (ClassUnloadingWithConcurrentMark) { |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4873 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
|
4874 weak_cld_cl = &scan_mark_weak_cld_cl; |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4875 } else { |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4876 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
|
4877 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
|
4878 } |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4879 } else { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4880 strong_root_cl = &scan_only_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4881 weak_root_cl = &scan_only_root_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4882 strong_cld_cl = &scan_only_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4883 weak_cld_cl = &scan_only_cld_cl; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4884 strong_code_cl = &scan_only_code_cl; |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4885 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4886 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4887 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4888 G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4889 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4890 pss.start_strong_roots(); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4891 _g1h->g1_process_roots(strong_root_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4892 weak_root_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4893 &push_heap_rs_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4894 strong_cld_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4895 weak_cld_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4896 strong_code_cl, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4897 worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4898 |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4899 pss.end_strong_roots(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4900 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4901 { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4902 double start = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4903 G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4904 evac.do_void(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4905 double elapsed_ms = (os::elapsedTime()-start)*1000.0; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4906 double term_ms = pss.term_time()*1000.0; |
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
|
4907 _g1h->g1_policy()->phase_times()->add_obj_copy_time(worker_id, elapsed_ms-term_ms); |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4908 _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts()); |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4909 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4910 _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
|
4911 _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
|
4912 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4913 if (ParallelGCVerbose) { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4914 MutexLocker x(stats_lock()); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4915 pss.print_termination_stats(worker_id); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4916 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4917 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
4918 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
|
4919 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
4920 // 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
|
4921 // 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
|
4922 // "GC Worker Time". |
342 | 4923 } |
4924 | |
1611 | 4925 double end_time_ms = os::elapsedTime() * 1000.0; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4926 _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms); |
342 | 4927 } |
4928 }; | |
4929 | |
4930 // *** Common G1 Evacuation Stuff | |
4931 | |
1833
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
4932 // This method is run in a GC worker. |
8b10f48633dc
6984287: Regularize how GC parallel workers are specified.
jmasa
parents:
1755
diff
changeset
|
4933 |
342 | 4934 void |
4935 G1CollectedHeap:: | |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4936 g1_process_roots(OopClosure* scan_non_heap_roots, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4937 OopClosure* scan_non_heap_weak_roots, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4938 OopsInHeapRegionClosure* scan_rs, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4939 CLDClosure* scan_strong_clds, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4940 CLDClosure* scan_weak_clds, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4941 CodeBlobClosure* scan_strong_code, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4942 uint worker_i) { |
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 // First scan the shared roots. |
342 | 4945 double ext_roots_start = os::elapsedTime(); |
4946 double closure_app_time_sec = 0.0; | |
4947 | |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4948 bool during_im = _g1h->g1_policy()->during_initial_mark_pause(); |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4949 bool trace_metadata = during_im && ClassUnloadingWithConcurrentMark; |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4950 |
342 | 4951 BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4952 BufferingOopClosure buf_scan_non_heap_weak_roots(scan_non_heap_weak_roots); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4953 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4954 process_roots(false, // no scoping; this is parallel code |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4955 SharedHeap::SO_None, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4956 &buf_scan_non_heap_roots, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4957 &buf_scan_non_heap_weak_roots, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4958 scan_strong_clds, |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4959 // Unloading Initial Marks handle the weak CLDs separately. |
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4960 (trace_metadata ? NULL : scan_weak_clds), |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4961 scan_strong_code); |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
4962 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4963 // Now the CM ref_processor roots. |
3823
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4964 if (!_process_strong_tasks->is_task_claimed(G1H_PS_refProcessor_oops_do)) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4965 // We need to treat the discovered reference lists of the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4966 // concurrent mark ref processor as roots and keep entries |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4967 // (which are added by the marking threads) on them live |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4968 // until they can be processed at the end of marking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
4969 ref_processor_cm()->weak_oops_do(&buf_scan_non_heap_roots); |
3823
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4970 } |
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4971 |
20282
f3aeae1f9fc5
8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents:
20279
diff
changeset
|
4972 if (trace_metadata) { |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4973 // Barrier to make sure all workers passed |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4974 // the strong CLD and strong nmethods phases. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4975 active_strong_roots_scope()->wait_until_all_workers_done_with_threads(n_par_threads()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4976 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4977 // Now take the complement of the strong CLDs. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4978 ClassLoaderDataGraph::roots_cld_do(NULL, scan_weak_clds); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4979 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4980 |
3823
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4981 // Finish up any enqueued closure apps (attributed as object copy time). |
342 | 4982 buf_scan_non_heap_roots.done(); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4983 buf_scan_non_heap_weak_roots.done(); |
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 double obj_copy_time_sec = buf_scan_non_heap_roots.closure_app_seconds() |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
4986 + buf_scan_non_heap_weak_roots.closure_app_seconds(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
4987 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4988 g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0); |
3823
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4989 |
342 | 4990 double ext_root_time_ms = |
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
|
4991 ((os::elapsedTime() - ext_roots_start) - obj_copy_time_sec) * 1000.0; |
3823
14a2fd14c0db
7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents:
3778
diff
changeset
|
4992 |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
4993 g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms); |
342 | 4994 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4995 // During conc marking we have to filter the per-thread SATB buffers |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4996 // to make sure we remove any oops into the CSet (which will show up |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4997 // as implicitly live). |
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
|
4998 double satb_filtering_ms = 0.0; |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
4999 if (!_process_strong_tasks->is_task_claimed(G1H_PS_filter_satb_buffers)) { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
5000 if (mark_in_progress()) { |
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
|
5001 double satb_filter_start = os::elapsedTime(); |
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
5002 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
5003 JavaThread::satb_mark_queue_set().filter_thread_buffers(); |
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
|
5004 |
bb3f6194fedb
7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents:
6611
diff
changeset
|
5005 satb_filtering_ms = (os::elapsedTime() - satb_filter_start) * 1000.0; |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
5006 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
5007 } |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
5008 g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms); |
342 | 5009 |
5010 // Now scan the complement of the collection set. | |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5011 MarkingCodeBlobClosure scavenge_cs_nmethods(scan_non_heap_weak_roots, CodeBlobToOopClosure::FixRelocations); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5012 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5013 g1_rem_set()->oops_into_collection_set_do(scan_rs, &scavenge_cs_nmethods, worker_i); |
20256
b0b97602393a
8033923: Use BufferingOopClosure for G1 code root scanning
stefank
parents:
20254
diff
changeset
|
5014 |
342 | 5015 _process_strong_tasks->all_tasks_completed(); |
5016 } | |
5017 | |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5018 class G1StringSymbolTableUnlinkTask : public AbstractGangTask { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5019 private: |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5020 BoolObjectClosure* _is_alive; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5021 int _initial_string_table_size; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5022 int _initial_symbol_table_size; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5023 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5024 bool _process_strings; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5025 int _strings_processed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5026 int _strings_removed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5027 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5028 bool _process_symbols; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5029 int _symbols_processed; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5030 int _symbols_removed; |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
5031 |
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
5032 bool _do_in_parallel; |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5033 public: |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5034 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
|
5035 AbstractGangTask("String/Symbol Unlinking"), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5036 _is_alive(is_alive), |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
5037 _do_in_parallel(G1CollectedHeap::use_parallel_gc_threads()), |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5038 _process_strings(process_strings), _strings_processed(0), _strings_removed(0), |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5039 _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5040 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5041 _initial_string_table_size = StringTable::the_table()->table_size(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5042 _initial_symbol_table_size = SymbolTable::the_table()->table_size(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5043 if (process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5044 StringTable::clear_parallel_claimed_index(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5045 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5046 if (process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5047 SymbolTable::clear_parallel_claimed_index(); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5048 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5049 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5050 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5051 ~G1StringSymbolTableUnlinkTask() { |
17652
0eb64cfc0b76
8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents:
17651
diff
changeset
|
5052 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
|
5053 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
|
5054 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
|
5055 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
|
5056 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
|
5057 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
|
5058 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5059 if (G1TraceStringSymbolTableScrubbing) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5060 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
|
5061 "strings: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed, " |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5062 "symbols: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed", |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5063 strings_processed(), strings_removed(), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5064 symbols_processed(), symbols_removed()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5065 } |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5066 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5067 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5068 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
|
5069 if (_do_in_parallel) { |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5070 int strings_processed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5071 int strings_removed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5072 int symbols_processed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5073 int symbols_removed = 0; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5074 if (_process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5075 StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5076 Atomic::add(strings_processed, &_strings_processed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5077 Atomic::add(strings_removed, &_strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5078 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5079 if (_process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5080 SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5081 Atomic::add(symbols_processed, &_symbols_processed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5082 Atomic::add(symbols_removed, &_symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5083 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5084 } else { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5085 if (_process_strings) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5086 StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5087 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5088 if (_process_symbols) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5089 SymbolTable::unlink(&_symbols_processed, &_symbols_removed); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5090 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5091 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5092 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5093 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5094 size_t strings_processed() const { return (size_t)_strings_processed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5095 size_t strings_removed() const { return (size_t)_strings_removed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5096 |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5097 size_t symbols_processed() const { return (size_t)_symbols_processed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5098 size_t symbols_removed() const { return (size_t)_symbols_removed; } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5099 }; |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5100 |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5101 class G1CodeCacheUnloadingTask VALUE_OBJ_CLASS_SPEC { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5102 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5103 static Monitor* _lock; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5104 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5105 BoolObjectClosure* const _is_alive; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5106 const bool _unloading_occurred; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5107 const uint _num_workers; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5108 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5109 // Variables used to claim nmethods. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5110 nmethod* _first_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5111 volatile nmethod* _claimed_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5112 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5113 // 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
|
5114 volatile nmethod* _postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5115 volatile uint _num_entered_barrier; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5116 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5117 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5118 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
|
5119 _is_alive(is_alive), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5120 _unloading_occurred(unloading_occurred), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5121 _num_workers(num_workers), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5122 _first_nmethod(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5123 _claimed_nmethod(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5124 _postponed_list(NULL), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5125 _num_entered_barrier(0) |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5126 { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5127 nmethod::increase_unloading_clock(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5128 _first_nmethod = CodeCache::alive_nmethod(CodeCache::first()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5129 _claimed_nmethod = (volatile nmethod*)_first_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5130 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5131 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5132 ~G1CodeCacheUnloadingTask() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5133 CodeCache::verify_clean_inline_caches(); |
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 CodeCache::set_needs_cache_clean(false); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5136 guarantee(CodeCache::scavenge_root_nmethods() == NULL, "Must be"); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5137 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5138 CodeCache::verify_icholder_relocations(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5139 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5140 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5141 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5142 void add_to_postponed_list(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5143 nmethod* old; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5144 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5145 old = (nmethod*)_postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5146 nm->set_unloading_next(old); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5147 } 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
|
5148 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5149 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5150 void clean_nmethod(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5151 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
|
5152 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5153 if (postponed) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5154 // 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
|
5155 add_to_postponed_list(nm); |
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 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5158 // Mark that this thread has been cleaned/unloaded. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5159 // 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
|
5160 nm->set_unloading_clock(nmethod::global_unloading_clock()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5161 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5162 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5163 void clean_nmethod_postponed(nmethod* nm) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5164 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
|
5165 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5166 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5167 static const int MaxClaimNmethods = 16; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5168 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5169 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
|
5170 nmethod* first; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5171 nmethod* last; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5172 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5173 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5174 *num_claimed_nmethods = 0; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5175 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5176 first = last = (nmethod*)_claimed_nmethod; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5177 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5178 if (first != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5179 for (int i = 0; i < MaxClaimNmethods; i++) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5180 last = CodeCache::alive_nmethod(CodeCache::next(last)); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5181 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5182 if (last == NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5183 break; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5184 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5185 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5186 claimed_nmethods[i] = last; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5187 (*num_claimed_nmethods)++; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5188 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5189 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5190 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5191 } 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
|
5192 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5193 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5194 nmethod* claim_postponed_nmethod() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5195 nmethod* claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5196 nmethod* next; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5197 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5198 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5199 claim = (nmethod*)_postponed_list; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5200 if (claim == NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5201 return NULL; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5202 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5203 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5204 next = claim->unloading_next(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5205 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5206 } 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
|
5207 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5208 return claim; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5209 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5210 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5211 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5212 // 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
|
5213 void barrier_mark(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5214 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5215 _num_entered_barrier++; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5216 if (_num_entered_barrier == _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5217 ml.notify_all(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5218 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5219 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5220 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5221 // 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
|
5222 // finish their first-pass nmethod cleaning work. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5223 void barrier_wait(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5224 if (_num_entered_barrier < _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5225 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5226 while (_num_entered_barrier < _num_workers) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5227 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
|
5228 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5229 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5230 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5231 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5232 // 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
|
5233 // 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
|
5234 void work_first_pass(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5235 // 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
|
5236 if (worker_id == 0 && _first_nmethod != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5237 clean_nmethod(_first_nmethod); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5238 _first_nmethod = NULL; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5239 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5240 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5241 int num_claimed_nmethods; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5242 nmethod* claimed_nmethods[MaxClaimNmethods]; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5243 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5244 while (true) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5245 claim_nmethods(claimed_nmethods, &num_claimed_nmethods); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5246 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5247 if (num_claimed_nmethods == 0) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5248 break; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5249 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5250 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5251 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
|
5252 clean_nmethod(claimed_nmethods[i]); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5253 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5254 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5255 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5256 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5257 void work_second_pass(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5258 nmethod* nm; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5259 // Take care of postponed nmethods. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5260 while ((nm = claim_postponed_nmethod()) != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5261 clean_nmethod_postponed(nm); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5262 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5263 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5264 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5265 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5266 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
|
5267 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5268 class G1KlassCleaningTask : public StackObj { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5269 BoolObjectClosure* _is_alive; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5270 volatile jint _clean_klass_tree_claimed; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5271 ClassLoaderDataGraphKlassIteratorAtomic _klass_iterator; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5272 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5273 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5274 G1KlassCleaningTask(BoolObjectClosure* is_alive) : |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5275 _is_alive(is_alive), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5276 _clean_klass_tree_claimed(0), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5277 _klass_iterator() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5278 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5279 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5280 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5281 bool claim_clean_klass_tree_task() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5282 if (_clean_klass_tree_claimed) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5283 return false; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5284 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5285 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5286 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
|
5287 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5288 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5289 InstanceKlass* claim_next_klass() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5290 Klass* klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5291 do { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5292 klass =_klass_iterator.next_klass(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5293 } while (klass != NULL && !klass->oop_is_instance()); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5294 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5295 return (InstanceKlass*)klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5296 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5297 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5298 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5299 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5300 void clean_klass(InstanceKlass* ik) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5301 ik->clean_implementors_list(_is_alive); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5302 ik->clean_method_data(_is_alive); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5303 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5304 // G1 specific cleanup work that has |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5305 // been moved here to be done in parallel. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5306 ik->clean_dependent_nmethods(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5307 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5308 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5309 void work() { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5310 ResourceMark rm; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5311 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5312 // 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
|
5313 if (claim_clean_klass_tree_task()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5314 Klass::clean_subklass_tree(_is_alive); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5315 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5316 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5317 // All workers will help cleaning the classes, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5318 InstanceKlass* klass; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5319 while ((klass = claim_next_klass()) != NULL) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5320 clean_klass(klass); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5321 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5322 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5323 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5324 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5325 // 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
|
5326 class G1ParallelCleaningTask : public AbstractGangTask { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5327 private: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5328 G1StringSymbolTableUnlinkTask _string_symbol_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5329 G1CodeCacheUnloadingTask _code_cache_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5330 G1KlassCleaningTask _klass_cleaning_task; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5331 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5332 public: |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5333 // The constructor is run in the VMThread. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5334 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
|
5335 AbstractGangTask("Parallel Cleaning"), |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5336 _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
|
5337 _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
|
5338 _klass_cleaning_task(is_alive) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5339 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5340 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5341 // The parallel work done by all worker threads. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5342 void work(uint worker_id) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5343 // Do first pass of code cache cleaning. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5344 _code_cache_task.work_first_pass(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5345 |
20279 | 5346 // 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
|
5347 _code_cache_task.barrier_mark(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5348 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5349 // Clean the Strings and Symbols. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5350 _string_symbol_task.work(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5351 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5352 // 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
|
5353 _code_cache_task.barrier_wait(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5354 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5355 // 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
|
5356 // the liveness information gathered during the first pass. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5357 _code_cache_task.work_second_pass(worker_id); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5358 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5359 // Clean all klasses that were not unloaded. |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5360 _klass_cleaning_task.work(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5361 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5362 }; |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5363 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5364 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5365 void G1CollectedHeap::parallel_cleaning(BoolObjectClosure* is_alive, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5366 bool process_strings, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5367 bool process_symbols, |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5368 bool class_unloading_occurred) { |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5369 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
|
5370 workers()->active_workers() : 1); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5371 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5372 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
|
5373 n_workers, class_unloading_occurred); |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5374 if (G1CollectedHeap::use_parallel_gc_threads()) { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5375 set_par_threads(n_workers); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5376 workers()->run_task(&g1_unlink_task); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5377 set_par_threads(0); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5378 } else { |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5379 g1_unlink_task.work(0); |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5380 } |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5381 } |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5382 |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5383 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
|
5384 bool process_strings, bool process_symbols) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5385 { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5386 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ? |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5387 _g1h->workers()->active_workers() : 1); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5388 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
|
5389 if (G1CollectedHeap::use_parallel_gc_threads()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5390 set_par_threads(n_workers); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5391 workers()->run_task(&g1_unlink_task); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5392 set_par_threads(0); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5393 } else { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5394 g1_unlink_task.work(0); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5395 } |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5396 } |
17764 | 5397 |
5398 if (G1StringDedup::is_enabled()) { | |
5399 G1StringDedup::unlink(is_alive); | |
5400 } | |
17634
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5401 } |
5a32d2a3cc1e
8027476: Improve performance of Stringtable unlink
tschatzl
parents:
13400
diff
changeset
|
5402 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5403 class G1RedirtyLoggedCardsTask : public AbstractGangTask { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5404 private: |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5405 DirtyCardQueueSet* _queue; |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5406 public: |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5407 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
|
5408 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5409 virtual void work(uint worker_id) { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5410 double start_time = os::elapsedTime(); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5411 |
20217
6b52700a896b
8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents:
20216
diff
changeset
|
5412 RedirtyLoggedCardTableEntryClosure cl; |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5413 if (G1CollectedHeap::heap()->use_parallel_gc_threads()) { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5414 _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
|
5415 } else { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5416 _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
|
5417 } |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5418 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5419 G1GCPhaseTimes* timer = G1CollectedHeap::heap()->g1_policy()->phase_times(); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5420 timer->record_redirty_logged_cards_time_ms(worker_id, (os::elapsedTime() - start_time) * 1000.0); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5421 timer->record_redirty_logged_cards_processed_cards(worker_id, cl.num_processed()); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5422 } |
17756
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5423 }; |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5424 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5425 void G1CollectedHeap::redirty_logged_cards() { |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5426 guarantee(G1DeferredRSUpdate, "Must only be called when using deferred RS updates."); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5427 double redirty_logged_cards_start = os::elapsedTime(); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5428 |
20216
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5429 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
|
5430 _g1h->workers()->active_workers() : 1); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5431 |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5432 G1RedirtyLoggedCardsTask redirty_task(&dirty_card_queue_set()); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5433 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
|
5434 if (use_parallel_gc_threads()) { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5435 set_par_threads(n_workers); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5436 workers()->run_task(&redirty_task); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5437 set_par_threads(0); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5438 } else { |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5439 redirty_task.work(0); |
570cb6369f17
8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents:
20215
diff
changeset
|
5440 } |
17756
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5441 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5442 DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set(); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5443 dcq.merge_bufferlists(&dirty_card_queue_set()); |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5444 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
|
5445 |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5446 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
|
5447 } |
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
5448 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5449 // Weak Reference Processing support |
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 // An always "is_alive" closure that is used to preserve referents. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5452 // 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
|
5453 // of referent objects that are pointed to by reference objects |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5454 // discovered by the CM ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5455 class G1AlwaysAliveClosure: public BoolObjectClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5456 G1CollectedHeap* _g1; |
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 G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5459 bool do_object_b(oop p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5460 if (p != NULL) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5461 return true; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5462 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5463 return false; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5464 } |
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 bool G1STWIsAliveClosure::do_object_b(oop p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5468 // An object is reachable if it is outside the collection set, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5469 // or is inside and copied. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5470 return !_g1->obj_in_cs(p) || p->is_forwarded(); |
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 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5473 // Non Copying Keep Alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5474 class G1KeepAliveClosure: public OopClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5475 G1CollectedHeap* _g1; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5476 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5477 G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5478 void do_oop(narrowOop* p) { guarantee(false, "Not needed"); } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5479 void do_oop( oop* p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5480 oop obj = *p; |
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 if (_g1->obj_in_cs(obj)) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5483 assert( obj->is_forwarded(), "invariant" ); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5484 *p = obj->forwardee(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5485 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5486 } |
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 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5489 // Copying Keep Alive closure - can be called from both |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5490 // serial and parallel code as long as different worker |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5491 // threads utilize different G1ParScanThreadState instances |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5492 // and different queues. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5493 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5494 class G1CopyingKeepAliveClosure: public OopClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5495 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5496 OopClosure* _copy_non_heap_obj_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5497 G1ParScanThreadState* _par_scan_state; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5498 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5499 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5500 G1CopyingKeepAliveClosure(G1CollectedHeap* g1h, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5501 OopClosure* non_heap_obj_cl, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5502 G1ParScanThreadState* pss): |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5503 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5504 _copy_non_heap_obj_cl(non_heap_obj_cl), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5505 _par_scan_state(pss) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5506 {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5507 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5508 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5509 virtual void do_oop( oop* p) { do_oop_work(p); } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5510 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5511 template <class T> void do_oop_work(T* p) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5512 oop obj = oopDesc::load_decode_heap_oop(p); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5513 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5514 if (_g1h->obj_in_cs(obj)) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5515 // If the referent object has been forwarded (either copied |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5516 // 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
|
5517 // evacuation failure) then we need to update the reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5518 // field and, if both reference and referent are in the G1 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5519 // heap, update the RSet for the referent. |
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 the referent has not been forwarded then we have to keep |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5522 // it alive by policy. Therefore we have copy the referent. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5523 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5524 // 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
|
5525 // on the PSS queue. When the queue is drained (after each |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5526 // phase of reference processing) the object and it's followers |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5527 // will be copied, the reference field set to point to the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5528 // 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
|
5529 // use the the non-heap or metadata closures directly to copy |
10405 | 5530 // the referent object and update the pointer, while avoiding |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5531 // updating the RSet. |
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 if (_g1h->is_in_g1_reserved(p)) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5534 _par_scan_state->push_on_queue(p); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5535 } else { |
17935
7384f6a12fc1
8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents:
17866
diff
changeset
|
5536 assert(!Metaspace::contains((const void*)p), |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5537 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
|
5538 PTR_FORMAT, p)); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5539 _copy_non_heap_obj_cl->do_oop(p); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5540 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5541 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5542 } |
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 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5545 // Serial drain queue closure. Called as the 'complete_gc' |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5546 // closure for each discovered list in some of the |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5547 // reference processing phases. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5548 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5549 class G1STWDrainQueueClosure: public VoidClosure { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5550 protected: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5551 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5552 G1ParScanThreadState* _par_scan_state; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5553 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5554 G1ParScanThreadState* par_scan_state() { return _par_scan_state; } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5555 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5556 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5557 G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5558 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5559 _par_scan_state(pss) |
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 void do_void() { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5563 G1ParScanThreadState* const pss = par_scan_state(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5564 pss->trim_queue(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5565 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5566 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5567 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5568 // Parallel Reference Processing closures |
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 // Implementation of AbstractRefProcTaskExecutor for parallel reference |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5571 // processing during G1 evacuation pauses. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5572 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5573 class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5574 private: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5575 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5576 RefToScanQueueSet* _queues; |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5577 FlexibleWorkGang* _workers; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5578 int _active_workers; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5579 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5580 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5581 G1STWRefProcTaskExecutor(G1CollectedHeap* g1h, |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5582 FlexibleWorkGang* workers, |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5583 RefToScanQueueSet *task_queues, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5584 int n_workers) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5585 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5586 _queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5587 _workers(workers), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5588 _active_workers(n_workers) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5589 { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5590 assert(n_workers > 0, "shouldn't call this otherwise"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5591 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5592 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5593 // Executes the given task using concurrent marking worker threads. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5594 virtual void execute(ProcessTask& task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5595 virtual void execute(EnqueueTask& task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5596 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5597 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5598 // Gang task for possibly parallel reference processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5599 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5600 class G1STWRefProcTaskProxy: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5601 typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5602 ProcessTask& _proc_task; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5603 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5604 RefToScanQueueSet *_task_queues; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5605 ParallelTaskTerminator* _terminator; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5606 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5607 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5608 G1STWRefProcTaskProxy(ProcessTask& proc_task, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5609 G1CollectedHeap* g1h, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5610 RefToScanQueueSet *task_queues, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5611 ParallelTaskTerminator* terminator) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5612 AbstractGangTask("Process reference objects in parallel"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5613 _proc_task(proc_task), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5614 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5615 _task_queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5616 _terminator(terminator) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5617 {} |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5618 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5619 virtual void work(uint worker_id) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5620 // The reference processing task executed by a single worker. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5621 ResourceMark rm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5622 HandleMark hm; |
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 G1STWIsAliveClosure is_alive(_g1h); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5625 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5626 G1ParScanThreadState pss(_g1h, worker_id, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5627 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5628 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5629 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5630 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5631 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5632 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5633 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5634 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5635 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5636 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5637 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5638 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5639 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5640 } |
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 // Keep alive closure. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5643 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5644 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5645 // Complete GC closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5646 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5647 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5648 // 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
|
5649 _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
|
5650 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5651 // 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
|
5652 // of the processing tasks (specifically phase2 - pp2_work) execute |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5653 // the complete_gc closure (which ordinarily would drain the queue) so |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5654 // the queue may not be empty. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5655 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5656 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5657 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5658 // Driver routine for parallel reference processing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5659 // Creates an instance of the ref processing gang |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5660 // task and has the worker threads execute it. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5661 void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5662 assert(_workers != NULL, "Need parallel worker threads."); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5663 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5664 ParallelTaskTerminator terminator(_active_workers, _queues); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5665 G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5666 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5667 _g1h->set_par_threads(_active_workers); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5668 _workers->run_task(&proc_task_proxy); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5669 _g1h->set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5670 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5671 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5672 // Gang task for parallel reference enqueueing. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5673 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5674 class G1STWRefEnqueueTaskProxy: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5675 typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5676 EnqueueTask& _enq_task; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5677 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5678 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5679 G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5680 AbstractGangTask("Enqueue reference objects in parallel"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5681 _enq_task(enq_task) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5682 { } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5683 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5684 virtual void work(uint worker_id) { |
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5685 _enq_task.work(worker_id); |
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 |
10405 | 5689 // Driver routine for parallel reference enqueueing. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5690 // Creates an instance of the ref enqueueing gang |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5691 // task and has the worker threads execute it. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5692 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5693 void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5694 assert(_workers != NULL, "Need parallel worker threads."); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5695 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5696 G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5697 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5698 _g1h->set_par_threads(_active_workers); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5699 _workers->run_task(&enq_task_proxy); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5700 _g1h->set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5701 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5702 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5703 // End of weak reference support closures |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5704 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5705 // Abstract task used to preserve (i.e. copy) any referent objects |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5706 // 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
|
5707 // objects discovered by the CM ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5708 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5709 class G1ParPreserveCMReferentsTask: public AbstractGangTask { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5710 protected: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5711 G1CollectedHeap* _g1h; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5712 RefToScanQueueSet *_queues; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5713 ParallelTaskTerminator _terminator; |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5714 uint _n_workers; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5715 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5716 public: |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5717 G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) : |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5718 AbstractGangTask("ParPreserveCMReferents"), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5719 _g1h(g1h), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5720 _queues(task_queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5721 _terminator(workers, _queues), |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5722 _n_workers(workers) |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5723 { } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5724 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5725 void work(uint worker_id) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5726 ResourceMark rm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5727 HandleMark hm; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5728 |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5729 G1ParScanThreadState pss(_g1h, worker_id, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5730 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5731 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5732 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5733 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5734 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
|
5735 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5736 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5737 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5738 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5739 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5740 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5741 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5742 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5743 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5744 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5745 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5746 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5747 // Is alive closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5748 G1AlwaysAliveClosure always_alive(_g1h); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5749 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5750 // Copying keep alive closure. Applied to referent objects that need |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5751 // to be copied. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5752 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5753 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5754 ReferenceProcessor* rp = _g1h->ref_processor_cm(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5755 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5756 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
|
5757 uint stride = MIN2(MAX2(_n_workers, 1U), limit); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5758 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5759 // 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
|
5760 // 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
|
5761 // change the worker ids. |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5762 assert(0 <= worker_id && worker_id < limit, "sanity"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5763 assert(!rp->discovery_is_atomic(), "check this code"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5764 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5765 // 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
|
5766 for (uint idx = worker_id; idx < limit; idx += stride) { |
4014
bf2d2b8b1726
7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents:
4013
diff
changeset
|
5767 DiscoveredList& ref_list = rp->discovered_refs()[idx]; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5768 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5769 DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5770 while (iter.has_next()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5771 // Since discovery is not atomic for the CM ref processor, we |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5772 // can see some null referent objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5773 iter.load_ptrs(DEBUG_ONLY(true)); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5774 oop ref = iter.obj(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5775 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5776 // This will filter nulls. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5777 if (iter.is_referent_alive()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5778 iter.make_referent_alive(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5779 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5780 iter.move_to_next(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5781 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5782 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5783 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5784 // Drain the queue - which may cause stealing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5785 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5786 drain_queue.do_void(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5787 // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5788 assert(pss.queue_is_empty(), "should be"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5789 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5790 }; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5791 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5792 // Weak Reference processing during an evacuation pause (part 1). |
6819 | 5793 void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5794 double ref_proc_start = os::elapsedTime(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5795 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5796 ReferenceProcessor* rp = _ref_processor_stw; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5797 assert(rp->discovery_enabled(), "should have been enabled"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5798 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5799 // Any reference objects, in the collection set, that were 'discovered' |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5800 // 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
|
5801 // applying the external root copy closure to the discovered lists, or |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5802 // by following an RSet entry). |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5803 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5804 // 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
|
5805 // 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
|
5806 // processor would have seen that the reference object had already |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5807 // been 'discovered' and would have skipped discovering the reference, |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5808 // but would not have treated the reference object as a regular oop. |
10405 | 5809 // 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
|
5810 // referent object. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5811 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5812 // We need to explicitly copy these referent objects - the references |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5813 // will be processed at the end of remarking. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5814 // |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5815 // 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
|
5816 // 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
|
5817 // referents points to another object which is also referenced by an |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5818 // object discovered by the STW ref processor. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5819 |
4711 | 5820 assert(!G1CollectedHeap::use_parallel_gc_threads() || |
6819 | 5821 no_of_gc_workers == workers()->active_workers(), |
5822 "Need to reset active GC workers"); | |
5823 | |
5824 set_par_threads(no_of_gc_workers); | |
5825 G1ParPreserveCMReferentsTask keep_cm_referents(this, | |
5826 no_of_gc_workers, | |
5827 _task_queues); | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5828 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5829 if (G1CollectedHeap::use_parallel_gc_threads()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5830 workers()->run_task(&keep_cm_referents); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5831 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5832 keep_cm_referents.work(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5833 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5834 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5835 set_par_threads(0); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5836 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5837 // Closure to test whether a referent is alive. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5838 G1STWIsAliveClosure is_alive(this); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5839 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5840 // Even when parallel reference processing is enabled, the processing |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5841 // 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
|
5842 // 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
|
5843 // JNI refs. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5844 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5845 // Use only a single queue for this PSS. |
17689
5d492d192cbf
8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents:
17688
diff
changeset
|
5846 G1ParScanThreadState pss(this, 0, NULL); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5847 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5848 // We do not embed a reference processor in the copying/scanning |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5849 // closures while we're actually processing the discovered |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5850 // reference objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5851 G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL); |
17759
bc22cbb8b45a
8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents:
17758
diff
changeset
|
5852 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5853 pss.set_evac_failure_closure(&evac_failure_cl); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5854 |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5855 assert(pss.queue_is_empty(), "pre-condition"); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5856 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5857 G1ParScanExtRootClosure only_copy_non_heap_cl(this, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5858 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5859 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5860 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5861 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5862 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5863 if (_g1h->g1_policy()->during_initial_mark_pause()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5864 // We also need to mark copied objects. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5865 copy_non_heap_cl = ©_mark_non_heap_cl; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5866 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5867 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5868 // Keep alive closure. |
20270
b7d24d2bc8be
8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents:
20257
diff
changeset
|
5869 G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, &pss); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5870 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5871 // Serial Complete GC closure |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5872 G1STWDrainQueueClosure drain_queue(this, &pss); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5873 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5874 // Setup the soft refs policy... |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5875 rp->setup_policy(false); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5876 |
10405 | 5877 ReferenceProcessorStats stats; |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5878 if (!rp->processing_is_mt()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5879 // Serial reference processing... |
10405 | 5880 stats = rp->process_discovered_references(&is_alive, |
5881 &keep_alive, | |
5882 &drain_queue, | |
5883 NULL, | |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5884 _gc_timer_stw, |
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5885 _gc_tracer_stw->gc_id()); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5886 } else { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5887 // Parallel reference processing |
6819 | 5888 assert(rp->num_q() == no_of_gc_workers, "sanity"); |
5889 assert(no_of_gc_workers <= rp->max_num_q(), "sanity"); | |
5890 | |
5891 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers); | |
10405 | 5892 stats = rp->process_discovered_references(&is_alive, |
5893 &keep_alive, | |
5894 &drain_queue, | |
5895 &par_task_executor, | |
20190
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5896 _gc_timer_stw, |
0982ec23da03
8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents:
17992
diff
changeset
|
5897 _gc_tracer_stw->gc_id()); |
10405 | 5898 } |
5899 | |
5900 _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
|
5901 |
983092f35ff7
8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents:
20212
diff
changeset
|
5902 // We have completed copying any necessary live referent objects. |
20224
a2328cbebb23
8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents:
20223
diff
changeset
|
5903 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
|
5904 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5905 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
|
5906 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
|
5907 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5908 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5909 // Weak Reference processing during an evacuation pause (part 2). |
6819 | 5910 void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5911 double ref_enq_start = os::elapsedTime(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5912 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5913 ReferenceProcessor* rp = _ref_processor_stw; |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5914 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
|
5915 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5916 // Now enqueue any remaining on the discovered lists on to |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5917 // the pending list. |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5918 if (!rp->processing_is_mt()) { |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5919 // Serial reference processing... |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5920 rp->enqueue_discovered_references(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5921 } else { |
10405 | 5922 // Parallel reference enqueueing |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5923 |
6819 | 5924 assert(no_of_gc_workers == workers()->active_workers(), |
5925 "Need to reset active workers"); | |
5926 assert(rp->num_q() == no_of_gc_workers, "sanity"); | |
5927 assert(no_of_gc_workers <= rp->max_num_q(), "sanity"); | |
5928 | |
5929 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
|
5930 rp->enqueue_discovered_references(&par_task_executor); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5931 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5932 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5933 rp->verify_no_references_recorded(); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5934 assert(!rp->discovery_enabled(), "should have been disabled"); |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5935 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5936 // FIXME |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5937 // 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
|
5938 // Should we do that here also? We could, but it is a serial operation |
10405 | 5939 // and could significantly increase the pause time. |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5940 |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5941 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
|
5942 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
|
5943 } |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
5944 |
10405 | 5945 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
|
5946 _expand_heap_after_alloc_failure = true; |
10405 | 5947 _evacuation_failed = false; |
342 | 5948 |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
5949 // 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
|
5950 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
|
5951 |
342 | 5952 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
|
5953 |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5954 // Disable the hot card cache. |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
5955 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
|
5956 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
|
5957 hot_card_cache->set_use_cache(false); |
889 | 5958 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
5959 uint n_workers; |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5960 if (G1CollectedHeap::use_parallel_gc_threads()) { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5961 n_workers = |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5962 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5963 workers()->active_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5964 Threads::number_of_non_daemon_threads()); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5965 assert(UseDynamicNumberOfGCThreads || |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5966 n_workers == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5967 "If not dynamic should be using all the workers"); |
4711 | 5968 workers()->set_active_workers(n_workers); |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5969 set_par_threads(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5970 } else { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5971 assert(n_par_threads() == 0, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5972 "Should be the original non-parallel value"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5973 n_workers = 1; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5974 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5975 |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
5976 G1ParTask g1_par_task(this, _task_queues); |
342 | 5977 |
5978 init_for_evac_failure(NULL); | |
5979 | |
5980 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
|
5981 |
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
5982 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
|
5983 double start_par_time_sec = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5984 double end_par_time_sec; |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5985 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5986 { |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
890
diff
changeset
|
5987 StrongRootsScope srs(this); |
20278
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5988 // 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
|
5989 if (g1_policy()->during_initial_mark_pause()) { |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5990 ClassLoaderDataGraph::clear_claimed_marks(); |
2c6ef90f030a
8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents:
20274
diff
changeset
|
5991 } |
5986
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5992 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5993 if (G1CollectedHeap::use_parallel_gc_threads()) { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5994 // 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
|
5995 if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5996 // These tasks use ShareHeap::_process_strong_tasks |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5997 assert(UseDynamicNumberOfGCThreads || |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5998 workers()->active_workers() == workers()->total_workers(), |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
5999 "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
|
6000 workers()->run_task(&g1_par_task); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6001 } else { |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6002 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
|
6003 g1_par_task.work(0); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6004 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6005 end_par_time_sec = os::elapsedTime(); |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6006 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6007 // Closing the inner scope will execute the destructor |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6008 // for the StrongRootsScope object. We record the current |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6009 // elapsed time before closing the scope so that time |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6010 // taken for the SRS destructor is NOT included in the |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6011 // reported parallel time. |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6012 } |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6013 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6014 double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
6015 g1_policy()->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
|
6016 |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6017 double code_root_fixup_time_ms = |
500023bd0818
7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents:
5963
diff
changeset
|
6018 (os::elapsedTime() - end_par_time_sec) * 1000.0; |
6219
922993931b3d
7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents:
6188
diff
changeset
|
6019 g1_policy()->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
|
6020 |
342 | 6021 set_par_threads(0); |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
6022 |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6023 // Process any discovered reference objects - we have |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6024 // to do this _before_ we retire the GC alloc regions |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6025 // as we may have to copy some 'reachable' referent |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6026 // objects (and their reachable sub-graphs) that were |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6027 // not copied during the pause. |
6819 | 6028 process_discovered_references(n_workers); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6029 |
1974
fd1d227ef1b9
6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents:
1973
diff
changeset
|
6030 // Weak root processing. |
342 | 6031 { |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6032 G1STWIsAliveClosure is_alive(this); |
342 | 6033 G1KeepAliveClosure keep_alive(this); |
6034 JNIHandles::weak_oops_do(&is_alive, &keep_alive); | |
17764 | 6035 if (G1StringDedup::is_enabled()) { |
6036 G1StringDedup::unlink_or_oops_do(&is_alive, &keep_alive); | |
6037 } | |
342 | 6038 } |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6039 |
10405 | 6040 release_gc_alloc_regions(n_workers, evacuation_info); |
342 | 6041 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
|
6042 |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
6043 // 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
|
6044 // 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
|
6045 // 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
|
6046 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
|
6047 hot_card_cache->set_use_cache(true); |
342 | 6048 |
12080 | 6049 // Migrate the strong code roots attached to each region in |
6050 // the collection set. Ideally we would like to do this | |
6051 // after we have finished the scanning/evacuation of the | |
6052 // strong code roots for a particular heap region. | |
6053 migrate_strong_code_roots(); | |
6054 | |
17753
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6055 purge_code_root_memory(); |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6056 |
12080 | 6057 if (g1_policy()->during_initial_mark_pause()) { |
6058 // Reset the claim values set during marking the strong code roots | |
6059 reset_heap_region_claim_values(); | |
6060 } | |
6061 | |
342 | 6062 finalize_for_evac_failure(); |
6063 | |
6064 if (evacuation_failed()) { | |
6065 remove_self_forwarding_pointers(); | |
6629
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
6066 |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
6067 // Reset the G1EvacuationFailureALot counters and flags |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
6068 // 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
|
6069 // evacuation failure occurs. |
c9814fadeb38
7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents:
6628
diff
changeset
|
6070 NOT_PRODUCT(reset_evacuation_should_fail();) |
342 | 6071 } |
6072 | |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6073 // Enqueue any remaining references remaining on the STW |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6074 // reference processor's discovered lists. We need to do |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6075 // this after the card table is cleaned (and verified) as |
10405 | 6076 // the act of enqueueing entries on to the pending list |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6077 // will log these updates (and dirty their associated |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6078 // cards). We need these updates logged to update any |
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6079 // RSets. |
6819 | 6080 enqueue_discovered_references(n_workers); |
3979
4dfb2df418f2
6484982: G1: process references during evacuation pauses
johnc
parents:
3973
diff
changeset
|
6081 |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
6082 if (G1DeferredRSUpdate) { |
17756
a07bea31ef35
8035398: Add card redirty time in "Other" time in G1
tschatzl
parents:
17755
diff
changeset
|
6083 redirty_logged_cards(); |
616
4f360ec815ba
6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents:
595
diff
changeset
|
6084 } |
342 | 6085 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
6086 } | |
6087 | |
2152 | 6088 void G1CollectedHeap::free_region(HeapRegion* hr, |
6089 FreeRegionList* free_list, | |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6090 bool par, |
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6091 bool locked) { |
2152 | 6092 assert(!hr->isHumongous(), "this is only for non-humongous regions"); |
6093 assert(!hr->is_empty(), "the region should not be empty"); | |
6094 assert(free_list != NULL, "pre-condition"); | |
6095 | |
10246
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
6096 // 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
|
6097 // 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
|
6098 // (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
|
6099 if (!hr->is_young()) { |
194f52aa2f23
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents:
10242
diff
changeset
|
6100 _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
|
6101 } |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6102 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
|
6103 free_list->add_ordered(hr); |
2152 | 6104 } |
6105 | |
6106 void G1CollectedHeap::free_humongous_region(HeapRegion* hr, | |
6107 FreeRegionList* free_list, | |
6108 bool par) { | |
6109 assert(hr->startsHumongous(), "this is only for starts humongous regions"); | |
6110 assert(free_list != NULL, "pre-condition"); | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6111 |
2152 | 6112 size_t hr_capacity = hr->capacity(); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
6113 // 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
|
6114 // otherwise the information will be gone. |
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
6115 uint last_index = hr->last_hc_index(); |
2152 | 6116 hr->set_notHumongous(); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6117 free_region(hr, free_list, par); |
2152 | 6118 |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
6119 uint i = hr->hrs_index() + 1; |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
6120 while (i < last_index) { |
3766 | 6121 HeapRegion* curr_hr = region_at(i); |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6220
diff
changeset
|
6122 assert(curr_hr->continuesHumongous(), "invariant"); |
2152 | 6123 curr_hr->set_notHumongous(); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6124 free_region(curr_hr, free_list, par); |
2152 | 6125 i += 1; |
6126 } | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6127 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6128 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6129 void G1CollectedHeap::remove_from_old_sets(const HeapRegionSetCount& old_regions_removed, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6130 const HeapRegionSetCount& humongous_regions_removed) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6131 if (old_regions_removed.length() > 0 || humongous_regions_removed.length() > 0) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6132 MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6133 _old_set.bulk_remove(old_regions_removed); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6134 _humongous_set.bulk_remove(humongous_regions_removed); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6135 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6136 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6137 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6138 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6139 void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6140 assert(list != NULL, "list can't be null"); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6141 if (!list->is_empty()) { |
2152 | 6142 MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag); |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
6143 _free_list.add_ordered(list); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6144 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6145 } |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6146 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6147 void G1CollectedHeap::decrement_summary_bytes(size_t bytes) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6148 assert(_summary_bytes_used >= bytes, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6149 err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" should be >= bytes: "SIZE_FORMAT, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6150 _summary_bytes_used, bytes)); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6151 _summary_bytes_used -= bytes; |
342 | 6152 } |
6153 | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6154 class G1ParCleanupCTTask : public AbstractGangTask { |
12343 | 6155 G1SATBCardTableModRefBS* _ct_bs; |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6156 G1CollectedHeap* _g1h; |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6157 HeapRegion* volatile _su_head; |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6158 public: |
12343 | 6159 G1ParCleanupCTTask(G1SATBCardTableModRefBS* ct_bs, |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6160 G1CollectedHeap* g1h) : |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6161 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
|
6162 _ct_bs(ct_bs), _g1h(g1h) { } |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6163 |
4728
441e946dc1af
7121618: Change type of number of GC workers to unsigned int.
jmasa
parents:
4711
diff
changeset
|
6164 void work(uint worker_id) { |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6165 HeapRegion* r; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6166 while (r = _g1h->pop_dirty_cards_region()) { |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6167 clear_cards(r); |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6168 } |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6169 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6170 |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6171 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
|
6172 // 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
|
6173 if (!r->is_survivor()) { |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6174 _ct_bs->clear(MemRegion(r->bottom(), r->end())); |
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 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6177 }; |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6178 |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6179 #ifndef PRODUCT |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6180 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
|
6181 G1CollectedHeap* _g1h; |
12343 | 6182 G1SATBCardTableModRefBS* _ct_bs; |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6183 public: |
12343 | 6184 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
|
6185 : _g1h(g1h), _ct_bs(ct_bs) { } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6186 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
|
6187 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
|
6188 _g1h->verify_dirty_region(r); |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6189 } else { |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6190 _g1h->verify_not_dirty_region(r); |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6191 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6192 return false; |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6193 } |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6194 }; |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6195 |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6196 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
|
6197 // All of the region should be clean. |
12343 | 6198 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
|
6199 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
|
6200 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
|
6201 } |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6202 |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6203 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
|
6204 // 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
|
6205 // 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
|
6206 // 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
|
6207 // 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
|
6208 // 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
|
6209 // 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
|
6210 // is dirty. |
12343 | 6211 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
|
6212 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
|
6213 if (hr->is_young()) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
6214 ct_bs->verify_g1_young_region(mr); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
6215 } else { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
6216 ct_bs->verify_dirty_region(mr); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12345
diff
changeset
|
6217 } |
3317
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6218 } |
063382f9b575
7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents:
3293
diff
changeset
|
6219 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6220 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) { |
12343 | 6221 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6222 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
|
6223 verify_dirty_region(hr); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6224 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6225 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6226 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6227 void G1CollectedHeap::verify_dirty_young_regions() { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6228 verify_dirty_young_list(_young_list->first_region()); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6229 } |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6230 #endif |
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6231 |
342 | 6232 void G1CollectedHeap::cleanUpCardTable() { |
12343 | 6233 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set(); |
342 | 6234 double start = os::elapsedTime(); |
6235 | |
4023 | 6236 { |
6237 // Iterate over the dirty cards region list. | |
6238 G1ParCleanupCTTask cleanup_task(ct_bs, this); | |
6239 | |
4711 | 6240 if (G1CollectedHeap::use_parallel_gc_threads()) { |
6241 set_par_threads(); | |
4023 | 6242 workers()->run_task(&cleanup_task); |
6243 set_par_threads(0); | |
6244 } else { | |
6245 while (_dirty_cards_region_list) { | |
6246 HeapRegion* r = _dirty_cards_region_list; | |
6247 cleanup_task.clear_cards(r); | |
6248 _dirty_cards_region_list = r->get_next_dirty_cards_region(); | |
6249 if (_dirty_cards_region_list == r) { | |
6250 // The last region. | |
6251 _dirty_cards_region_list = NULL; | |
6252 } | |
6253 r->set_next_dirty_cards_region(NULL); | |
796
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6254 } |
29e7d79232b9
6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents:
794
diff
changeset
|
6255 } |
4023 | 6256 #ifndef PRODUCT |
6257 if (G1VerifyCTCleanup || VerifyAfterGC) { | |
6258 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs); | |
6259 heap_region_iterate(&cleanup_verifier); | |
6260 } | |
6261 #endif | |
940
8624da129f0b
6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents:
936
diff
changeset
|
6262 } |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6263 |
342 | 6264 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
|
6265 g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0); |
342 | 6266 } |
6267 | |
10405 | 6268 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info) { |
2152 | 6269 size_t pre_used = 0; |
6270 FreeRegionList local_free_list("Local List for CSet Freeing"); | |
6271 | |
342 | 6272 double young_time_ms = 0.0; |
6273 double non_young_time_ms = 0.0; | |
6274 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6275 // 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
|
6276 // 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
|
6277 // 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
|
6278 _young_list->clear(); |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6279 |
342 | 6280 G1CollectorPolicy* policy = g1_policy(); |
6281 | |
6282 double start_sec = os::elapsedTime(); | |
6283 bool non_young = true; | |
6284 | |
6285 HeapRegion* cur = cs_head; | |
6286 int age_bound = -1; | |
6287 size_t rs_lengths = 0; | |
6288 | |
6289 while (cur != NULL) { | |
2361 | 6290 assert(!is_on_master_free_list(cur), "sanity"); |
342 | 6291 if (non_young) { |
6292 if (cur->is_young()) { | |
6293 double end_sec = os::elapsedTime(); | |
6294 double elapsed_ms = (end_sec - start_sec) * 1000.0; | |
6295 non_young_time_ms += elapsed_ms; | |
6296 | |
6297 start_sec = os::elapsedTime(); | |
6298 non_young = false; | |
6299 } | |
6300 } else { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6301 if (!cur->is_young()) { |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6302 double end_sec = os::elapsedTime(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6303 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
|
6304 young_time_ms += elapsed_ms; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6305 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6306 start_sec = os::elapsedTime(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6307 non_young = true; |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6308 } |
342 | 6309 } |
6310 | |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6311 rs_lengths += cur->rem_set()->occupied_locked(); |
342 | 6312 |
6313 HeapRegion* next = cur->next_in_collection_set(); | |
6314 assert(cur->in_collection_set(), "bad CS"); | |
6315 cur->set_next_in_collection_set(NULL); | |
6316 cur->set_in_collection_set(false); | |
6317 | |
6318 if (cur->is_young()) { | |
6319 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
|
6320 assert(index != -1, "invariant"); |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
6321 assert((uint) index < policy->young_cset_region_length(), "invariant"); |
342 | 6322 size_t words_survived = _surviving_young_words[index]; |
6323 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
|
6324 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6325 // 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
|
6326 // (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
|
6327 // 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
|
6328 // _next_young_region field. |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6329 cur->set_next_young_region(NULL); |
342 | 6330 } else { |
6331 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
|
6332 assert(index == -1, "invariant"); |
342 | 6333 } |
6334 | |
6335 assert( (cur->is_young() && cur->young_index_in_cset() > -1) || | |
6336 (!cur->is_young() && cur->young_index_in_cset() == -1), | |
6337 "invariant" ); | |
6338 | |
6339 if (!cur->evacuation_failed()) { | |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6340 MemRegion used_mr = cur->used_region(); |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6341 |
342 | 6342 // And the region is empty. |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6343 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
|
6344 pre_used += cur->used(); |
17755
96b1c2e06e25
8027295: Free CSet takes ~50% of young pause time
tschatzl
parents:
17753
diff
changeset
|
6345 free_region(cur, &local_free_list, false /* par */, true /* locked */); |
342 | 6346 } else { |
6347 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
|
6348 if (cur->is_young()) { |
342 | 6349 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
|
6350 } |
342 | 6351 cur->set_not_young(); |
6352 cur->set_evacuation_failed(false); | |
4072 | 6353 // The region is now considered to be old. |
6354 _old_set.add(cur); | |
10405 | 6355 evacuation_info.increment_collectionset_used_after(cur->used()); |
342 | 6356 } |
6357 cur = next; | |
6358 } | |
6359 | |
10405 | 6360 evacuation_info.set_regions_freed(local_free_list.length()); |
342 | 6361 policy->record_max_rs_lengths(rs_lengths); |
6362 policy->cset_regions_freed(); | |
6363 | |
6364 double end_sec = os::elapsedTime(); | |
6365 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
|
6366 |
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6367 if (non_young) { |
342 | 6368 non_young_time_ms += elapsed_ms; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6369 } else { |
342 | 6370 young_time_ms += elapsed_ms; |
4097
dc467e8b2c5e
7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents:
4095
diff
changeset
|
6371 } |
342 | 6372 |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6373 prepend_to_freelist(&local_free_list); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6374 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
|
6375 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
|
6376 policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms); |
342 | 6377 } |
6378 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6379 // 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
|
6380 // 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
|
6381 // 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
|
6382 // 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
|
6383 // 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
|
6384 // 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
|
6385 // 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
|
6386 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6387 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
|
6388 HeapRegion* cur = cs_head; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6389 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6390 while (cur != NULL) { |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6391 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
|
6392 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
|
6393 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
|
6394 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
|
6395 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
|
6396 cur = next; |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6397 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6398 } |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6399 |
2152 | 6400 void G1CollectedHeap::set_free_regions_coming() { |
6401 if (G1ConcRegionFreeingVerbose) { | |
6402 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : " | |
6403 "setting free regions coming"); | |
6404 } | |
6405 | |
6406 assert(!free_regions_coming(), "pre-condition"); | |
6407 _free_regions_coming = true; | |
342 | 6408 } |
6409 | |
2152 | 6410 void G1CollectedHeap::reset_free_regions_coming() { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
6411 assert(free_regions_coming(), "pre-condition"); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4836
diff
changeset
|
6412 |
2152 | 6413 { |
6414 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); | |
6415 _free_regions_coming = false; | |
6416 SecondaryFreeList_lock->notify_all(); | |
6417 } | |
6418 | |
6419 if (G1ConcRegionFreeingVerbose) { | |
6420 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : " | |
6421 "reset free regions coming"); | |
342 | 6422 } |
6423 } | |
6424 | |
2152 | 6425 void G1CollectedHeap::wait_while_free_regions_coming() { |
6426 // Most of the time we won't have to wait, so let's do a quick test | |
6427 // first before we take the lock. | |
6428 if (!free_regions_coming()) { | |
6429 return; | |
6430 } | |
6431 | |
6432 if (G1ConcRegionFreeingVerbose) { | |
6433 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : " | |
6434 "waiting for free regions"); | |
342 | 6435 } |
6436 | |
6437 { | |
2152 | 6438 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); |
6439 while (free_regions_coming()) { | |
6440 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag); | |
342 | 6441 } |
2152 | 6442 } |
6443 | |
6444 if (G1ConcRegionFreeingVerbose) { | |
6445 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : " | |
6446 "done waiting for free regions"); | |
6447 } | |
342 | 6448 } |
6449 | |
6450 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) { | |
6451 assert(heap_lock_held_for_gc(), | |
6452 "the heap lock should already be held by or for this thread"); | |
6453 _young_list->push_region(hr); | |
6454 } | |
6455 | |
6456 class NoYoungRegionsClosure: public HeapRegionClosure { | |
6457 private: | |
6458 bool _success; | |
6459 public: | |
6460 NoYoungRegionsClosure() : _success(true) { } | |
6461 bool doHeapRegion(HeapRegion* r) { | |
6462 if (r->is_young()) { | |
6463 gclog_or_tty->print_cr("Region ["PTR_FORMAT", "PTR_FORMAT") tagged as young", | |
6464 r->bottom(), r->end()); | |
6465 _success = false; | |
6466 } | |
6467 return false; | |
6468 } | |
6469 bool success() { return _success; } | |
6470 }; | |
6471 | |
1394
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6472 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
|
6473 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
|
6474 |
1316cec51b4d
6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents:
1391
diff
changeset
|
6475 if (check_heap) { |
342 | 6476 NoYoungRegionsClosure closure; |
6477 heap_region_iterate(&closure); | |
6478 ret = ret && closure.success(); | |
6479 } | |
6480 | |
6481 return ret; | |
6482 } | |
6483 | |
4072 | 6484 class TearDownRegionSetsClosure : public HeapRegionClosure { |
6485 private: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6486 HeapRegionSet *_old_set; |
2152 | 6487 |
342 | 6488 public: |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6489 TearDownRegionSetsClosure(HeapRegionSet* old_set) : _old_set(old_set) { } |
2152 | 6490 |
342 | 6491 bool doHeapRegion(HeapRegion* r) { |
4072 | 6492 if (r->is_empty()) { |
6493 // We ignore empty regions, we'll empty the free list afterwards | |
6494 } else if (r->is_young()) { | |
6495 // We ignore young regions, we'll empty the young list afterwards | |
6496 } else if (r->isHumongous()) { | |
6497 // We ignore humongous regions, we're not tearing down the | |
6498 // humongous region set | |
342 | 6499 } else { |
4072 | 6500 // The rest should be old |
6501 _old_set->remove(r); | |
342 | 6502 } |
6503 return false; | |
6504 } | |
6505 | |
4072 | 6506 ~TearDownRegionSetsClosure() { |
6507 assert(_old_set->is_empty(), "post-condition"); | |
2152 | 6508 } |
342 | 6509 }; |
6510 | |
4072 | 6511 void G1CollectedHeap::tear_down_region_sets(bool free_list_only) { |
6512 assert_at_safepoint(true /* should_be_vm_thread */); | |
6513 | |
6514 if (!free_list_only) { | |
6515 TearDownRegionSetsClosure cl(&_old_set); | |
6516 heap_region_iterate(&cl); | |
6517 | |
17764 | 6518 // Note that emptying the _young_list is postponed and instead done as |
6519 // the first step when rebuilding the regions sets again. The reason for | |
6520 // this is that during a full GC string deduplication needs to know if | |
6521 // a collected region was young or old when the full GC was initiated. | |
4072 | 6522 } |
6523 _free_list.remove_all(); | |
6524 } | |
6525 | |
6526 class RebuildRegionSetsClosure : public HeapRegionClosure { | |
6527 private: | |
6528 bool _free_list_only; | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6529 HeapRegionSet* _old_set; |
4072 | 6530 FreeRegionList* _free_list; |
6531 size_t _total_used; | |
6532 | |
6533 public: | |
6534 RebuildRegionSetsClosure(bool free_list_only, | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6535 HeapRegionSet* old_set, FreeRegionList* free_list) : |
4072 | 6536 _free_list_only(free_list_only), |
6537 _old_set(old_set), _free_list(free_list), _total_used(0) { | |
6538 assert(_free_list->is_empty(), "pre-condition"); | |
6539 if (!free_list_only) { | |
6540 assert(_old_set->is_empty(), "pre-condition"); | |
6541 } | |
6542 } | |
6543 | |
6544 bool doHeapRegion(HeapRegion* r) { | |
6545 if (r->continuesHumongous()) { | |
6546 return false; | |
6547 } | |
6548 | |
6549 if (r->is_empty()) { | |
6550 // Add free regions to the free list | |
6551 _free_list->add_as_tail(r); | |
6552 } else if (!_free_list_only) { | |
6553 assert(!r->is_young(), "we should not come across young regions"); | |
6554 | |
6555 if (r->isHumongous()) { | |
6556 // We ignore humongous regions, we left the humongous set unchanged | |
6557 } else { | |
6558 // The rest should be old, add them to the old set | |
6559 _old_set->add(r); | |
6560 } | |
6561 _total_used += r->used(); | |
6562 } | |
6563 | |
6564 return false; | |
6565 } | |
6566 | |
6567 size_t total_used() { | |
6568 return _total_used; | |
6569 } | |
6570 }; | |
6571 | |
6572 void G1CollectedHeap::rebuild_region_sets(bool free_list_only) { | |
6573 assert_at_safepoint(true /* should_be_vm_thread */); | |
6574 | |
17764 | 6575 if (!free_list_only) { |
6576 _young_list->empty_list(); | |
6577 } | |
6578 | |
4072 | 6579 RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_free_list); |
6580 heap_region_iterate(&cl); | |
6581 | |
6582 if (!free_list_only) { | |
6583 _summary_bytes_used = cl.total_used(); | |
6584 } | |
6585 assert(_summary_bytes_used == recalculate_used(), | |
6586 err_msg("inconsistent _summary_bytes_used, " | |
6587 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT, | |
6588 _summary_bytes_used, recalculate_used())); | |
342 | 6589 } |
6590 | |
6591 void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) { | |
6592 _refine_cte_cl->set_concurrent(concurrent); | |
6593 } | |
6594 | |
6595 bool G1CollectedHeap::is_in_closed_subset(const void* p) const { | |
6596 HeapRegion* hr = heap_region_containing(p); | |
6597 if (hr == NULL) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6629
diff
changeset
|
6598 return false; |
342 | 6599 } else { |
6600 return hr->is_in(p); | |
6601 } | |
6602 } | |
2152 | 6603 |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6604 // 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
|
6605 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6606 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
|
6607 bool force) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6608 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
|
6609 assert(!force || g1_policy()->can_expand_young_list(), |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6610 "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
|
6611 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
|
6612 if (force || !young_list_full) { |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6613 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
|
6614 false /* is_old */, |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6615 false /* do_expand */); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6616 if (new_alloc_region != NULL) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6617 set_region_short_lived_locked(new_alloc_region); |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6618 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6619 return new_alloc_region; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6620 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6621 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6622 return NULL; |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6623 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6624 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6625 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
|
6626 size_t allocated_bytes) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6627 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
|
6628 assert(alloc_region->is_young(), "all mutator alloc regions should be young"); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6629 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6630 g1_policy()->add_region_to_incremental_cset_lhs(alloc_region); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6631 _summary_bytes_used += allocated_bytes; |
3778
5f6f2615433a
7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents:
3777
diff
changeset
|
6632 _hr_printer.retire(alloc_region); |
3980
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6633 // 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
|
6634 // 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
|
6635 // used space has been recored in _summary_bytes_used. |
8229bd737950
7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents:
3979
diff
changeset
|
6636 g1mm()->update_eden_size(); |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6637 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6638 |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6639 HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6640 bool force) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6641 return _g1h->new_mutator_alloc_region(word_size, force); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6642 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6643 |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6644 void G1CollectedHeap::set_par_threads() { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6645 // 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
|
6646 // in the workgroup. |
4711 | 6647 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
|
6648 uint n_workers = workers()->active_workers(); |
4711 | 6649 assert(UseDynamicNumberOfGCThreads || |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6650 n_workers == workers()->total_workers(), |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6651 "Otherwise should be using the total number of workers"); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6652 if (n_workers == 0) { |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6653 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
|
6654 n_workers = ParallelGCThreads; |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6655 workers()->set_active_workers(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6656 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6657 set_par_threads(n_workers); |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6658 } |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4090
diff
changeset
|
6659 |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6660 void MutatorAllocRegion::retire_region(HeapRegion* alloc_region, |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6661 size_t allocated_bytes) { |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6662 _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes); |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6663 } |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6664 |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6665 // 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
|
6666 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6667 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
|
6668 uint count, |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6669 GCAllocPurpose ap) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6670 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
|
6671 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6672 if (count < g1_policy()->max_regions(ap)) { |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
6673 bool survivor = (ap == GCAllocForSurvived); |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6674 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
|
6675 !survivor, |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6676 true /* do_expand */); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6677 if (new_alloc_region != NULL) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6678 // 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
|
6679 // 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
|
6680 // for survivors too. |
20274
a8137787acfe
8047821: G1 Does not use the save_marks functionality as intended
mgerdin
parents:
20270
diff
changeset
|
6681 new_alloc_region->record_top_and_timestamp(); |
17773
8ee855b4e667
8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents:
17759
diff
changeset
|
6682 if (survivor) { |
3830
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6683 new_alloc_region->set_survivor(); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6684 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6685 } else { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6686 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6687 } |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6688 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
|
6689 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
|
6690 return new_alloc_region; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6691 } else { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6692 g1_policy()->note_alloc_region_limit_reached(ap); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6693 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6694 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6695 return NULL; |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6696 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6697 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6698 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
|
6699 size_t allocated_bytes, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6700 GCAllocPurpose ap) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
4785
diff
changeset
|
6701 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
|
6702 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
|
6703 g1_policy()->record_bytes_copied_during_gc(allocated_bytes); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6704 if (ap == GCAllocForSurvived) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6705 young_list()->add_survivor_region(alloc_region); |
4072 | 6706 } else { |
6707 _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
|
6708 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6709 _hr_printer.retire(alloc_region); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6710 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6711 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6712 HeapRegion* SurvivorGCAllocRegion::allocate_new_region(size_t word_size, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6713 bool force) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6714 assert(!force, "not supported for GC alloc regions"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6715 return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForSurvived); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6716 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6717 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6718 void SurvivorGCAllocRegion::retire_region(HeapRegion* alloc_region, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6719 size_t allocated_bytes) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6720 _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6721 GCAllocForSurvived); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6722 } |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6723 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6724 HeapRegion* OldGCAllocRegion::allocate_new_region(size_t word_size, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6725 bool force) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6726 assert(!force, "not supported for GC alloc regions"); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6727 return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForTenured); |
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 |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6730 void OldGCAllocRegion::retire_region(HeapRegion* alloc_region, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6731 size_t allocated_bytes) { |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6732 _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes, |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6733 GCAllocForTenured); |
f44782f04dd4
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents:
3824
diff
changeset
|
6734 } |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6735 // Heap region set verification |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
2432
diff
changeset
|
6736 |
2152 | 6737 class VerifyRegionListsClosure : public HeapRegionClosure { |
6738 private: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6739 HeapRegionSet* _old_set; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6740 HeapRegionSet* _humongous_set; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6741 FreeRegionList* _free_list; |
2152 | 6742 |
6743 public: | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6744 HeapRegionSetCount _old_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6745 HeapRegionSetCount _humongous_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6746 HeapRegionSetCount _free_count; |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6747 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6748 VerifyRegionListsClosure(HeapRegionSet* old_set, |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6749 HeapRegionSet* humongous_set, |
2152 | 6750 FreeRegionList* free_list) : |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6751 _old_set(old_set), _humongous_set(humongous_set), _free_list(free_list), |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6752 _old_count(), _humongous_count(), _free_count(){ } |
2152 | 6753 |
6754 bool doHeapRegion(HeapRegion* hr) { | |
6755 if (hr->continuesHumongous()) { | |
6756 return false; | |
6757 } | |
6758 | |
6759 if (hr->is_young()) { | |
6760 // TODO | |
6761 } else if (hr->startsHumongous()) { | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6762 assert(hr->containing_set() == _humongous_set, err_msg("Heap region %u is starts humongous but not in humongous set.", hr->region_num())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6763 _humongous_count.increment(1u, hr->capacity()); |
2152 | 6764 } else if (hr->is_empty()) { |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6765 assert(hr->containing_set() == _free_list, err_msg("Heap region %u is empty but not on the free list.", hr->region_num())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6766 _free_count.increment(1u, hr->capacity()); |
4072 | 6767 } else { |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6768 assert(hr->containing_set() == _old_set, err_msg("Heap region %u is old but not in the old set.", hr->region_num())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6769 _old_count.increment(1u, hr->capacity()); |
2152 | 6770 } |
6771 return false; | |
6772 } | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6773 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6774 void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, FreeRegionList* free_list) { |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6775 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
|
6776 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
|
6777 old_set->total_capacity_bytes(), _old_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6778 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6779 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
|
6780 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
|
6781 humongous_set->total_capacity_bytes(), _humongous_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6782 |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6783 guarantee(free_list->length() == _free_count.length(), err_msg("Free list count mismatch. Expected %u, actual %u.", free_list->length(), _free_count.length())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6784 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
|
6785 free_list->total_capacity_bytes(), _free_count.capacity())); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6786 } |
2152 | 6787 }; |
6788 | |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
6008
diff
changeset
|
6789 HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index, |
3766 | 6790 HeapWord* bottom) { |
6791 HeapWord* end = bottom + HeapRegion::GrainWords; | |
6792 MemRegion mr(bottom, end); | |
6793 assert(_g1_reserved.contains(mr), "invariant"); | |
6794 // This might return NULL if the allocation fails | |
6754
8fbf05030e24
7016955: G1: remove the is_zeroed parameter from the HeapRegion constructor
johnc
parents:
6752
diff
changeset
|
6795 return new HeapRegion(hrs_index, _bot_shared, mr); |
3766 | 6796 } |
6797 | |
2152 | 6798 void G1CollectedHeap::verify_region_sets() { |
6799 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); | |
6800 | |
6801 // First, check the explicit lists. | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6802 _free_list.verify_list(); |
2152 | 6803 { |
6804 // Given that a concurrent operation might be adding regions to | |
6805 // the secondary free list we have to take the lock before | |
6806 // verifying it. | |
6807 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); | |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6808 _secondary_free_list.verify_list(); |
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6809 } |
2152 | 6810 |
6811 // If a concurrent region freeing operation is in progress it will | |
6812 // be difficult to correctly attributed any free regions we come | |
6813 // across to the correct free list given that they might belong to | |
6814 // one of several (free_list, secondary_free_list, any local lists, | |
6815 // etc.). So, if that's the case we will skip the rest of the | |
6816 // verification operation. Alternatively, waiting for the concurrent | |
6817 // operation to complete will have a non-trivial effect on the GC's | |
6818 // operation (no concurrent operation will last longer than the | |
6819 // interval between two calls to verification) and it might hide | |
6820 // any issues that we would like to catch during testing. | |
6821 if (free_regions_coming()) { | |
6822 return; | |
6823 } | |
6824 | |
2361 | 6825 // Make sure we append the secondary_free_list on the free_list so |
6826 // that all free regions we will come across can be safely | |
6827 // attributed to the free_list. | |
6828 append_secondary_free_list_if_not_empty_with_lock(); | |
2152 | 6829 |
6830 // Finally, make sure that the region accounting in the lists is | |
6831 // consistent with what we see in the heap. | |
6832 | |
4072 | 6833 VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_free_list); |
2152 | 6834 heap_region_iterate(&cl); |
17736
58fc1b1523dc
8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents:
17727
diff
changeset
|
6835 cl.verify_counts(&_old_set, &_humongous_set, &_free_list); |
342 | 6836 } |
12080 | 6837 |
6838 // Optimized nmethod scanning | |
6839 | |
6840 class RegisterNMethodOopClosure: public OopClosure { | |
6841 G1CollectedHeap* _g1h; | |
6842 nmethod* _nm; | |
6843 | |
6844 template <class T> void do_oop_work(T* p) { | |
6845 T heap_oop = oopDesc::load_heap_oop(p); | |
6846 if (!oopDesc::is_null(heap_oop)) { | |
6847 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
6848 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6849 assert(!hr->continuesHumongous(), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6850 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
|
6851 " starting at "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6852 _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region()))); |
12080 | 6853 |
6854 // HeapRegion::add_strong_code_root() avoids adding duplicate | |
6855 // entries but having duplicates is OK since we "mark" nmethods | |
6856 // as visited when we scan the strong code root lists during the GC. | |
6857 hr->add_strong_code_root(_nm); | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6858 assert(hr->rem_set()->strong_code_roots_list_contains(_nm), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6859 err_msg("failed to add code root "PTR_FORMAT" to remembered set of region "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6860 _nm, HR_FORMAT_PARAMS(hr))); |
12080 | 6861 } |
6862 } | |
6863 | |
6864 public: | |
6865 RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) : | |
6866 _g1h(g1h), _nm(nm) {} | |
6867 | |
6868 void do_oop(oop* p) { do_oop_work(p); } | |
6869 void do_oop(narrowOop* p) { do_oop_work(p); } | |
6870 }; | |
6871 | |
6872 class UnregisterNMethodOopClosure: public OopClosure { | |
6873 G1CollectedHeap* _g1h; | |
6874 nmethod* _nm; | |
6875 | |
6876 template <class T> void do_oop_work(T* p) { | |
6877 T heap_oop = oopDesc::load_heap_oop(p); | |
6878 if (!oopDesc::is_null(heap_oop)) { | |
6879 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
6880 HeapRegion* hr = _g1h->heap_region_containing(obj); | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6881 assert(!hr->continuesHumongous(), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6882 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
|
6883 " starting at "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6884 _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
|
6885 |
12080 | 6886 hr->remove_strong_code_root(_nm); |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6887 assert(!hr->rem_set()->strong_code_roots_list_contains(_nm), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6888 err_msg("failed to remove code root "PTR_FORMAT" of region "HR_FORMAT, |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6889 _nm, HR_FORMAT_PARAMS(hr))); |
12080 | 6890 } |
6891 } | |
6892 | |
6893 public: | |
6894 UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) : | |
6895 _g1h(g1h), _nm(nm) {} | |
6896 | |
6897 void do_oop(oop* p) { do_oop_work(p); } | |
6898 void do_oop(narrowOop* p) { do_oop_work(p); } | |
6899 }; | |
6900 | |
6901 void G1CollectedHeap::register_nmethod(nmethod* nm) { | |
6902 CollectedHeap::register_nmethod(nm); | |
6903 | |
6904 guarantee(nm != NULL, "sanity"); | |
6905 RegisterNMethodOopClosure reg_cl(this, nm); | |
6906 nm->oops_do(®_cl); | |
6907 } | |
6908 | |
6909 void G1CollectedHeap::unregister_nmethod(nmethod* nm) { | |
6910 CollectedHeap::unregister_nmethod(nm); | |
6911 | |
6912 guarantee(nm != NULL, "sanity"); | |
6913 UnregisterNMethodOopClosure reg_cl(this, nm); | |
6914 nm->oops_do(®_cl, true); | |
6915 } | |
6916 | |
6917 class MigrateCodeRootsHeapRegionClosure: public HeapRegionClosure { | |
6918 public: | |
6919 bool doHeapRegion(HeapRegion *hr) { | |
13062
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6920 assert(!hr->isHumongous(), |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6921 err_msg("humongous region "HR_FORMAT" should not have been added to collection set", |
28674af341ac
8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents:
13060
diff
changeset
|
6922 HR_FORMAT_PARAMS(hr))); |
12080 | 6923 hr->migrate_strong_code_roots(); |
6924 return false; | |
6925 } | |
6926 }; | |
6927 | |
6928 void G1CollectedHeap::migrate_strong_code_roots() { | |
6929 MigrateCodeRootsHeapRegionClosure cl; | |
6930 double migrate_start = os::elapsedTime(); | |
6931 collection_set_iterate(&cl); | |
6932 double migration_time_ms = (os::elapsedTime() - migrate_start) * 1000.0; | |
6933 g1_policy()->phase_times()->record_strong_code_root_migration_time(migration_time_ms); | |
6934 } | |
6935 | |
17753
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6936 void G1CollectedHeap::purge_code_root_memory() { |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6937 double purge_start = os::elapsedTime(); |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6938 G1CodeRootSet::purge_chunks(G1CodeRootsChunkCacheKeepPercent); |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6939 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
|
6940 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
|
6941 } |
191174b49bec
8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents:
17749
diff
changeset
|
6942 |
12080 | 6943 class RebuildStrongCodeRootClosure: public CodeBlobClosure { |
6944 G1CollectedHeap* _g1h; | |
6945 | |
6946 public: | |
6947 RebuildStrongCodeRootClosure(G1CollectedHeap* g1h) : | |
6948 _g1h(g1h) {} | |
6949 | |
6950 void do_code_blob(CodeBlob* cb) { | |
6951 nmethod* nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL; | |
6952 if (nm == NULL) { | |
6953 return; | |
6954 } | |
6955 | |
20191
fd81a5764900
8046231: G1: Code root location ... from nmethod ... not in strong code roots for region
pliden
parents:
20190
diff
changeset
|
6956 if (ScavengeRootsInCode) { |
12080 | 6957 _g1h->register_nmethod(nm); |
6958 } | |
6959 } | |
6960 }; | |
6961 | |
6962 void G1CollectedHeap::rebuild_strong_code_roots() { | |
6963 RebuildStrongCodeRootClosure blob_cl(this); | |
6964 CodeCache::blobs_do(&blob_cl); | |
6965 } |