Print this page
rev 3486 : 7185699: G1: Prediction model discrepancies
Summary: Correct the result value of G1CollectedHeap::pending_card_num(). Change the code that calculates the GC efficiency of a non-young heap region to use historical data from mixed GCs and the actual number of live bytes when predicting how long it would take to collect the region.
Reviewed-by:
Split |
Close |
Expand all |
Collapse all |
--- old/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+++ new/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
1 1 /*
2 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 18 *
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 *
23 23 */
24 24
25 25 #include "precompiled.hpp"
26 26 #include "code/icBuffer.hpp"
27 27 #include "gc_implementation/g1/bufferingOopClosure.hpp"
28 28 #include "gc_implementation/g1/concurrentG1Refine.hpp"
29 29 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
30 30 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
31 31 #include "gc_implementation/g1/g1AllocRegion.inline.hpp"
32 32 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
33 33 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
34 34 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
35 35 #include "gc_implementation/g1/g1EvacFailure.hpp"
36 36 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
37 37 #include "gc_implementation/g1/g1Log.hpp"
38 38 #include "gc_implementation/g1/g1MarkSweep.hpp"
39 39 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
40 40 #include "gc_implementation/g1/g1RemSet.inline.hpp"
41 41 #include "gc_implementation/g1/heapRegion.inline.hpp"
42 42 #include "gc_implementation/g1/heapRegionRemSet.hpp"
43 43 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
44 44 #include "gc_implementation/g1/vm_operations_g1.hpp"
45 45 #include "gc_implementation/shared/isGCActiveMark.hpp"
46 46 #include "memory/gcLocker.inline.hpp"
47 47 #include "memory/genOopClosures.inline.hpp"
48 48 #include "memory/generationSpec.hpp"
49 49 #include "memory/referenceProcessor.hpp"
50 50 #include "oops/oop.inline.hpp"
51 51 #include "oops/oop.pcgc.inline.hpp"
52 52 #include "runtime/aprofiler.hpp"
53 53 #include "runtime/vmThread.hpp"
54 54
55 55 size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0;
56 56
57 57 // turn it on so that the contents of the young list (scan-only /
58 58 // to-be-collected) are printed at "strategic" points before / during
59 59 // / after the collection --- this is useful for debugging
60 60 #define YOUNG_LIST_VERBOSE 0
61 61 // CURRENT STATUS
62 62 // This file is under construction. Search for "FIXME".
63 63
64 64 // INVARIANTS/NOTES
65 65 //
66 66 // All allocation activity covered by the G1CollectedHeap interface is
67 67 // serialized by acquiring the HeapLock. This happens in mem_allocate
68 68 // and allocate_new_tlab, which are the "entry" points to the
69 69 // allocation code from the rest of the JVM. (Note that this does not
70 70 // apply to TLAB allocation, which is not part of this interface: it
71 71 // is done by clients of this interface.)
72 72
73 73 // Notes on implementation of parallelism in different tasks.
74 74 //
75 75 // G1ParVerifyTask uses heap_region_par_iterate_chunked() for parallelism.
76 76 // The number of GC workers is passed to heap_region_par_iterate_chunked().
77 77 // It does use run_task() which sets _n_workers in the task.
78 78 // G1ParTask executes g1_process_strong_roots() ->
79 79 // SharedHeap::process_strong_roots() which calls eventuall to
80 80 // CardTableModRefBS::par_non_clean_card_iterate_work() which uses
81 81 // SequentialSubTasksDone. SharedHeap::process_strong_roots() also
82 82 // directly uses SubTasksDone (_process_strong_tasks field in SharedHeap).
83 83 //
84 84
85 85 // Local to this file.
86 86
87 87 class RefineCardTableEntryClosure: public CardTableEntryClosure {
88 88 SuspendibleThreadSet* _sts;
89 89 G1RemSet* _g1rs;
90 90 ConcurrentG1Refine* _cg1r;
91 91 bool _concurrent;
92 92 public:
93 93 RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
94 94 G1RemSet* g1rs,
95 95 ConcurrentG1Refine* cg1r) :
96 96 _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
97 97 {}
98 98 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
99 99 bool oops_into_cset = _g1rs->concurrentRefineOneCard(card_ptr, worker_i, false);
100 100 // This path is executed by the concurrent refine or mutator threads,
101 101 // concurrently, and so we do not care if card_ptr contains references
102 102 // that point into the collection set.
103 103 assert(!oops_into_cset, "should be");
104 104
105 105 if (_concurrent && _sts->should_yield()) {
106 106 // Caller will actually yield.
107 107 return false;
108 108 }
109 109 // Otherwise, we finished successfully; return true.
110 110 return true;
111 111 }
112 112 void set_concurrent(bool b) { _concurrent = b; }
113 113 };
114 114
115 115
116 116 class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
117 117 int _calls;
118 118 G1CollectedHeap* _g1h;
119 119 CardTableModRefBS* _ctbs;
120 120 int _histo[256];
121 121 public:
122 122 ClearLoggedCardTableEntryClosure() :
123 123 _calls(0)
124 124 {
125 125 _g1h = G1CollectedHeap::heap();
126 126 _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
127 127 for (int i = 0; i < 256; i++) _histo[i] = 0;
128 128 }
129 129 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
130 130 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
131 131 _calls++;
132 132 unsigned char* ujb = (unsigned char*)card_ptr;
133 133 int ind = (int)(*ujb);
134 134 _histo[ind]++;
135 135 *card_ptr = -1;
136 136 }
137 137 return true;
138 138 }
139 139 int calls() { return _calls; }
140 140 void print_histo() {
141 141 gclog_or_tty->print_cr("Card table value histogram:");
142 142 for (int i = 0; i < 256; i++) {
143 143 if (_histo[i] != 0) {
144 144 gclog_or_tty->print_cr(" %d: %d", i, _histo[i]);
145 145 }
146 146 }
147 147 }
148 148 };
149 149
150 150 class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
151 151 int _calls;
152 152 G1CollectedHeap* _g1h;
153 153 CardTableModRefBS* _ctbs;
154 154 public:
155 155 RedirtyLoggedCardTableEntryClosure() :
156 156 _calls(0)
157 157 {
158 158 _g1h = G1CollectedHeap::heap();
159 159 _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
160 160 }
161 161 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
162 162 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
163 163 _calls++;
164 164 *card_ptr = 0;
165 165 }
166 166 return true;
167 167 }
168 168 int calls() { return _calls; }
169 169 };
170 170
171 171 class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
172 172 public:
173 173 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
174 174 *card_ptr = CardTableModRefBS::dirty_card_val();
175 175 return true;
176 176 }
177 177 };
178 178
179 179 YoungList::YoungList(G1CollectedHeap* g1h) :
180 180 _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0),
181 181 _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) {
182 182 guarantee(check_list_empty(false), "just making sure...");
183 183 }
184 184
185 185 void YoungList::push_region(HeapRegion *hr) {
186 186 assert(!hr->is_young(), "should not already be young");
187 187 assert(hr->get_next_young_region() == NULL, "cause it should!");
188 188
189 189 hr->set_next_young_region(_head);
190 190 _head = hr;
191 191
192 192 _g1h->g1_policy()->set_region_eden(hr, (int) _length);
193 193 ++_length;
194 194 }
195 195
196 196 void YoungList::add_survivor_region(HeapRegion* hr) {
197 197 assert(hr->is_survivor(), "should be flagged as survivor region");
198 198 assert(hr->get_next_young_region() == NULL, "cause it should!");
199 199
200 200 hr->set_next_young_region(_survivor_head);
201 201 if (_survivor_head == NULL) {
202 202 _survivor_tail = hr;
203 203 }
204 204 _survivor_head = hr;
205 205 ++_survivor_length;
206 206 }
207 207
208 208 void YoungList::empty_list(HeapRegion* list) {
209 209 while (list != NULL) {
210 210 HeapRegion* next = list->get_next_young_region();
211 211 list->set_next_young_region(NULL);
212 212 list->uninstall_surv_rate_group();
213 213 list->set_not_young();
214 214 list = next;
215 215 }
216 216 }
217 217
218 218 void YoungList::empty_list() {
219 219 assert(check_list_well_formed(), "young list should be well formed");
220 220
221 221 empty_list(_head);
222 222 _head = NULL;
223 223 _length = 0;
224 224
225 225 empty_list(_survivor_head);
226 226 _survivor_head = NULL;
227 227 _survivor_tail = NULL;
228 228 _survivor_length = 0;
229 229
230 230 _last_sampled_rs_lengths = 0;
231 231
232 232 assert(check_list_empty(false), "just making sure...");
233 233 }
234 234
235 235 bool YoungList::check_list_well_formed() {
236 236 bool ret = true;
237 237
238 238 uint length = 0;
239 239 HeapRegion* curr = _head;
240 240 HeapRegion* last = NULL;
241 241 while (curr != NULL) {
242 242 if (!curr->is_young()) {
243 243 gclog_or_tty->print_cr("### YOUNG REGION "PTR_FORMAT"-"PTR_FORMAT" "
244 244 "incorrectly tagged (y: %d, surv: %d)",
245 245 curr->bottom(), curr->end(),
246 246 curr->is_young(), curr->is_survivor());
247 247 ret = false;
248 248 }
249 249 ++length;
250 250 last = curr;
251 251 curr = curr->get_next_young_region();
252 252 }
253 253 ret = ret && (length == _length);
254 254
255 255 if (!ret) {
256 256 gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
257 257 gclog_or_tty->print_cr("### list has %u entries, _length is %u",
258 258 length, _length);
259 259 }
260 260
261 261 return ret;
262 262 }
263 263
264 264 bool YoungList::check_list_empty(bool check_sample) {
265 265 bool ret = true;
266 266
267 267 if (_length != 0) {
268 268 gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u",
269 269 _length);
270 270 ret = false;
271 271 }
272 272 if (check_sample && _last_sampled_rs_lengths != 0) {
273 273 gclog_or_tty->print_cr("### YOUNG LIST has non-zero last sampled RS lengths");
274 274 ret = false;
275 275 }
276 276 if (_head != NULL) {
277 277 gclog_or_tty->print_cr("### YOUNG LIST does not have a NULL head");
278 278 ret = false;
279 279 }
280 280 if (!ret) {
281 281 gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
282 282 }
283 283
284 284 return ret;
285 285 }
286 286
287 287 void
288 288 YoungList::rs_length_sampling_init() {
289 289 _sampled_rs_lengths = 0;
290 290 _curr = _head;
291 291 }
292 292
293 293 bool
294 294 YoungList::rs_length_sampling_more() {
295 295 return _curr != NULL;
296 296 }
297 297
298 298 void
299 299 YoungList::rs_length_sampling_next() {
300 300 assert( _curr != NULL, "invariant" );
301 301 size_t rs_length = _curr->rem_set()->occupied();
302 302
303 303 _sampled_rs_lengths += rs_length;
304 304
305 305 // The current region may not yet have been added to the
306 306 // incremental collection set (it gets added when it is
307 307 // retired as the current allocation region).
308 308 if (_curr->in_collection_set()) {
309 309 // Update the collection set policy information for this region
310 310 _g1h->g1_policy()->update_incremental_cset_info(_curr, rs_length);
311 311 }
312 312
313 313 _curr = _curr->get_next_young_region();
314 314 if (_curr == NULL) {
315 315 _last_sampled_rs_lengths = _sampled_rs_lengths;
316 316 // gclog_or_tty->print_cr("last sampled RS lengths = %d", _last_sampled_rs_lengths);
317 317 }
318 318 }
319 319
320 320 void
321 321 YoungList::reset_auxilary_lists() {
322 322 guarantee( is_empty(), "young list should be empty" );
323 323 assert(check_list_well_formed(), "young list should be well formed");
324 324
325 325 // Add survivor regions to SurvRateGroup.
326 326 _g1h->g1_policy()->note_start_adding_survivor_regions();
327 327 _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */);
328 328
329 329 int young_index_in_cset = 0;
330 330 for (HeapRegion* curr = _survivor_head;
331 331 curr != NULL;
332 332 curr = curr->get_next_young_region()) {
333 333 _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset);
334 334
335 335 // The region is a non-empty survivor so let's add it to
336 336 // the incremental collection set for the next evacuation
337 337 // pause.
338 338 _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
339 339 young_index_in_cset += 1;
340 340 }
341 341 assert((uint) young_index_in_cset == _survivor_length, "post-condition");
342 342 _g1h->g1_policy()->note_stop_adding_survivor_regions();
343 343
344 344 _head = _survivor_head;
345 345 _length = _survivor_length;
346 346 if (_survivor_head != NULL) {
347 347 assert(_survivor_tail != NULL, "cause it shouldn't be");
348 348 assert(_survivor_length > 0, "invariant");
349 349 _survivor_tail->set_next_young_region(NULL);
350 350 }
351 351
352 352 // Don't clear the survivor list handles until the start of
353 353 // the next evacuation pause - we need it in order to re-tag
354 354 // the survivor regions from this evacuation pause as 'young'
355 355 // at the start of the next.
356 356
357 357 _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
358 358
359 359 assert(check_list_well_formed(), "young list should be well formed");
360 360 }
361 361
362 362 void YoungList::print() {
363 363 HeapRegion* lists[] = {_head, _survivor_head};
364 364 const char* names[] = {"YOUNG", "SURVIVOR"};
365 365
366 366 for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
367 367 gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
368 368 HeapRegion *curr = lists[list];
369 369 if (curr == NULL)
370 370 gclog_or_tty->print_cr(" empty");
371 371 while (curr != NULL) {
372 372 gclog_or_tty->print_cr(" "HR_FORMAT", P: "PTR_FORMAT "N: "PTR_FORMAT", age: %4d",
373 373 HR_FORMAT_PARAMS(curr),
374 374 curr->prev_top_at_mark_start(),
375 375 curr->next_top_at_mark_start(),
376 376 curr->age_in_surv_rate_group_cond());
377 377 curr = curr->get_next_young_region();
378 378 }
379 379 }
380 380
381 381 gclog_or_tty->print_cr("");
382 382 }
383 383
384 384 void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
385 385 {
386 386 // Claim the right to put the region on the dirty cards region list
387 387 // by installing a self pointer.
388 388 HeapRegion* next = hr->get_next_dirty_cards_region();
389 389 if (next == NULL) {
390 390 HeapRegion* res = (HeapRegion*)
391 391 Atomic::cmpxchg_ptr(hr, hr->next_dirty_cards_region_addr(),
392 392 NULL);
393 393 if (res == NULL) {
394 394 HeapRegion* head;
395 395 do {
396 396 // Put the region to the dirty cards region list.
397 397 head = _dirty_cards_region_list;
398 398 next = (HeapRegion*)
399 399 Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
400 400 if (next == head) {
401 401 assert(hr->get_next_dirty_cards_region() == hr,
402 402 "hr->get_next_dirty_cards_region() != hr");
403 403 if (next == NULL) {
404 404 // The last region in the list points to itself.
405 405 hr->set_next_dirty_cards_region(hr);
406 406 } else {
407 407 hr->set_next_dirty_cards_region(next);
408 408 }
409 409 }
410 410 } while (next != head);
411 411 }
412 412 }
413 413 }
414 414
415 415 HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
416 416 {
417 417 HeapRegion* head;
418 418 HeapRegion* hr;
419 419 do {
420 420 head = _dirty_cards_region_list;
421 421 if (head == NULL) {
422 422 return NULL;
423 423 }
424 424 HeapRegion* new_head = head->get_next_dirty_cards_region();
425 425 if (head == new_head) {
426 426 // The last region.
427 427 new_head = NULL;
428 428 }
429 429 hr = (HeapRegion*)Atomic::cmpxchg_ptr(new_head, &_dirty_cards_region_list,
430 430 head);
431 431 } while (hr != head);
432 432 assert(hr != NULL, "invariant");
433 433 hr->set_next_dirty_cards_region(NULL);
434 434 return hr;
435 435 }
436 436
437 437 void G1CollectedHeap::stop_conc_gc_threads() {
438 438 _cg1r->stop();
439 439 _cmThread->stop();
440 440 }
441 441
442 442 #ifdef ASSERT
443 443 // A region is added to the collection set as it is retired
444 444 // so an address p can point to a region which will be in the
445 445 // collection set but has not yet been retired. This method
446 446 // therefore is only accurate during a GC pause after all
447 447 // regions have been retired. It is used for debugging
448 448 // to check if an nmethod has references to objects that can
449 449 // be move during a partial collection. Though it can be
450 450 // inaccurate, it is sufficient for G1 because the conservative
451 451 // implementation of is_scavengable() for G1 will indicate that
452 452 // all nmethods must be scanned during a partial collection.
453 453 bool G1CollectedHeap::is_in_partial_collection(const void* p) {
454 454 HeapRegion* hr = heap_region_containing(p);
455 455 return hr != NULL && hr->in_collection_set();
456 456 }
457 457 #endif
458 458
459 459 // Returns true if the reference points to an object that
460 460 // can move in an incremental collecction.
461 461 bool G1CollectedHeap::is_scavengable(const void* p) {
462 462 G1CollectedHeap* g1h = G1CollectedHeap::heap();
463 463 G1CollectorPolicy* g1p = g1h->g1_policy();
464 464 HeapRegion* hr = heap_region_containing(p);
465 465 if (hr == NULL) {
466 466 // perm gen (or null)
467 467 return false;
468 468 } else {
469 469 return !hr->isHumongous();
470 470 }
471 471 }
472 472
473 473 void G1CollectedHeap::check_ct_logs_at_safepoint() {
474 474 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
475 475 CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
476 476
477 477 // Count the dirty cards at the start.
478 478 CountNonCleanMemRegionClosure count1(this);
479 479 ct_bs->mod_card_iterate(&count1);
480 480 int orig_count = count1.n();
481 481
482 482 // First clear the logged cards.
483 483 ClearLoggedCardTableEntryClosure clear;
484 484 dcqs.set_closure(&clear);
485 485 dcqs.apply_closure_to_all_completed_buffers();
486 486 dcqs.iterate_closure_all_threads(false);
487 487 clear.print_histo();
488 488
489 489 // Now ensure that there's no dirty cards.
490 490 CountNonCleanMemRegionClosure count2(this);
491 491 ct_bs->mod_card_iterate(&count2);
492 492 if (count2.n() != 0) {
493 493 gclog_or_tty->print_cr("Card table has %d entries; %d originally",
494 494 count2.n(), orig_count);
495 495 }
496 496 guarantee(count2.n() == 0, "Card table should be clean.");
497 497
498 498 RedirtyLoggedCardTableEntryClosure redirty;
499 499 JavaThread::dirty_card_queue_set().set_closure(&redirty);
500 500 dcqs.apply_closure_to_all_completed_buffers();
501 501 dcqs.iterate_closure_all_threads(false);
502 502 gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
503 503 clear.calls(), orig_count);
504 504 guarantee(redirty.calls() == clear.calls(),
505 505 "Or else mechanism is broken.");
506 506
507 507 CountNonCleanMemRegionClosure count3(this);
508 508 ct_bs->mod_card_iterate(&count3);
509 509 if (count3.n() != orig_count) {
510 510 gclog_or_tty->print_cr("Should have restored them all: orig = %d, final = %d.",
511 511 orig_count, count3.n());
512 512 guarantee(count3.n() >= orig_count, "Should have restored them all.");
513 513 }
514 514
515 515 JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
516 516 }
517 517
518 518 // Private class members.
519 519
520 520 G1CollectedHeap* G1CollectedHeap::_g1h;
521 521
522 522 // Private methods.
523 523
524 524 HeapRegion*
525 525 G1CollectedHeap::new_region_try_secondary_free_list() {
526 526 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
527 527 while (!_secondary_free_list.is_empty() || free_regions_coming()) {
528 528 if (!_secondary_free_list.is_empty()) {
529 529 if (G1ConcRegionFreeingVerbose) {
530 530 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
531 531 "secondary_free_list has %u entries",
532 532 _secondary_free_list.length());
533 533 }
534 534 // It looks as if there are free regions available on the
535 535 // secondary_free_list. Let's move them to the free_list and try
536 536 // again to allocate from it.
537 537 append_secondary_free_list();
538 538
539 539 assert(!_free_list.is_empty(), "if the secondary_free_list was not "
540 540 "empty we should have moved at least one entry to the free_list");
541 541 HeapRegion* res = _free_list.remove_head();
542 542 if (G1ConcRegionFreeingVerbose) {
543 543 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
544 544 "allocated "HR_FORMAT" from secondary_free_list",
545 545 HR_FORMAT_PARAMS(res));
546 546 }
547 547 return res;
548 548 }
549 549
550 550 // Wait here until we get notifed either when (a) there are no
551 551 // more free regions coming or (b) some regions have been moved on
552 552 // the secondary_free_list.
553 553 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
554 554 }
555 555
556 556 if (G1ConcRegionFreeingVerbose) {
557 557 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
558 558 "could not allocate from secondary_free_list");
559 559 }
560 560 return NULL;
561 561 }
562 562
563 563 HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool do_expand) {
564 564 assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords,
565 565 "the only time we use this to allocate a humongous region is "
566 566 "when we are allocating a single humongous region");
567 567
568 568 HeapRegion* res;
569 569 if (G1StressConcRegionFreeing) {
570 570 if (!_secondary_free_list.is_empty()) {
571 571 if (G1ConcRegionFreeingVerbose) {
572 572 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
573 573 "forced to look at the secondary_free_list");
574 574 }
575 575 res = new_region_try_secondary_free_list();
576 576 if (res != NULL) {
577 577 return res;
578 578 }
579 579 }
580 580 }
581 581 res = _free_list.remove_head_or_null();
582 582 if (res == NULL) {
583 583 if (G1ConcRegionFreeingVerbose) {
584 584 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
585 585 "res == NULL, trying the secondary_free_list");
586 586 }
587 587 res = new_region_try_secondary_free_list();
588 588 }
589 589 if (res == NULL && do_expand && _expand_heap_after_alloc_failure) {
590 590 // Currently, only attempts to allocate GC alloc regions set
591 591 // do_expand to true. So, we should only reach here during a
592 592 // safepoint. If this assumption changes we might have to
593 593 // reconsider the use of _expand_heap_after_alloc_failure.
594 594 assert(SafepointSynchronize::is_at_safepoint(), "invariant");
595 595
596 596 ergo_verbose1(ErgoHeapSizing,
597 597 "attempt heap expansion",
598 598 ergo_format_reason("region allocation request failed")
599 599 ergo_format_byte("allocation request"),
600 600 word_size * HeapWordSize);
601 601 if (expand(word_size * HeapWordSize)) {
602 602 // Given that expand() succeeded in expanding the heap, and we
603 603 // always expand the heap by an amount aligned to the heap
604 604 // region size, the free list should in theory not be empty. So
605 605 // it would probably be OK to use remove_head(). But the extra
606 606 // check for NULL is unlikely to be a performance issue here (we
607 607 // just expanded the heap!) so let's just be conservative and
608 608 // use remove_head_or_null().
609 609 res = _free_list.remove_head_or_null();
610 610 } else {
611 611 _expand_heap_after_alloc_failure = false;
612 612 }
613 613 }
614 614 return res;
615 615 }
616 616
617 617 uint G1CollectedHeap::humongous_obj_allocate_find_first(uint num_regions,
618 618 size_t word_size) {
619 619 assert(isHumongous(word_size), "word_size should be humongous");
620 620 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
621 621
622 622 uint first = G1_NULL_HRS_INDEX;
623 623 if (num_regions == 1) {
624 624 // Only one region to allocate, no need to go through the slower
625 625 // path. The caller will attempt the expasion if this fails, so
626 626 // let's not try to expand here too.
627 627 HeapRegion* hr = new_region(word_size, false /* do_expand */);
628 628 if (hr != NULL) {
629 629 first = hr->hrs_index();
630 630 } else {
631 631 first = G1_NULL_HRS_INDEX;
632 632 }
633 633 } else {
634 634 // We can't allocate humongous regions while cleanupComplete() is
635 635 // running, since some of the regions we find to be empty might not
636 636 // yet be added to the free list and it is not straightforward to
637 637 // know which list they are on so that we can remove them. Note
638 638 // that we only need to do this if we need to allocate more than
639 639 // one region to satisfy the current humongous allocation
640 640 // request. If we are only allocating one region we use the common
641 641 // region allocation code (see above).
642 642 wait_while_free_regions_coming();
643 643 append_secondary_free_list_if_not_empty_with_lock();
644 644
645 645 if (free_regions() >= num_regions) {
646 646 first = _hrs.find_contiguous(num_regions);
647 647 if (first != G1_NULL_HRS_INDEX) {
648 648 for (uint i = first; i < first + num_regions; ++i) {
649 649 HeapRegion* hr = region_at(i);
650 650 assert(hr->is_empty(), "sanity");
651 651 assert(is_on_master_free_list(hr), "sanity");
652 652 hr->set_pending_removal(true);
653 653 }
654 654 _free_list.remove_all_pending(num_regions);
655 655 }
656 656 }
657 657 }
658 658 return first;
659 659 }
660 660
661 661 HeapWord*
662 662 G1CollectedHeap::humongous_obj_allocate_initialize_regions(uint first,
663 663 uint num_regions,
664 664 size_t word_size) {
665 665 assert(first != G1_NULL_HRS_INDEX, "pre-condition");
666 666 assert(isHumongous(word_size), "word_size should be humongous");
667 667 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
668 668
669 669 // Index of last region in the series + 1.
670 670 uint last = first + num_regions;
671 671
672 672 // We need to initialize the region(s) we just discovered. This is
673 673 // a bit tricky given that it can happen concurrently with
674 674 // refinement threads refining cards on these regions and
675 675 // potentially wanting to refine the BOT as they are scanning
676 676 // those cards (this can happen shortly after a cleanup; see CR
677 677 // 6991377). So we have to set up the region(s) carefully and in
678 678 // a specific order.
679 679
680 680 // The word size sum of all the regions we will allocate.
681 681 size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords;
682 682 assert(word_size <= word_size_sum, "sanity");
683 683
684 684 // This will be the "starts humongous" region.
685 685 HeapRegion* first_hr = region_at(first);
686 686 // The header of the new object will be placed at the bottom of
687 687 // the first region.
688 688 HeapWord* new_obj = first_hr->bottom();
689 689 // This will be the new end of the first region in the series that
690 690 // should also match the end of the last region in the seriers.
691 691 HeapWord* new_end = new_obj + word_size_sum;
692 692 // This will be the new top of the first region that will reflect
693 693 // this allocation.
694 694 HeapWord* new_top = new_obj + word_size;
695 695
696 696 // First, we need to zero the header of the space that we will be
697 697 // allocating. When we update top further down, some refinement
698 698 // threads might try to scan the region. By zeroing the header we
699 699 // ensure that any thread that will try to scan the region will
700 700 // come across the zero klass word and bail out.
701 701 //
702 702 // NOTE: It would not have been correct to have used
703 703 // CollectedHeap::fill_with_object() and make the space look like
704 704 // an int array. The thread that is doing the allocation will
705 705 // later update the object header to a potentially different array
706 706 // type and, for a very short period of time, the klass and length
707 707 // fields will be inconsistent. This could cause a refinement
708 708 // thread to calculate the object size incorrectly.
709 709 Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
710 710
711 711 // We will set up the first region as "starts humongous". This
712 712 // will also update the BOT covering all the regions to reflect
713 713 // that there is a single object that starts at the bottom of the
714 714 // first region.
715 715 first_hr->set_startsHumongous(new_top, new_end);
716 716
717 717 // Then, if there are any, we will set up the "continues
718 718 // humongous" regions.
719 719 HeapRegion* hr = NULL;
720 720 for (uint i = first + 1; i < last; ++i) {
721 721 hr = region_at(i);
722 722 hr->set_continuesHumongous(first_hr);
723 723 }
724 724 // If we have "continues humongous" regions (hr != NULL), then the
725 725 // end of the last one should match new_end.
726 726 assert(hr == NULL || hr->end() == new_end, "sanity");
727 727
728 728 // Up to this point no concurrent thread would have been able to
729 729 // do any scanning on any region in this series. All the top
730 730 // fields still point to bottom, so the intersection between
731 731 // [bottom,top] and [card_start,card_end] will be empty. Before we
732 732 // update the top fields, we'll do a storestore to make sure that
733 733 // no thread sees the update to top before the zeroing of the
734 734 // object header and the BOT initialization.
735 735 OrderAccess::storestore();
736 736
737 737 // Now that the BOT and the object header have been initialized,
738 738 // we can update top of the "starts humongous" region.
739 739 assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
740 740 "new_top should be in this region");
741 741 first_hr->set_top(new_top);
742 742 if (_hr_printer.is_active()) {
743 743 HeapWord* bottom = first_hr->bottom();
744 744 HeapWord* end = first_hr->orig_end();
745 745 if ((first + 1) == last) {
746 746 // the series has a single humongous region
747 747 _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top);
748 748 } else {
749 749 // the series has more than one humongous regions
750 750 _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end);
751 751 }
752 752 }
753 753
754 754 // Now, we will update the top fields of the "continues humongous"
755 755 // regions. The reason we need to do this is that, otherwise,
756 756 // these regions would look empty and this will confuse parts of
757 757 // G1. For example, the code that looks for a consecutive number
758 758 // of empty regions will consider them empty and try to
759 759 // re-allocate them. We can extend is_empty() to also include
760 760 // !continuesHumongous(), but it is easier to just update the top
761 761 // fields here. The way we set top for all regions (i.e., top ==
762 762 // end for all regions but the last one, top == new_top for the
763 763 // last one) is actually used when we will free up the humongous
764 764 // region in free_humongous_region().
765 765 hr = NULL;
766 766 for (uint i = first + 1; i < last; ++i) {
767 767 hr = region_at(i);
768 768 if ((i + 1) == last) {
769 769 // last continues humongous region
770 770 assert(hr->bottom() < new_top && new_top <= hr->end(),
771 771 "new_top should fall on this region");
772 772 hr->set_top(new_top);
773 773 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top);
774 774 } else {
775 775 // not last one
776 776 assert(new_top > hr->end(), "new_top should be above this region");
777 777 hr->set_top(hr->end());
778 778 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
779 779 }
780 780 }
781 781 // If we have continues humongous regions (hr != NULL), then the
782 782 // end of the last one should match new_end and its top should
783 783 // match new_top.
784 784 assert(hr == NULL ||
785 785 (hr->end() == new_end && hr->top() == new_top), "sanity");
786 786
787 787 assert(first_hr->used() == word_size * HeapWordSize, "invariant");
788 788 _summary_bytes_used += first_hr->used();
789 789 _humongous_set.add(first_hr);
790 790
791 791 return new_obj;
792 792 }
793 793
794 794 // If could fit into free regions w/o expansion, try.
795 795 // Otherwise, if can expand, do so.
796 796 // Otherwise, if using ex regions might help, try with ex given back.
797 797 HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
798 798 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
799 799
800 800 verify_region_sets_optional();
801 801
802 802 size_t word_size_rounded = round_to(word_size, HeapRegion::GrainWords);
803 803 uint num_regions = (uint) (word_size_rounded / HeapRegion::GrainWords);
804 804 uint x_num = expansion_regions();
805 805 uint fs = _hrs.free_suffix();
806 806 uint first = humongous_obj_allocate_find_first(num_regions, word_size);
807 807 if (first == G1_NULL_HRS_INDEX) {
808 808 // The only thing we can do now is attempt expansion.
809 809 if (fs + x_num >= num_regions) {
810 810 // If the number of regions we're trying to allocate for this
811 811 // object is at most the number of regions in the free suffix,
812 812 // then the call to humongous_obj_allocate_find_first() above
813 813 // should have succeeded and we wouldn't be here.
814 814 //
815 815 // We should only be trying to expand when the free suffix is
816 816 // not sufficient for the object _and_ we have some expansion
817 817 // room available.
818 818 assert(num_regions > fs, "earlier allocation should have succeeded");
819 819
820 820 ergo_verbose1(ErgoHeapSizing,
821 821 "attempt heap expansion",
822 822 ergo_format_reason("humongous allocation request failed")
823 823 ergo_format_byte("allocation request"),
824 824 word_size * HeapWordSize);
825 825 if (expand((num_regions - fs) * HeapRegion::GrainBytes)) {
826 826 // Even though the heap was expanded, it might not have
827 827 // reached the desired size. So, we cannot assume that the
828 828 // allocation will succeed.
829 829 first = humongous_obj_allocate_find_first(num_regions, word_size);
830 830 }
831 831 }
832 832 }
833 833
834 834 HeapWord* result = NULL;
835 835 if (first != G1_NULL_HRS_INDEX) {
836 836 result =
837 837 humongous_obj_allocate_initialize_regions(first, num_regions, word_size);
838 838 assert(result != NULL, "it should always return a valid result");
839 839
840 840 // A successful humongous object allocation changes the used space
841 841 // information of the old generation so we need to recalculate the
842 842 // sizes and update the jstat counters here.
843 843 g1mm()->update_sizes();
844 844 }
845 845
846 846 verify_region_sets_optional();
847 847
848 848 return result;
849 849 }
850 850
851 851 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
852 852 assert_heap_not_locked_and_not_at_safepoint();
853 853 assert(!isHumongous(word_size), "we do not allow humongous TLABs");
854 854
855 855 unsigned int dummy_gc_count_before;
856 856 return attempt_allocation(word_size, &dummy_gc_count_before);
857 857 }
858 858
859 859 HeapWord*
860 860 G1CollectedHeap::mem_allocate(size_t word_size,
861 861 bool* gc_overhead_limit_was_exceeded) {
862 862 assert_heap_not_locked_and_not_at_safepoint();
863 863
864 864 // Loop until the allocation is satisified, or unsatisfied after GC.
865 865 for (int try_count = 1; /* we'll return */; try_count += 1) {
866 866 unsigned int gc_count_before;
867 867
868 868 HeapWord* result = NULL;
869 869 if (!isHumongous(word_size)) {
870 870 result = attempt_allocation(word_size, &gc_count_before);
871 871 } else {
872 872 result = attempt_allocation_humongous(word_size, &gc_count_before);
873 873 }
874 874 if (result != NULL) {
875 875 return result;
876 876 }
877 877
878 878 // Create the garbage collection operation...
879 879 VM_G1CollectForAllocation op(gc_count_before, word_size);
880 880 // ...and get the VM thread to execute it.
881 881 VMThread::execute(&op);
882 882
883 883 if (op.prologue_succeeded() && op.pause_succeeded()) {
884 884 // If the operation was successful we'll return the result even
885 885 // if it is NULL. If the allocation attempt failed immediately
886 886 // after a Full GC, it's unlikely we'll be able to allocate now.
887 887 HeapWord* result = op.result();
888 888 if (result != NULL && !isHumongous(word_size)) {
889 889 // Allocations that take place on VM operations do not do any
890 890 // card dirtying and we have to do it here. We only have to do
891 891 // this for non-humongous allocations, though.
892 892 dirty_young_block(result, word_size);
893 893 }
894 894 return result;
895 895 } else {
896 896 assert(op.result() == NULL,
897 897 "the result should be NULL if the VM op did not succeed");
898 898 }
899 899
900 900 // Give a warning if we seem to be looping forever.
901 901 if ((QueuedAllocationWarningCount > 0) &&
902 902 (try_count % QueuedAllocationWarningCount == 0)) {
903 903 warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
904 904 }
905 905 }
906 906
907 907 ShouldNotReachHere();
908 908 return NULL;
909 909 }
910 910
911 911 HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
912 912 unsigned int *gc_count_before_ret) {
913 913 // Make sure you read the note in attempt_allocation_humongous().
914 914
915 915 assert_heap_not_locked_and_not_at_safepoint();
916 916 assert(!isHumongous(word_size), "attempt_allocation_slow() should not "
917 917 "be called for humongous allocation requests");
918 918
919 919 // We should only get here after the first-level allocation attempt
920 920 // (attempt_allocation()) failed to allocate.
921 921
922 922 // We will loop until a) we manage to successfully perform the
923 923 // allocation or b) we successfully schedule a collection which
924 924 // fails to perform the allocation. b) is the only case when we'll
925 925 // return NULL.
926 926 HeapWord* result = NULL;
927 927 for (int try_count = 1; /* we'll return */; try_count += 1) {
928 928 bool should_try_gc;
929 929 unsigned int gc_count_before;
930 930
931 931 {
932 932 MutexLockerEx x(Heap_lock);
933 933
934 934 result = _mutator_alloc_region.attempt_allocation_locked(word_size,
935 935 false /* bot_updates */);
936 936 if (result != NULL) {
937 937 return result;
938 938 }
939 939
940 940 // If we reach here, attempt_allocation_locked() above failed to
941 941 // allocate a new region. So the mutator alloc region should be NULL.
942 942 assert(_mutator_alloc_region.get() == NULL, "only way to get here");
943 943
944 944 if (GC_locker::is_active_and_needs_gc()) {
945 945 if (g1_policy()->can_expand_young_list()) {
946 946 // No need for an ergo verbose message here,
947 947 // can_expand_young_list() does this when it returns true.
948 948 result = _mutator_alloc_region.attempt_allocation_force(word_size,
949 949 false /* bot_updates */);
950 950 if (result != NULL) {
951 951 return result;
952 952 }
953 953 }
954 954 should_try_gc = false;
955 955 } else {
956 956 // The GCLocker may not be active but the GCLocker initiated
957 957 // GC may not yet have been performed (GCLocker::needs_gc()
958 958 // returns true). In this case we do not try this GC and
959 959 // wait until the GCLocker initiated GC is performed, and
960 960 // then retry the allocation.
961 961 if (GC_locker::needs_gc()) {
962 962 should_try_gc = false;
963 963 } else {
964 964 // Read the GC count while still holding the Heap_lock.
965 965 gc_count_before = total_collections();
966 966 should_try_gc = true;
967 967 }
968 968 }
969 969 }
970 970
971 971 if (should_try_gc) {
972 972 bool succeeded;
973 973 result = do_collection_pause(word_size, gc_count_before, &succeeded);
974 974 if (result != NULL) {
975 975 assert(succeeded, "only way to get back a non-NULL result");
976 976 return result;
977 977 }
978 978
979 979 if (succeeded) {
980 980 // If we get here we successfully scheduled a collection which
981 981 // failed to allocate. No point in trying to allocate
982 982 // further. We'll just return NULL.
983 983 MutexLockerEx x(Heap_lock);
984 984 *gc_count_before_ret = total_collections();
985 985 return NULL;
986 986 }
987 987 } else {
988 988 // The GCLocker is either active or the GCLocker initiated
989 989 // GC has not yet been performed. Stall until it is and
990 990 // then retry the allocation.
991 991 GC_locker::stall_until_clear();
992 992 }
993 993
994 994 // We can reach here if we were unsuccessul in scheduling a
995 995 // collection (because another thread beat us to it) or if we were
996 996 // stalled due to the GC locker. In either can we should retry the
997 997 // allocation attempt in case another thread successfully
998 998 // performed a collection and reclaimed enough space. We do the
999 999 // first attempt (without holding the Heap_lock) here and the
1000 1000 // follow-on attempt will be at the start of the next loop
1001 1001 // iteration (after taking the Heap_lock).
1002 1002 result = _mutator_alloc_region.attempt_allocation(word_size,
1003 1003 false /* bot_updates */);
1004 1004 if (result != NULL) {
1005 1005 return result;
1006 1006 }
1007 1007
1008 1008 // Give a warning if we seem to be looping forever.
1009 1009 if ((QueuedAllocationWarningCount > 0) &&
1010 1010 (try_count % QueuedAllocationWarningCount == 0)) {
1011 1011 warning("G1CollectedHeap::attempt_allocation_slow() "
1012 1012 "retries %d times", try_count);
1013 1013 }
1014 1014 }
1015 1015
1016 1016 ShouldNotReachHere();
1017 1017 return NULL;
1018 1018 }
1019 1019
1020 1020 HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
1021 1021 unsigned int * gc_count_before_ret) {
1022 1022 // The structure of this method has a lot of similarities to
1023 1023 // attempt_allocation_slow(). The reason these two were not merged
1024 1024 // into a single one is that such a method would require several "if
1025 1025 // allocation is not humongous do this, otherwise do that"
1026 1026 // conditional paths which would obscure its flow. In fact, an early
1027 1027 // version of this code did use a unified method which was harder to
1028 1028 // follow and, as a result, it had subtle bugs that were hard to
1029 1029 // track down. So keeping these two methods separate allows each to
1030 1030 // be more readable. It will be good to keep these two in sync as
1031 1031 // much as possible.
1032 1032
1033 1033 assert_heap_not_locked_and_not_at_safepoint();
1034 1034 assert(isHumongous(word_size), "attempt_allocation_humongous() "
1035 1035 "should only be called for humongous allocations");
1036 1036
1037 1037 // Humongous objects can exhaust the heap quickly, so we should check if we
1038 1038 // need to start a marking cycle at each humongous object allocation. We do
1039 1039 // the check before we do the actual allocation. The reason for doing it
1040 1040 // before the allocation is that we avoid having to keep track of the newly
1041 1041 // allocated memory while we do a GC.
1042 1042 if (g1_policy()->need_to_start_conc_mark("concurrent humongous allocation",
1043 1043 word_size)) {
1044 1044 collect(GCCause::_g1_humongous_allocation);
1045 1045 }
1046 1046
1047 1047 // We will loop until a) we manage to successfully perform the
1048 1048 // allocation or b) we successfully schedule a collection which
1049 1049 // fails to perform the allocation. b) is the only case when we'll
1050 1050 // return NULL.
1051 1051 HeapWord* result = NULL;
1052 1052 for (int try_count = 1; /* we'll return */; try_count += 1) {
1053 1053 bool should_try_gc;
1054 1054 unsigned int gc_count_before;
1055 1055
1056 1056 {
1057 1057 MutexLockerEx x(Heap_lock);
1058 1058
1059 1059 // Given that humongous objects are not allocated in young
1060 1060 // regions, we'll first try to do the allocation without doing a
1061 1061 // collection hoping that there's enough space in the heap.
1062 1062 result = humongous_obj_allocate(word_size);
1063 1063 if (result != NULL) {
1064 1064 return result;
1065 1065 }
1066 1066
1067 1067 if (GC_locker::is_active_and_needs_gc()) {
1068 1068 should_try_gc = false;
1069 1069 } else {
1070 1070 // The GCLocker may not be active but the GCLocker initiated
1071 1071 // GC may not yet have been performed (GCLocker::needs_gc()
1072 1072 // returns true). In this case we do not try this GC and
1073 1073 // wait until the GCLocker initiated GC is performed, and
1074 1074 // then retry the allocation.
1075 1075 if (GC_locker::needs_gc()) {
1076 1076 should_try_gc = false;
1077 1077 } else {
1078 1078 // Read the GC count while still holding the Heap_lock.
1079 1079 gc_count_before = total_collections();
1080 1080 should_try_gc = true;
1081 1081 }
1082 1082 }
1083 1083 }
1084 1084
1085 1085 if (should_try_gc) {
1086 1086 // If we failed to allocate the humongous object, we should try to
1087 1087 // do a collection pause (if we're allowed) in case it reclaims
1088 1088 // enough space for the allocation to succeed after the pause.
1089 1089
1090 1090 bool succeeded;
1091 1091 result = do_collection_pause(word_size, gc_count_before, &succeeded);
1092 1092 if (result != NULL) {
1093 1093 assert(succeeded, "only way to get back a non-NULL result");
1094 1094 return result;
1095 1095 }
1096 1096
1097 1097 if (succeeded) {
1098 1098 // If we get here we successfully scheduled a collection which
1099 1099 // failed to allocate. No point in trying to allocate
1100 1100 // further. We'll just return NULL.
1101 1101 MutexLockerEx x(Heap_lock);
1102 1102 *gc_count_before_ret = total_collections();
1103 1103 return NULL;
1104 1104 }
1105 1105 } else {
1106 1106 // The GCLocker is either active or the GCLocker initiated
1107 1107 // GC has not yet been performed. Stall until it is and
1108 1108 // then retry the allocation.
1109 1109 GC_locker::stall_until_clear();
1110 1110 }
1111 1111
1112 1112 // We can reach here if we were unsuccessul in scheduling a
1113 1113 // collection (because another thread beat us to it) or if we were
1114 1114 // stalled due to the GC locker. In either can we should retry the
1115 1115 // allocation attempt in case another thread successfully
1116 1116 // performed a collection and reclaimed enough space. Give a
1117 1117 // warning if we seem to be looping forever.
1118 1118
1119 1119 if ((QueuedAllocationWarningCount > 0) &&
1120 1120 (try_count % QueuedAllocationWarningCount == 0)) {
1121 1121 warning("G1CollectedHeap::attempt_allocation_humongous() "
1122 1122 "retries %d times", try_count);
1123 1123 }
1124 1124 }
1125 1125
1126 1126 ShouldNotReachHere();
1127 1127 return NULL;
1128 1128 }
1129 1129
1130 1130 HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
1131 1131 bool expect_null_mutator_alloc_region) {
1132 1132 assert_at_safepoint(true /* should_be_vm_thread */);
1133 1133 assert(_mutator_alloc_region.get() == NULL ||
1134 1134 !expect_null_mutator_alloc_region,
1135 1135 "the current alloc region was unexpectedly found to be non-NULL");
1136 1136
1137 1137 if (!isHumongous(word_size)) {
1138 1138 return _mutator_alloc_region.attempt_allocation_locked(word_size,
1139 1139 false /* bot_updates */);
1140 1140 } else {
1141 1141 HeapWord* result = humongous_obj_allocate(word_size);
1142 1142 if (result != NULL && g1_policy()->need_to_start_conc_mark("STW humongous allocation")) {
1143 1143 g1_policy()->set_initiate_conc_mark_if_possible();
1144 1144 }
1145 1145 return result;
1146 1146 }
1147 1147
1148 1148 ShouldNotReachHere();
1149 1149 }
1150 1150
1151 1151 class PostMCRemSetClearClosure: public HeapRegionClosure {
1152 1152 G1CollectedHeap* _g1h;
1153 1153 ModRefBarrierSet* _mr_bs;
1154 1154 public:
1155 1155 PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
1156 1156 _g1h(g1h), _mr_bs(mr_bs) { }
1157 1157 bool doHeapRegion(HeapRegion* r) {
1158 1158 if (r->continuesHumongous()) {
1159 1159 return false;
1160 1160 }
1161 1161 _g1h->reset_gc_time_stamps(r);
1162 1162 HeapRegionRemSet* hrrs = r->rem_set();
1163 1163 if (hrrs != NULL) hrrs->clear();
1164 1164 // You might think here that we could clear just the cards
1165 1165 // corresponding to the used region. But no: if we leave a dirty card
1166 1166 // in a region we might allocate into, then it would prevent that card
1167 1167 // from being enqueued, and cause it to be missed.
1168 1168 // Re: the performance cost: we shouldn't be doing full GC anyway!
1169 1169 _mr_bs->clear(MemRegion(r->bottom(), r->end()));
1170 1170 return false;
1171 1171 }
1172 1172 };
1173 1173
1174 1174 void G1CollectedHeap::clear_rsets_post_compaction() {
1175 1175 PostMCRemSetClearClosure rs_clear(this, mr_bs());
1176 1176 heap_region_iterate(&rs_clear);
1177 1177 }
1178 1178
1179 1179 class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
1180 1180 G1CollectedHeap* _g1h;
1181 1181 UpdateRSOopClosure _cl;
1182 1182 int _worker_i;
1183 1183 public:
1184 1184 RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
1185 1185 _cl(g1->g1_rem_set(), worker_i),
1186 1186 _worker_i(worker_i),
1187 1187 _g1h(g1)
1188 1188 { }
1189 1189
1190 1190 bool doHeapRegion(HeapRegion* r) {
1191 1191 if (!r->continuesHumongous()) {
1192 1192 _cl.set_from(r);
1193 1193 r->oop_iterate(&_cl);
1194 1194 }
1195 1195 return false;
1196 1196 }
1197 1197 };
1198 1198
1199 1199 class ParRebuildRSTask: public AbstractGangTask {
1200 1200 G1CollectedHeap* _g1;
1201 1201 public:
1202 1202 ParRebuildRSTask(G1CollectedHeap* g1)
1203 1203 : AbstractGangTask("ParRebuildRSTask"),
1204 1204 _g1(g1)
1205 1205 { }
1206 1206
1207 1207 void work(uint worker_id) {
1208 1208 RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
1209 1209 _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id,
1210 1210 _g1->workers()->active_workers(),
1211 1211 HeapRegion::RebuildRSClaimValue);
1212 1212 }
1213 1213 };
1214 1214
1215 1215 class PostCompactionPrinterClosure: public HeapRegionClosure {
1216 1216 private:
1217 1217 G1HRPrinter* _hr_printer;
1218 1218 public:
1219 1219 bool doHeapRegion(HeapRegion* hr) {
1220 1220 assert(!hr->is_young(), "not expecting to find young regions");
1221 1221 // We only generate output for non-empty regions.
1222 1222 if (!hr->is_empty()) {
1223 1223 if (!hr->isHumongous()) {
1224 1224 _hr_printer->post_compaction(hr, G1HRPrinter::Old);
1225 1225 } else if (hr->startsHumongous()) {
1226 1226 if (hr->region_num() == 1) {
1227 1227 // single humongous region
1228 1228 _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous);
1229 1229 } else {
1230 1230 _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous);
1231 1231 }
1232 1232 } else {
1233 1233 assert(hr->continuesHumongous(), "only way to get here");
1234 1234 _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous);
1235 1235 }
1236 1236 }
1237 1237 return false;
1238 1238 }
1239 1239
1240 1240 PostCompactionPrinterClosure(G1HRPrinter* hr_printer)
1241 1241 : _hr_printer(hr_printer) { }
1242 1242 };
1243 1243
1244 1244 void G1CollectedHeap::print_hrs_post_compaction() {
1245 1245 PostCompactionPrinterClosure cl(hr_printer());
1246 1246 heap_region_iterate(&cl);
1247 1247 }
1248 1248
1249 1249 bool G1CollectedHeap::do_collection(bool explicit_gc,
1250 1250 bool clear_all_soft_refs,
1251 1251 size_t word_size) {
1252 1252 assert_at_safepoint(true /* should_be_vm_thread */);
1253 1253
1254 1254 if (GC_locker::check_active_before_gc()) {
1255 1255 return false;
1256 1256 }
1257 1257
1258 1258 SvcGCMarker sgcm(SvcGCMarker::FULL);
1259 1259 ResourceMark rm;
1260 1260
1261 1261 print_heap_before_gc();
1262 1262
1263 1263 HRSPhaseSetter x(HRSPhaseFullGC);
1264 1264 verify_region_sets_optional();
1265 1265
1266 1266 const bool do_clear_all_soft_refs = clear_all_soft_refs ||
1267 1267 collector_policy()->should_clear_all_soft_refs();
1268 1268
1269 1269 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
1270 1270
1271 1271 {
1272 1272 IsGCActiveMark x;
1273 1273
1274 1274 // Timing
1275 1275 assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
1276 1276 gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
1277 1277 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
1278 1278
1279 1279 TraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, gclog_or_tty);
1280 1280 TraceCollectorStats tcs(g1mm()->full_collection_counters());
1281 1281 TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
1282 1282
1283 1283 double start = os::elapsedTime();
1284 1284 g1_policy()->record_full_collection_start();
1285 1285
1286 1286 // Note: When we have a more flexible GC logging framework that
1287 1287 // allows us to add optional attributes to a GC log record we
1288 1288 // could consider timing and reporting how long we wait in the
1289 1289 // following two methods.
1290 1290 wait_while_free_regions_coming();
1291 1291 // If we start the compaction before the CM threads finish
1292 1292 // scanning the root regions we might trip them over as we'll
1293 1293 // be moving objects / updating references. So let's wait until
1294 1294 // they are done. By telling them to abort, they should complete
1295 1295 // early.
1296 1296 _cm->root_regions()->abort();
1297 1297 _cm->root_regions()->wait_until_scan_finished();
1298 1298 append_secondary_free_list_if_not_empty_with_lock();
1299 1299
1300 1300 gc_prologue(true);
1301 1301 increment_total_collections(true /* full gc */);
1302 1302 increment_old_marking_cycles_started();
1303 1303
1304 1304 size_t g1h_prev_used = used();
1305 1305 assert(used() == recalculate_used(), "Should be equal");
1306 1306
1307 1307 if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
1308 1308 HandleMark hm; // Discard invalid handles created during verification
1309 1309 gclog_or_tty->print(" VerifyBeforeGC:");
1310 1310 prepare_for_verify();
1311 1311 Universe::verify(/* silent */ false,
1312 1312 /* option */ VerifyOption_G1UsePrevMarking);
1313 1313
1314 1314 }
1315 1315 pre_full_gc_dump();
1316 1316
1317 1317 COMPILER2_PRESENT(DerivedPointerTable::clear());
1318 1318
1319 1319 // Disable discovery and empty the discovered lists
1320 1320 // for the CM ref processor.
1321 1321 ref_processor_cm()->disable_discovery();
1322 1322 ref_processor_cm()->abandon_partial_discovery();
1323 1323 ref_processor_cm()->verify_no_references_recorded();
1324 1324
1325 1325 // Abandon current iterations of concurrent marking and concurrent
1326 1326 // refinement, if any are in progress. We have to do this before
1327 1327 // wait_until_scan_finished() below.
1328 1328 concurrent_mark()->abort();
1329 1329
1330 1330 // Make sure we'll choose a new allocation region afterwards.
1331 1331 release_mutator_alloc_region();
1332 1332 abandon_gc_alloc_regions();
1333 1333 g1_rem_set()->cleanupHRRS();
1334 1334
1335 1335 // We should call this after we retire any currently active alloc
1336 1336 // regions so that all the ALLOC / RETIRE events are generated
1337 1337 // before the start GC event.
1338 1338 _hr_printer.start_gc(true /* full */, (size_t) total_collections());
1339 1339
1340 1340 // We may have added regions to the current incremental collection
1341 1341 // set between the last GC or pause and now. We need to clear the
1342 1342 // incremental collection set and then start rebuilding it afresh
1343 1343 // after this full GC.
1344 1344 abandon_collection_set(g1_policy()->inc_cset_head());
1345 1345 g1_policy()->clear_incremental_cset();
1346 1346 g1_policy()->stop_incremental_cset_building();
1347 1347
1348 1348 tear_down_region_sets(false /* free_list_only */);
1349 1349 g1_policy()->set_gcs_are_young(true);
1350 1350
1351 1351 // See the comments in g1CollectedHeap.hpp and
1352 1352 // G1CollectedHeap::ref_processing_init() about
1353 1353 // how reference processing currently works in G1.
1354 1354
1355 1355 // Temporarily make discovery by the STW ref processor single threaded (non-MT).
1356 1356 ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
1357 1357
1358 1358 // Temporarily clear the STW ref processor's _is_alive_non_header field.
1359 1359 ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
1360 1360
1361 1361 ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
1362 1362 ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
1363 1363
1364 1364 // Do collection work
1365 1365 {
1366 1366 HandleMark hm; // Discard invalid handles created during gc
1367 1367 G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
1368 1368 }
1369 1369
1370 1370 assert(free_regions() == 0, "we should not have added any free regions");
1371 1371 rebuild_region_sets(false /* free_list_only */);
1372 1372
1373 1373 // Enqueue any discovered reference objects that have
1374 1374 // not been removed from the discovered lists.
1375 1375 ref_processor_stw()->enqueue_discovered_references();
1376 1376
1377 1377 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
1378 1378
1379 1379 MemoryService::track_memory_usage();
1380 1380
1381 1381 if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
1382 1382 HandleMark hm; // Discard invalid handles created during verification
1383 1383 gclog_or_tty->print(" VerifyAfterGC:");
1384 1384 prepare_for_verify();
1385 1385 Universe::verify(/* silent */ false,
1386 1386 /* option */ VerifyOption_G1UsePrevMarking);
1387 1387
1388 1388 }
1389 1389
1390 1390 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
1391 1391 ref_processor_stw()->verify_no_references_recorded();
1392 1392
1393 1393 // Note: since we've just done a full GC, concurrent
1394 1394 // marking is no longer active. Therefore we need not
1395 1395 // re-enable reference discovery for the CM ref processor.
1396 1396 // That will be done at the start of the next marking cycle.
1397 1397 assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
1398 1398 ref_processor_cm()->verify_no_references_recorded();
1399 1399
1400 1400 reset_gc_time_stamp();
1401 1401 // Since everything potentially moved, we will clear all remembered
1402 1402 // sets, and clear all cards. Later we will rebuild remebered
1403 1403 // sets. We will also reset the GC time stamps of the regions.
1404 1404 clear_rsets_post_compaction();
1405 1405 check_gc_time_stamps();
1406 1406
1407 1407 // Resize the heap if necessary.
1408 1408 resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
1409 1409
1410 1410 if (_hr_printer.is_active()) {
1411 1411 // We should do this after we potentially resize the heap so
1412 1412 // that all the COMMIT / UNCOMMIT events are generated before
1413 1413 // the end GC event.
1414 1414
1415 1415 print_hrs_post_compaction();
1416 1416 _hr_printer.end_gc(true /* full */, (size_t) total_collections());
1417 1417 }
1418 1418
1419 1419 if (_cg1r->use_cache()) {
1420 1420 _cg1r->clear_and_record_card_counts();
1421 1421 _cg1r->clear_hot_cache();
1422 1422 }
1423 1423
1424 1424 // Rebuild remembered sets of all regions.
1425 1425 if (G1CollectedHeap::use_parallel_gc_threads()) {
1426 1426 uint n_workers =
1427 1427 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
1428 1428 workers()->active_workers(),
1429 1429 Threads::number_of_non_daemon_threads());
1430 1430 assert(UseDynamicNumberOfGCThreads ||
1431 1431 n_workers == workers()->total_workers(),
1432 1432 "If not dynamic should be using all the workers");
1433 1433 workers()->set_active_workers(n_workers);
1434 1434 // Set parallel threads in the heap (_n_par_threads) only
1435 1435 // before a parallel phase and always reset it to 0 after
1436 1436 // the phase so that the number of parallel threads does
1437 1437 // no get carried forward to a serial phase where there
1438 1438 // may be code that is "possibly_parallel".
1439 1439 set_par_threads(n_workers);
1440 1440
1441 1441 ParRebuildRSTask rebuild_rs_task(this);
1442 1442 assert(check_heap_region_claim_values(
1443 1443 HeapRegion::InitialClaimValue), "sanity check");
1444 1444 assert(UseDynamicNumberOfGCThreads ||
1445 1445 workers()->active_workers() == workers()->total_workers(),
1446 1446 "Unless dynamic should use total workers");
1447 1447 // Use the most recent number of active workers
1448 1448 assert(workers()->active_workers() > 0,
1449 1449 "Active workers not properly set");
1450 1450 set_par_threads(workers()->active_workers());
1451 1451 workers()->run_task(&rebuild_rs_task);
1452 1452 set_par_threads(0);
1453 1453 assert(check_heap_region_claim_values(
1454 1454 HeapRegion::RebuildRSClaimValue), "sanity check");
1455 1455 reset_heap_region_claim_values();
1456 1456 } else {
1457 1457 RebuildRSOutOfRegionClosure rebuild_rs(this);
1458 1458 heap_region_iterate(&rebuild_rs);
1459 1459 }
1460 1460
1461 1461 if (G1Log::fine()) {
1462 1462 print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity());
1463 1463 }
1464 1464
1465 1465 if (true) { // FIXME
1466 1466 // Ask the permanent generation to adjust size for full collections
1467 1467 perm()->compute_new_size();
1468 1468 }
1469 1469
1470 1470 // Start a new incremental collection set for the next pause
1471 1471 assert(g1_policy()->collection_set() == NULL, "must be");
1472 1472 g1_policy()->start_incremental_cset_building();
1473 1473
1474 1474 // Clear the _cset_fast_test bitmap in anticipation of adding
1475 1475 // regions to the incremental collection set for the next
1476 1476 // evacuation pause.
1477 1477 clear_cset_fast_test();
1478 1478
1479 1479 init_mutator_alloc_region();
1480 1480
1481 1481 double end = os::elapsedTime();
1482 1482 g1_policy()->record_full_collection_end();
1483 1483
1484 1484 #ifdef TRACESPINNING
1485 1485 ParallelTaskTerminator::print_termination_counts();
1486 1486 #endif
1487 1487
1488 1488 gc_epilogue(true);
1489 1489
1490 1490 // Discard all rset updates
1491 1491 JavaThread::dirty_card_queue_set().abandon_logs();
1492 1492 assert(!G1DeferredRSUpdate
1493 1493 || (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
1494 1494
1495 1495 _young_list->reset_sampled_info();
1496 1496 // At this point there should be no regions in the
1497 1497 // entire heap tagged as young.
1498 1498 assert( check_young_list_empty(true /* check_heap */),
1499 1499 "young list should be empty at this point");
1500 1500
1501 1501 // Update the number of full collections that have been completed.
1502 1502 increment_old_marking_cycles_completed(false /* concurrent */);
1503 1503
1504 1504 _hrs.verify_optional();
1505 1505 verify_region_sets_optional();
1506 1506
1507 1507 print_heap_after_gc();
1508 1508
1509 1509 // We must call G1MonitoringSupport::update_sizes() in the same scoping level
1510 1510 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
1511 1511 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
1512 1512 // before any GC notifications are raised.
1513 1513 g1mm()->update_sizes();
1514 1514 }
1515 1515
1516 1516 post_full_gc_dump();
1517 1517
1518 1518 return true;
1519 1519 }
1520 1520
1521 1521 void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
1522 1522 // do_collection() will return whether it succeeded in performing
1523 1523 // the GC. Currently, there is no facility on the
1524 1524 // do_full_collection() API to notify the caller than the collection
1525 1525 // did not succeed (e.g., because it was locked out by the GC
1526 1526 // locker). So, right now, we'll ignore the return value.
1527 1527 bool dummy = do_collection(true, /* explicit_gc */
1528 1528 clear_all_soft_refs,
1529 1529 0 /* word_size */);
1530 1530 }
1531 1531
1532 1532 // This code is mostly copied from TenuredGeneration.
1533 1533 void
1534 1534 G1CollectedHeap::
1535 1535 resize_if_necessary_after_full_collection(size_t word_size) {
1536 1536 assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
1537 1537
1538 1538 // Include the current allocation, if any, and bytes that will be
1539 1539 // pre-allocated to support collections, as "used".
1540 1540 const size_t used_after_gc = used();
1541 1541 const size_t capacity_after_gc = capacity();
1542 1542 const size_t free_after_gc = capacity_after_gc - used_after_gc;
1543 1543
1544 1544 // This is enforced in arguments.cpp.
1545 1545 assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
1546 1546 "otherwise the code below doesn't make sense");
1547 1547
1548 1548 // We don't have floating point command-line arguments
1549 1549 const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1550 1550 const double maximum_used_percentage = 1.0 - minimum_free_percentage;
1551 1551 const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1552 1552 const double minimum_used_percentage = 1.0 - maximum_free_percentage;
1553 1553
1554 1554 const size_t min_heap_size = collector_policy()->min_heap_byte_size();
1555 1555 const size_t max_heap_size = collector_policy()->max_heap_byte_size();
1556 1556
1557 1557 // We have to be careful here as these two calculations can overflow
1558 1558 // 32-bit size_t's.
1559 1559 double used_after_gc_d = (double) used_after_gc;
1560 1560 double minimum_desired_capacity_d = used_after_gc_d / maximum_used_percentage;
1561 1561 double maximum_desired_capacity_d = used_after_gc_d / minimum_used_percentage;
1562 1562
1563 1563 // Let's make sure that they are both under the max heap size, which
1564 1564 // by default will make them fit into a size_t.
1565 1565 double desired_capacity_upper_bound = (double) max_heap_size;
1566 1566 minimum_desired_capacity_d = MIN2(minimum_desired_capacity_d,
1567 1567 desired_capacity_upper_bound);
1568 1568 maximum_desired_capacity_d = MIN2(maximum_desired_capacity_d,
1569 1569 desired_capacity_upper_bound);
1570 1570
1571 1571 // We can now safely turn them into size_t's.
1572 1572 size_t minimum_desired_capacity = (size_t) minimum_desired_capacity_d;
1573 1573 size_t maximum_desired_capacity = (size_t) maximum_desired_capacity_d;
1574 1574
1575 1575 // This assert only makes sense here, before we adjust them
1576 1576 // with respect to the min and max heap size.
1577 1577 assert(minimum_desired_capacity <= maximum_desired_capacity,
1578 1578 err_msg("minimum_desired_capacity = "SIZE_FORMAT", "
1579 1579 "maximum_desired_capacity = "SIZE_FORMAT,
1580 1580 minimum_desired_capacity, maximum_desired_capacity));
1581 1581
1582 1582 // Should not be greater than the heap max size. No need to adjust
1583 1583 // it with respect to the heap min size as it's a lower bound (i.e.,
1584 1584 // we'll try to make the capacity larger than it, not smaller).
1585 1585 minimum_desired_capacity = MIN2(minimum_desired_capacity, max_heap_size);
1586 1586 // Should not be less than the heap min size. No need to adjust it
1587 1587 // with respect to the heap max size as it's an upper bound (i.e.,
1588 1588 // we'll try to make the capacity smaller than it, not greater).
1589 1589 maximum_desired_capacity = MAX2(maximum_desired_capacity, min_heap_size);
1590 1590
1591 1591 if (capacity_after_gc < minimum_desired_capacity) {
1592 1592 // Don't expand unless it's significant
1593 1593 size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
1594 1594 ergo_verbose4(ErgoHeapSizing,
1595 1595 "attempt heap expansion",
1596 1596 ergo_format_reason("capacity lower than "
1597 1597 "min desired capacity after Full GC")
1598 1598 ergo_format_byte("capacity")
1599 1599 ergo_format_byte("occupancy")
1600 1600 ergo_format_byte_perc("min desired capacity"),
1601 1601 capacity_after_gc, used_after_gc,
1602 1602 minimum_desired_capacity, (double) MinHeapFreeRatio);
1603 1603 expand(expand_bytes);
1604 1604
1605 1605 // No expansion, now see if we want to shrink
1606 1606 } else if (capacity_after_gc > maximum_desired_capacity) {
1607 1607 // Capacity too large, compute shrinking size
1608 1608 size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
1609 1609 ergo_verbose4(ErgoHeapSizing,
1610 1610 "attempt heap shrinking",
1611 1611 ergo_format_reason("capacity higher than "
1612 1612 "max desired capacity after Full GC")
1613 1613 ergo_format_byte("capacity")
1614 1614 ergo_format_byte("occupancy")
1615 1615 ergo_format_byte_perc("max desired capacity"),
1616 1616 capacity_after_gc, used_after_gc,
1617 1617 maximum_desired_capacity, (double) MaxHeapFreeRatio);
1618 1618 shrink(shrink_bytes);
1619 1619 }
1620 1620 }
1621 1621
1622 1622
1623 1623 HeapWord*
1624 1624 G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
1625 1625 bool* succeeded) {
1626 1626 assert_at_safepoint(true /* should_be_vm_thread */);
1627 1627
1628 1628 *succeeded = true;
1629 1629 // Let's attempt the allocation first.
1630 1630 HeapWord* result =
1631 1631 attempt_allocation_at_safepoint(word_size,
1632 1632 false /* expect_null_mutator_alloc_region */);
1633 1633 if (result != NULL) {
1634 1634 assert(*succeeded, "sanity");
1635 1635 return result;
1636 1636 }
1637 1637
1638 1638 // In a G1 heap, we're supposed to keep allocation from failing by
1639 1639 // incremental pauses. Therefore, at least for now, we'll favor
1640 1640 // expansion over collection. (This might change in the future if we can
1641 1641 // do something smarter than full collection to satisfy a failed alloc.)
1642 1642 result = expand_and_allocate(word_size);
1643 1643 if (result != NULL) {
1644 1644 assert(*succeeded, "sanity");
1645 1645 return result;
1646 1646 }
1647 1647
1648 1648 // Expansion didn't work, we'll try to do a Full GC.
1649 1649 bool gc_succeeded = do_collection(false, /* explicit_gc */
1650 1650 false, /* clear_all_soft_refs */
1651 1651 word_size);
1652 1652 if (!gc_succeeded) {
1653 1653 *succeeded = false;
1654 1654 return NULL;
1655 1655 }
1656 1656
1657 1657 // Retry the allocation
1658 1658 result = attempt_allocation_at_safepoint(word_size,
1659 1659 true /* expect_null_mutator_alloc_region */);
1660 1660 if (result != NULL) {
1661 1661 assert(*succeeded, "sanity");
1662 1662 return result;
1663 1663 }
1664 1664
1665 1665 // Then, try a Full GC that will collect all soft references.
1666 1666 gc_succeeded = do_collection(false, /* explicit_gc */
1667 1667 true, /* clear_all_soft_refs */
1668 1668 word_size);
1669 1669 if (!gc_succeeded) {
1670 1670 *succeeded = false;
1671 1671 return NULL;
1672 1672 }
1673 1673
1674 1674 // Retry the allocation once more
1675 1675 result = attempt_allocation_at_safepoint(word_size,
1676 1676 true /* expect_null_mutator_alloc_region */);
1677 1677 if (result != NULL) {
1678 1678 assert(*succeeded, "sanity");
1679 1679 return result;
1680 1680 }
1681 1681
1682 1682 assert(!collector_policy()->should_clear_all_soft_refs(),
1683 1683 "Flag should have been handled and cleared prior to this point");
1684 1684
1685 1685 // What else? We might try synchronous finalization later. If the total
1686 1686 // space available is large enough for the allocation, then a more
1687 1687 // complete compaction phase than we've tried so far might be
1688 1688 // appropriate.
1689 1689 assert(*succeeded, "sanity");
1690 1690 return NULL;
1691 1691 }
1692 1692
1693 1693 // Attempting to expand the heap sufficiently
1694 1694 // to support an allocation of the given "word_size". If
1695 1695 // successful, perform the allocation and return the address of the
1696 1696 // allocated block, or else "NULL".
1697 1697
1698 1698 HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
1699 1699 assert_at_safepoint(true /* should_be_vm_thread */);
1700 1700
1701 1701 verify_region_sets_optional();
1702 1702
1703 1703 size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes);
1704 1704 ergo_verbose1(ErgoHeapSizing,
1705 1705 "attempt heap expansion",
1706 1706 ergo_format_reason("allocation request failed")
1707 1707 ergo_format_byte("allocation request"),
1708 1708 word_size * HeapWordSize);
1709 1709 if (expand(expand_bytes)) {
1710 1710 _hrs.verify_optional();
1711 1711 verify_region_sets_optional();
1712 1712 return attempt_allocation_at_safepoint(word_size,
1713 1713 false /* expect_null_mutator_alloc_region */);
1714 1714 }
1715 1715 return NULL;
1716 1716 }
1717 1717
1718 1718 void G1CollectedHeap::update_committed_space(HeapWord* old_end,
1719 1719 HeapWord* new_end) {
1720 1720 assert(old_end != new_end, "don't call this otherwise");
1721 1721 assert((HeapWord*) _g1_storage.high() == new_end, "invariant");
1722 1722
1723 1723 // Update the committed mem region.
1724 1724 _g1_committed.set_end(new_end);
1725 1725 // Tell the card table about the update.
1726 1726 Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
1727 1727 // Tell the BOT about the update.
1728 1728 _bot_shared->resize(_g1_committed.word_size());
1729 1729 }
1730 1730
1731 1731 bool G1CollectedHeap::expand(size_t expand_bytes) {
1732 1732 size_t old_mem_size = _g1_storage.committed_size();
1733 1733 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
1734 1734 aligned_expand_bytes = align_size_up(aligned_expand_bytes,
1735 1735 HeapRegion::GrainBytes);
1736 1736 ergo_verbose2(ErgoHeapSizing,
1737 1737 "expand the heap",
1738 1738 ergo_format_byte("requested expansion amount")
1739 1739 ergo_format_byte("attempted expansion amount"),
1740 1740 expand_bytes, aligned_expand_bytes);
1741 1741
1742 1742 // First commit the memory.
1743 1743 HeapWord* old_end = (HeapWord*) _g1_storage.high();
1744 1744 bool successful = _g1_storage.expand_by(aligned_expand_bytes);
1745 1745 if (successful) {
1746 1746 // Then propagate this update to the necessary data structures.
1747 1747 HeapWord* new_end = (HeapWord*) _g1_storage.high();
1748 1748 update_committed_space(old_end, new_end);
1749 1749
1750 1750 FreeRegionList expansion_list("Local Expansion List");
1751 1751 MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list);
1752 1752 assert(mr.start() == old_end, "post-condition");
1753 1753 // mr might be a smaller region than what was requested if
1754 1754 // expand_by() was unable to allocate the HeapRegion instances
1755 1755 assert(mr.end() <= new_end, "post-condition");
1756 1756
1757 1757 size_t actual_expand_bytes = mr.byte_size();
1758 1758 assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition");
1759 1759 assert(actual_expand_bytes == expansion_list.total_capacity_bytes(),
1760 1760 "post-condition");
1761 1761 if (actual_expand_bytes < aligned_expand_bytes) {
1762 1762 // We could not expand _hrs to the desired size. In this case we
1763 1763 // need to shrink the committed space accordingly.
1764 1764 assert(mr.end() < new_end, "invariant");
1765 1765
1766 1766 size_t diff_bytes = aligned_expand_bytes - actual_expand_bytes;
1767 1767 // First uncommit the memory.
1768 1768 _g1_storage.shrink_by(diff_bytes);
1769 1769 // Then propagate this update to the necessary data structures.
1770 1770 update_committed_space(new_end, mr.end());
1771 1771 }
1772 1772 _free_list.add_as_tail(&expansion_list);
1773 1773
1774 1774 if (_hr_printer.is_active()) {
1775 1775 HeapWord* curr = mr.start();
1776 1776 while (curr < mr.end()) {
1777 1777 HeapWord* curr_end = curr + HeapRegion::GrainWords;
1778 1778 _hr_printer.commit(curr, curr_end);
1779 1779 curr = curr_end;
1780 1780 }
1781 1781 assert(curr == mr.end(), "post-condition");
1782 1782 }
1783 1783 g1_policy()->record_new_heap_size(n_regions());
1784 1784 } else {
1785 1785 ergo_verbose0(ErgoHeapSizing,
1786 1786 "did not expand the heap",
1787 1787 ergo_format_reason("heap expansion operation failed"));
1788 1788 // The expansion of the virtual storage space was unsuccessful.
1789 1789 // Let's see if it was because we ran out of swap.
1790 1790 if (G1ExitOnExpansionFailure &&
1791 1791 _g1_storage.uncommitted_size() >= aligned_expand_bytes) {
1792 1792 // We had head room...
1793 1793 vm_exit_out_of_memory(aligned_expand_bytes, "G1 heap expansion");
1794 1794 }
1795 1795 }
1796 1796 return successful;
1797 1797 }
1798 1798
1799 1799 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
1800 1800 size_t old_mem_size = _g1_storage.committed_size();
1801 1801 size_t aligned_shrink_bytes =
1802 1802 ReservedSpace::page_align_size_down(shrink_bytes);
1803 1803 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
1804 1804 HeapRegion::GrainBytes);
1805 1805 uint num_regions_deleted = 0;
1806 1806 MemRegion mr = _hrs.shrink_by(aligned_shrink_bytes, &num_regions_deleted);
1807 1807 HeapWord* old_end = (HeapWord*) _g1_storage.high();
1808 1808 assert(mr.end() == old_end, "post-condition");
1809 1809
1810 1810 ergo_verbose3(ErgoHeapSizing,
1811 1811 "shrink the heap",
1812 1812 ergo_format_byte("requested shrinking amount")
1813 1813 ergo_format_byte("aligned shrinking amount")
1814 1814 ergo_format_byte("attempted shrinking amount"),
1815 1815 shrink_bytes, aligned_shrink_bytes, mr.byte_size());
1816 1816 if (mr.byte_size() > 0) {
1817 1817 if (_hr_printer.is_active()) {
1818 1818 HeapWord* curr = mr.end();
1819 1819 while (curr > mr.start()) {
1820 1820 HeapWord* curr_end = curr;
1821 1821 curr -= HeapRegion::GrainWords;
1822 1822 _hr_printer.uncommit(curr, curr_end);
1823 1823 }
1824 1824 assert(curr == mr.start(), "post-condition");
1825 1825 }
1826 1826
1827 1827 _g1_storage.shrink_by(mr.byte_size());
1828 1828 HeapWord* new_end = (HeapWord*) _g1_storage.high();
1829 1829 assert(mr.start() == new_end, "post-condition");
1830 1830
1831 1831 _expansion_regions += num_regions_deleted;
1832 1832 update_committed_space(old_end, new_end);
1833 1833 HeapRegionRemSet::shrink_heap(n_regions());
1834 1834 g1_policy()->record_new_heap_size(n_regions());
1835 1835 } else {
1836 1836 ergo_verbose0(ErgoHeapSizing,
1837 1837 "did not shrink the heap",
1838 1838 ergo_format_reason("heap shrinking operation failed"));
1839 1839 }
1840 1840 }
1841 1841
1842 1842 void G1CollectedHeap::shrink(size_t shrink_bytes) {
1843 1843 verify_region_sets_optional();
1844 1844
1845 1845 // We should only reach here at the end of a Full GC which means we
1846 1846 // should not not be holding to any GC alloc regions. The method
1847 1847 // below will make sure of that and do any remaining clean up.
1848 1848 abandon_gc_alloc_regions();
1849 1849
1850 1850 // Instead of tearing down / rebuilding the free lists here, we
1851 1851 // could instead use the remove_all_pending() method on free_list to
1852 1852 // remove only the ones that we need to remove.
1853 1853 tear_down_region_sets(true /* free_list_only */);
1854 1854 shrink_helper(shrink_bytes);
1855 1855 rebuild_region_sets(true /* free_list_only */);
1856 1856
1857 1857 _hrs.verify_optional();
1858 1858 verify_region_sets_optional();
1859 1859 }
1860 1860
1861 1861 // Public methods.
1862 1862
1863 1863 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
1864 1864 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
1865 1865 #endif // _MSC_VER
1866 1866
1867 1867
1868 1868 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
1869 1869 SharedHeap(policy_),
1870 1870 _g1_policy(policy_),
1871 1871 _dirty_card_queue_set(false),
1872 1872 _into_cset_dirty_card_queue_set(false),
1873 1873 _is_alive_closure_cm(this),
1874 1874 _is_alive_closure_stw(this),
1875 1875 _ref_processor_cm(NULL),
1876 1876 _ref_processor_stw(NULL),
1877 1877 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
1878 1878 _bot_shared(NULL),
1879 1879 _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
1880 1880 _evac_failure_scan_stack(NULL) ,
1881 1881 _mark_in_progress(false),
1882 1882 _cg1r(NULL), _summary_bytes_used(0),
1883 1883 _g1mm(NULL),
1884 1884 _refine_cte_cl(NULL),
1885 1885 _full_collection(false),
1886 1886 _free_list("Master Free List"),
1887 1887 _secondary_free_list("Secondary Free List"),
1888 1888 _old_set("Old Set"),
1889 1889 _humongous_set("Master Humongous Set"),
1890 1890 _free_regions_coming(false),
1891 1891 _young_list(new YoungList(this)),
1892 1892 _gc_time_stamp(0),
1893 1893 _retained_old_gc_alloc_region(NULL),
1894 1894 _expand_heap_after_alloc_failure(true),
1895 1895 _surviving_young_words(NULL),
1896 1896 _old_marking_cycles_started(0),
1897 1897 _old_marking_cycles_completed(0),
1898 1898 _in_cset_fast_test(NULL),
1899 1899 _in_cset_fast_test_base(NULL),
1900 1900 _dirty_cards_region_list(NULL),
1901 1901 _worker_cset_start_region(NULL),
1902 1902 _worker_cset_start_region_time_stamp(NULL) {
1903 1903 _g1h = this; // To catch bugs.
1904 1904 if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
1905 1905 vm_exit_during_initialization("Failed necessary allocation.");
1906 1906 }
1907 1907
1908 1908 _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
1909 1909
1910 1910 int n_queues = MAX2((int)ParallelGCThreads, 1);
1911 1911 _task_queues = new RefToScanQueueSet(n_queues);
1912 1912
1913 1913 int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
1914 1914 assert(n_rem_sets > 0, "Invariant.");
1915 1915
1916 1916 HeapRegionRemSetIterator** iter_arr =
1917 1917 NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues, mtGC);
1918 1918 for (int i = 0; i < n_queues; i++) {
1919 1919 iter_arr[i] = new HeapRegionRemSetIterator();
1920 1920 }
1921 1921 _rem_set_iterator = iter_arr;
1922 1922
1923 1923 _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC);
1924 1924 _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC);
1925 1925
1926 1926 for (int i = 0; i < n_queues; i++) {
1927 1927 RefToScanQueue* q = new RefToScanQueue();
1928 1928 q->initialize();
1929 1929 _task_queues->register_queue(i, q);
1930 1930 }
1931 1931
1932 1932 clear_cset_start_regions();
1933 1933
1934 1934 guarantee(_task_queues != NULL, "task_queues allocation failure.");
1935 1935 }
1936 1936
1937 1937 jint G1CollectedHeap::initialize() {
1938 1938 CollectedHeap::pre_initialize();
1939 1939 os::enable_vtime();
1940 1940
1941 1941 G1Log::init();
1942 1942
1943 1943 // Necessary to satisfy locking discipline assertions.
1944 1944
1945 1945 MutexLocker x(Heap_lock);
1946 1946
1947 1947 // We have to initialize the printer before committing the heap, as
1948 1948 // it will be used then.
1949 1949 _hr_printer.set_active(G1PrintHeapRegions);
1950 1950
1951 1951 // While there are no constraints in the GC code that HeapWordSize
1952 1952 // be any particular value, there are multiple other areas in the
1953 1953 // system which believe this to be true (e.g. oop->object_size in some
1954 1954 // cases incorrectly returns the size in wordSize units rather than
1955 1955 // HeapWordSize).
1956 1956 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
1957 1957
1958 1958 size_t init_byte_size = collector_policy()->initial_heap_byte_size();
1959 1959 size_t max_byte_size = collector_policy()->max_heap_byte_size();
1960 1960
1961 1961 // Ensure that the sizes are properly aligned.
1962 1962 Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
1963 1963 Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
1964 1964
1965 1965 _cg1r = new ConcurrentG1Refine();
1966 1966
1967 1967 // Reserve the maximum.
1968 1968 PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
1969 1969 // Includes the perm-gen.
1970 1970
1971 1971 // When compressed oops are enabled, the preferred heap base
1972 1972 // is calculated by subtracting the requested size from the
1973 1973 // 32Gb boundary and using the result as the base address for
1974 1974 // heap reservation. If the requested size is not aligned to
1975 1975 // HeapRegion::GrainBytes (i.e. the alignment that is passed
1976 1976 // into the ReservedHeapSpace constructor) then the actual
1977 1977 // base of the reserved heap may end up differing from the
1978 1978 // address that was requested (i.e. the preferred heap base).
1979 1979 // If this happens then we could end up using a non-optimal
1980 1980 // compressed oops mode.
1981 1981
1982 1982 // Since max_byte_size is aligned to the size of a heap region (checked
1983 1983 // above), we also need to align the perm gen size as it might not be.
1984 1984 const size_t total_reserved = max_byte_size +
1985 1985 align_size_up(pgs->max_size(), HeapRegion::GrainBytes);
1986 1986 Universe::check_alignment(total_reserved, HeapRegion::GrainBytes, "g1 heap and perm");
1987 1987
1988 1988 char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
1989 1989
1990 1990 ReservedHeapSpace heap_rs(total_reserved, HeapRegion::GrainBytes,
1991 1991 UseLargePages, addr);
1992 1992
1993 1993 if (UseCompressedOops) {
1994 1994 if (addr != NULL && !heap_rs.is_reserved()) {
1995 1995 // Failed to reserve at specified address - the requested memory
1996 1996 // region is taken already, for example, by 'java' launcher.
1997 1997 // Try again to reserver heap higher.
1998 1998 addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
1999 1999
2000 2000 ReservedHeapSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
2001 2001 UseLargePages, addr);
2002 2002
2003 2003 if (addr != NULL && !heap_rs0.is_reserved()) {
2004 2004 // Failed to reserve at specified address again - give up.
2005 2005 addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
2006 2006 assert(addr == NULL, "");
2007 2007
2008 2008 ReservedHeapSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
2009 2009 UseLargePages, addr);
2010 2010 heap_rs = heap_rs1;
2011 2011 } else {
2012 2012 heap_rs = heap_rs0;
2013 2013 }
2014 2014 }
2015 2015 }
2016 2016
2017 2017 if (!heap_rs.is_reserved()) {
2018 2018 vm_exit_during_initialization("Could not reserve enough space for object heap");
2019 2019 return JNI_ENOMEM;
2020 2020 }
2021 2021
2022 2022 // It is important to do this in a way such that concurrent readers can't
2023 2023 // temporarily think somethings in the heap. (I've actually seen this
2024 2024 // happen in asserts: DLD.)
2025 2025 _reserved.set_word_size(0);
2026 2026 _reserved.set_start((HeapWord*)heap_rs.base());
2027 2027 _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
2028 2028
2029 2029 _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes);
2030 2030
2031 2031 // Create the gen rem set (and barrier set) for the entire reserved region.
2032 2032 _rem_set = collector_policy()->create_rem_set(_reserved, 2);
2033 2033 set_barrier_set(rem_set()->bs());
2034 2034 if (barrier_set()->is_a(BarrierSet::ModRef)) {
2035 2035 _mr_bs = (ModRefBarrierSet*)_barrier_set;
2036 2036 } else {
2037 2037 vm_exit_during_initialization("G1 requires a mod ref bs.");
2038 2038 return JNI_ENOMEM;
2039 2039 }
2040 2040
2041 2041 // Also create a G1 rem set.
2042 2042 if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
2043 2043 _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
2044 2044 } else {
2045 2045 vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
2046 2046 return JNI_ENOMEM;
2047 2047 }
2048 2048
2049 2049 // Carve out the G1 part of the heap.
2050 2050
2051 2051 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size);
2052 2052 _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
2053 2053 g1_rs.size()/HeapWordSize);
2054 2054 ReservedSpace perm_gen_rs = heap_rs.last_part(max_byte_size);
2055 2055
2056 2056 _perm_gen = pgs->init(perm_gen_rs, pgs->init_size(), rem_set());
2057 2057
2058 2058 _g1_storage.initialize(g1_rs, 0);
2059 2059 _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
2060 2060 _hrs.initialize((HeapWord*) _g1_reserved.start(),
2061 2061 (HeapWord*) _g1_reserved.end(),
2062 2062 _expansion_regions);
2063 2063
2064 2064 // 6843694 - ensure that the maximum region index can fit
2065 2065 // in the remembered set structures.
2066 2066 const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
2067 2067 guarantee((max_regions() - 1) <= max_region_idx, "too many regions");
2068 2068
2069 2069 size_t max_cards_per_region = ((size_t)1 << (sizeof(CardIdx_t)*BitsPerByte-1)) - 1;
2070 2070 guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized");
2071 2071 guarantee(HeapRegion::CardsPerRegion < max_cards_per_region,
2072 2072 "too many cards per region");
2073 2073
2074 2074 HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
2075 2075
2076 2076 _bot_shared = new G1BlockOffsetSharedArray(_reserved,
2077 2077 heap_word_size(init_byte_size));
2078 2078
2079 2079 _g1h = this;
2080 2080
2081 2081 _in_cset_fast_test_length = max_regions();
2082 2082 _in_cset_fast_test_base =
2083 2083 NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC);
2084 2084
2085 2085 // We're biasing _in_cset_fast_test to avoid subtracting the
2086 2086 // beginning of the heap every time we want to index; basically
2087 2087 // it's the same with what we do with the card table.
2088 2088 _in_cset_fast_test = _in_cset_fast_test_base -
2089 2089 ((uintx) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes);
2090 2090
2091 2091 // Clear the _cset_fast_test bitmap in anticipation of adding
2092 2092 // regions to the incremental collection set for the first
2093 2093 // evacuation pause.
2094 2094 clear_cset_fast_test();
2095 2095
2096 2096 // Create the ConcurrentMark data structure and thread.
2097 2097 // (Must do this late, so that "max_regions" is defined.)
2098 2098 _cm = new ConcurrentMark(heap_rs, max_regions());
2099 2099 _cmThread = _cm->cmThread();
2100 2100
2101 2101 // Initialize the from_card cache structure of HeapRegionRemSet.
2102 2102 HeapRegionRemSet::init_heap(max_regions());
2103 2103
2104 2104 // Now expand into the initial heap size.
2105 2105 if (!expand(init_byte_size)) {
2106 2106 vm_exit_during_initialization("Failed to allocate initial heap.");
2107 2107 return JNI_ENOMEM;
2108 2108 }
2109 2109
2110 2110 // Perform any initialization actions delegated to the policy.
2111 2111 g1_policy()->init();
2112 2112
2113 2113 _refine_cte_cl =
2114 2114 new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
2115 2115 g1_rem_set(),
2116 2116 concurrent_g1_refine());
2117 2117 JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
2118 2118
2119 2119 JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
2120 2120 SATB_Q_FL_lock,
2121 2121 G1SATBProcessCompletedThreshold,
2122 2122 Shared_SATB_Q_lock);
2123 2123
2124 2124 JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
2125 2125 DirtyCardQ_FL_lock,
2126 2126 concurrent_g1_refine()->yellow_zone(),
2127 2127 concurrent_g1_refine()->red_zone(),
2128 2128 Shared_DirtyCardQ_lock);
2129 2129
2130 2130 if (G1DeferredRSUpdate) {
2131 2131 dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
2132 2132 DirtyCardQ_FL_lock,
2133 2133 -1, // never trigger processing
2134 2134 -1, // no limit on length
2135 2135 Shared_DirtyCardQ_lock,
2136 2136 &JavaThread::dirty_card_queue_set());
2137 2137 }
2138 2138
2139 2139 // Initialize the card queue set used to hold cards containing
2140 2140 // references into the collection set.
2141 2141 _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
2142 2142 DirtyCardQ_FL_lock,
2143 2143 -1, // never trigger processing
2144 2144 -1, // no limit on length
2145 2145 Shared_DirtyCardQ_lock,
2146 2146 &JavaThread::dirty_card_queue_set());
2147 2147
2148 2148 // In case we're keeping closure specialization stats, initialize those
2149 2149 // counts and that mechanism.
2150 2150 SpecializationStats::clear();
2151 2151
2152 2152 // Do later initialization work for concurrent refinement.
2153 2153 _cg1r->init();
2154 2154
2155 2155 // Here we allocate the dummy full region that is required by the
2156 2156 // G1AllocRegion class. If we don't pass an address in the reserved
2157 2157 // space here, lots of asserts fire.
2158 2158
2159 2159 HeapRegion* dummy_region = new_heap_region(0 /* index of bottom region */,
2160 2160 _g1_reserved.start());
2161 2161 // We'll re-use the same region whether the alloc region will
2162 2162 // require BOT updates or not and, if it doesn't, then a non-young
2163 2163 // region will complain that it cannot support allocations without
2164 2164 // BOT updates. So we'll tag the dummy region as young to avoid that.
2165 2165 dummy_region->set_young();
2166 2166 // Make sure it's full.
2167 2167 dummy_region->set_top(dummy_region->end());
2168 2168 G1AllocRegion::setup(this, dummy_region);
2169 2169
2170 2170 init_mutator_alloc_region();
2171 2171
2172 2172 // Do create of the monitoring and management support so that
2173 2173 // values in the heap have been properly initialized.
2174 2174 _g1mm = new G1MonitoringSupport(this);
2175 2175
2176 2176 return JNI_OK;
2177 2177 }
2178 2178
2179 2179 void G1CollectedHeap::ref_processing_init() {
2180 2180 // Reference processing in G1 currently works as follows:
2181 2181 //
2182 2182 // * There are two reference processor instances. One is
2183 2183 // used to record and process discovered references
2184 2184 // during concurrent marking; the other is used to
2185 2185 // record and process references during STW pauses
2186 2186 // (both full and incremental).
2187 2187 // * Both ref processors need to 'span' the entire heap as
2188 2188 // the regions in the collection set may be dotted around.
2189 2189 //
2190 2190 // * For the concurrent marking ref processor:
2191 2191 // * Reference discovery is enabled at initial marking.
2192 2192 // * Reference discovery is disabled and the discovered
2193 2193 // references processed etc during remarking.
2194 2194 // * Reference discovery is MT (see below).
2195 2195 // * Reference discovery requires a barrier (see below).
2196 2196 // * Reference processing may or may not be MT
2197 2197 // (depending on the value of ParallelRefProcEnabled
2198 2198 // and ParallelGCThreads).
2199 2199 // * A full GC disables reference discovery by the CM
2200 2200 // ref processor and abandons any entries on it's
2201 2201 // discovered lists.
2202 2202 //
2203 2203 // * For the STW processor:
2204 2204 // * Non MT discovery is enabled at the start of a full GC.
2205 2205 // * Processing and enqueueing during a full GC is non-MT.
2206 2206 // * During a full GC, references are processed after marking.
2207 2207 //
2208 2208 // * Discovery (may or may not be MT) is enabled at the start
2209 2209 // of an incremental evacuation pause.
2210 2210 // * References are processed near the end of a STW evacuation pause.
2211 2211 // * For both types of GC:
2212 2212 // * Discovery is atomic - i.e. not concurrent.
2213 2213 // * Reference discovery will not need a barrier.
2214 2214
2215 2215 SharedHeap::ref_processing_init();
2216 2216 MemRegion mr = reserved_region();
2217 2217
2218 2218 // Concurrent Mark ref processor
2219 2219 _ref_processor_cm =
2220 2220 new ReferenceProcessor(mr, // span
2221 2221 ParallelRefProcEnabled && (ParallelGCThreads > 1),
2222 2222 // mt processing
2223 2223 (int) ParallelGCThreads,
2224 2224 // degree of mt processing
2225 2225 (ParallelGCThreads > 1) || (ConcGCThreads > 1),
2226 2226 // mt discovery
2227 2227 (int) MAX2(ParallelGCThreads, ConcGCThreads),
2228 2228 // degree of mt discovery
2229 2229 false,
2230 2230 // Reference discovery is not atomic
2231 2231 &_is_alive_closure_cm,
2232 2232 // is alive closure
2233 2233 // (for efficiency/performance)
2234 2234 true);
2235 2235 // Setting next fields of discovered
2236 2236 // lists requires a barrier.
2237 2237
2238 2238 // STW ref processor
2239 2239 _ref_processor_stw =
2240 2240 new ReferenceProcessor(mr, // span
2241 2241 ParallelRefProcEnabled && (ParallelGCThreads > 1),
2242 2242 // mt processing
2243 2243 MAX2((int)ParallelGCThreads, 1),
2244 2244 // degree of mt processing
2245 2245 (ParallelGCThreads > 1),
2246 2246 // mt discovery
2247 2247 MAX2((int)ParallelGCThreads, 1),
2248 2248 // degree of mt discovery
2249 2249 true,
2250 2250 // Reference discovery is atomic
2251 2251 &_is_alive_closure_stw,
2252 2252 // is alive closure
2253 2253 // (for efficiency/performance)
2254 2254 false);
2255 2255 // Setting next fields of discovered
2256 2256 // lists requires a barrier.
2257 2257 }
2258 2258
2259 2259 size_t G1CollectedHeap::capacity() const {
2260 2260 return _g1_committed.byte_size();
2261 2261 }
2262 2262
2263 2263 void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) {
2264 2264 assert(!hr->continuesHumongous(), "pre-condition");
2265 2265 hr->reset_gc_time_stamp();
2266 2266 if (hr->startsHumongous()) {
2267 2267 uint first_index = hr->hrs_index() + 1;
2268 2268 uint last_index = hr->last_hc_index();
2269 2269 for (uint i = first_index; i < last_index; i += 1) {
2270 2270 HeapRegion* chr = region_at(i);
2271 2271 assert(chr->continuesHumongous(), "sanity");
2272 2272 chr->reset_gc_time_stamp();
2273 2273 }
2274 2274 }
2275 2275 }
2276 2276
2277 2277 #ifndef PRODUCT
2278 2278 class CheckGCTimeStampsHRClosure : public HeapRegionClosure {
2279 2279 private:
2280 2280 unsigned _gc_time_stamp;
2281 2281 bool _failures;
2282 2282
2283 2283 public:
2284 2284 CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) :
2285 2285 _gc_time_stamp(gc_time_stamp), _failures(false) { }
2286 2286
2287 2287 virtual bool doHeapRegion(HeapRegion* hr) {
2288 2288 unsigned region_gc_time_stamp = hr->get_gc_time_stamp();
2289 2289 if (_gc_time_stamp != region_gc_time_stamp) {
2290 2290 gclog_or_tty->print_cr("Region "HR_FORMAT" has GC time stamp = %d, "
2291 2291 "expected %d", HR_FORMAT_PARAMS(hr),
2292 2292 region_gc_time_stamp, _gc_time_stamp);
2293 2293 _failures = true;
2294 2294 }
2295 2295 return false;
2296 2296 }
2297 2297
2298 2298 bool failures() { return _failures; }
2299 2299 };
2300 2300
2301 2301 void G1CollectedHeap::check_gc_time_stamps() {
2302 2302 CheckGCTimeStampsHRClosure cl(_gc_time_stamp);
2303 2303 heap_region_iterate(&cl);
2304 2304 guarantee(!cl.failures(), "all GC time stamps should have been reset");
2305 2305 }
2306 2306 #endif // PRODUCT
2307 2307
2308 2308 void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
2309 2309 DirtyCardQueue* into_cset_dcq,
2310 2310 bool concurrent,
2311 2311 int worker_i) {
2312 2312 // Clean cards in the hot card cache
2313 2313 concurrent_g1_refine()->clean_up_cache(worker_i, g1_rem_set(), into_cset_dcq);
2314 2314
2315 2315 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
2316 2316 int n_completed_buffers = 0;
2317 2317 while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) {
2318 2318 n_completed_buffers++;
2319 2319 }
2320 2320 g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i,
2321 2321 (double) n_completed_buffers);
2322 2322 dcqs.clear_n_completed_buffers();
2323 2323 assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
2324 2324 }
2325 2325
2326 2326
2327 2327 // Computes the sum of the storage used by the various regions.
2328 2328
2329 2329 size_t G1CollectedHeap::used() const {
2330 2330 assert(Heap_lock->owner() != NULL,
2331 2331 "Should be owned on this thread's behalf.");
2332 2332 size_t result = _summary_bytes_used;
2333 2333 // Read only once in case it is set to NULL concurrently
2334 2334 HeapRegion* hr = _mutator_alloc_region.get();
2335 2335 if (hr != NULL)
2336 2336 result += hr->used();
2337 2337 return result;
2338 2338 }
2339 2339
2340 2340 size_t G1CollectedHeap::used_unlocked() const {
2341 2341 size_t result = _summary_bytes_used;
2342 2342 return result;
2343 2343 }
2344 2344
2345 2345 class SumUsedClosure: public HeapRegionClosure {
2346 2346 size_t _used;
2347 2347 public:
2348 2348 SumUsedClosure() : _used(0) {}
2349 2349 bool doHeapRegion(HeapRegion* r) {
2350 2350 if (!r->continuesHumongous()) {
2351 2351 _used += r->used();
2352 2352 }
2353 2353 return false;
2354 2354 }
2355 2355 size_t result() { return _used; }
2356 2356 };
2357 2357
2358 2358 size_t G1CollectedHeap::recalculate_used() const {
2359 2359 SumUsedClosure blk;
2360 2360 heap_region_iterate(&blk);
2361 2361 return blk.result();
2362 2362 }
2363 2363
2364 2364 size_t G1CollectedHeap::unsafe_max_alloc() {
2365 2365 if (free_regions() > 0) return HeapRegion::GrainBytes;
2366 2366 // otherwise, is there space in the current allocation region?
2367 2367
2368 2368 // We need to store the current allocation region in a local variable
2369 2369 // here. The problem is that this method doesn't take any locks and
2370 2370 // there may be other threads which overwrite the current allocation
2371 2371 // region field. attempt_allocation(), for example, sets it to NULL
2372 2372 // and this can happen *after* the NULL check here but before the call
2373 2373 // to free(), resulting in a SIGSEGV. Note that this doesn't appear
2374 2374 // to be a problem in the optimized build, since the two loads of the
2375 2375 // current allocation region field are optimized away.
2376 2376 HeapRegion* hr = _mutator_alloc_region.get();
2377 2377 if (hr == NULL) {
2378 2378 return 0;
2379 2379 }
2380 2380 return hr->free();
2381 2381 }
2382 2382
2383 2383 bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
2384 2384 switch (cause) {
2385 2385 case GCCause::_gc_locker: return GCLockerInvokesConcurrent;
2386 2386 case GCCause::_java_lang_system_gc: return ExplicitGCInvokesConcurrent;
2387 2387 case GCCause::_g1_humongous_allocation: return true;
2388 2388 default: return false;
2389 2389 }
2390 2390 }
2391 2391
2392 2392 #ifndef PRODUCT
2393 2393 void G1CollectedHeap::allocate_dummy_regions() {
2394 2394 // Let's fill up most of the region
2395 2395 size_t word_size = HeapRegion::GrainWords - 1024;
2396 2396 // And as a result the region we'll allocate will be humongous.
2397 2397 guarantee(isHumongous(word_size), "sanity");
2398 2398
2399 2399 for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
2400 2400 // Let's use the existing mechanism for the allocation
2401 2401 HeapWord* dummy_obj = humongous_obj_allocate(word_size);
2402 2402 if (dummy_obj != NULL) {
2403 2403 MemRegion mr(dummy_obj, word_size);
2404 2404 CollectedHeap::fill_with_object(mr);
2405 2405 } else {
2406 2406 // If we can't allocate once, we probably cannot allocate
2407 2407 // again. Let's get out of the loop.
2408 2408 break;
2409 2409 }
2410 2410 }
2411 2411 }
2412 2412 #endif // !PRODUCT
2413 2413
2414 2414 void G1CollectedHeap::increment_old_marking_cycles_started() {
2415 2415 assert(_old_marking_cycles_started == _old_marking_cycles_completed ||
2416 2416 _old_marking_cycles_started == _old_marking_cycles_completed + 1,
2417 2417 err_msg("Wrong marking cycle count (started: %d, completed: %d)",
2418 2418 _old_marking_cycles_started, _old_marking_cycles_completed));
2419 2419
2420 2420 _old_marking_cycles_started++;
2421 2421 }
2422 2422
2423 2423 void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
2424 2424 MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
2425 2425
2426 2426 // We assume that if concurrent == true, then the caller is a
2427 2427 // concurrent thread that was joined the Suspendible Thread
2428 2428 // Set. If there's ever a cheap way to check this, we should add an
2429 2429 // assert here.
2430 2430
2431 2431 // Given that this method is called at the end of a Full GC or of a
2432 2432 // concurrent cycle, and those can be nested (i.e., a Full GC can
2433 2433 // interrupt a concurrent cycle), the number of full collections
2434 2434 // completed should be either one (in the case where there was no
2435 2435 // nesting) or two (when a Full GC interrupted a concurrent cycle)
2436 2436 // behind the number of full collections started.
2437 2437
2438 2438 // This is the case for the inner caller, i.e. a Full GC.
2439 2439 assert(concurrent ||
2440 2440 (_old_marking_cycles_started == _old_marking_cycles_completed + 1) ||
2441 2441 (_old_marking_cycles_started == _old_marking_cycles_completed + 2),
2442 2442 err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u "
2443 2443 "is inconsistent with _old_marking_cycles_completed = %u",
2444 2444 _old_marking_cycles_started, _old_marking_cycles_completed));
2445 2445
2446 2446 // This is the case for the outer caller, i.e. the concurrent cycle.
2447 2447 assert(!concurrent ||
2448 2448 (_old_marking_cycles_started == _old_marking_cycles_completed + 1),
2449 2449 err_msg("for outer caller (concurrent cycle): "
2450 2450 "_old_marking_cycles_started = %u "
2451 2451 "is inconsistent with _old_marking_cycles_completed = %u",
2452 2452 _old_marking_cycles_started, _old_marking_cycles_completed));
2453 2453
2454 2454 _old_marking_cycles_completed += 1;
2455 2455
2456 2456 // We need to clear the "in_progress" flag in the CM thread before
2457 2457 // we wake up any waiters (especially when ExplicitInvokesConcurrent
2458 2458 // is set) so that if a waiter requests another System.gc() it doesn't
2459 2459 // incorrectly see that a marking cyle is still in progress.
2460 2460 if (concurrent) {
2461 2461 _cmThread->clear_in_progress();
2462 2462 }
2463 2463
2464 2464 // This notify_all() will ensure that a thread that called
2465 2465 // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
2466 2466 // and it's waiting for a full GC to finish will be woken up. It is
2467 2467 // waiting in VM_G1IncCollectionPause::doit_epilogue().
2468 2468 FullGCCount_lock->notify_all();
2469 2469 }
2470 2470
2471 2471 void G1CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
2472 2472 assert_at_safepoint(true /* should_be_vm_thread */);
2473 2473 GCCauseSetter gcs(this, cause);
2474 2474 switch (cause) {
2475 2475 case GCCause::_heap_inspection:
2476 2476 case GCCause::_heap_dump: {
2477 2477 HandleMark hm;
2478 2478 do_full_collection(false); // don't clear all soft refs
2479 2479 break;
2480 2480 }
2481 2481 default: // XXX FIX ME
2482 2482 ShouldNotReachHere(); // Unexpected use of this function
2483 2483 }
2484 2484 }
2485 2485
2486 2486 void G1CollectedHeap::collect(GCCause::Cause cause) {
2487 2487 assert_heap_not_locked();
2488 2488
2489 2489 unsigned int gc_count_before;
2490 2490 unsigned int old_marking_count_before;
2491 2491 bool retry_gc;
2492 2492
2493 2493 do {
2494 2494 retry_gc = false;
2495 2495
2496 2496 {
2497 2497 MutexLocker ml(Heap_lock);
2498 2498
2499 2499 // Read the GC count while holding the Heap_lock
2500 2500 gc_count_before = total_collections();
2501 2501 old_marking_count_before = _old_marking_cycles_started;
2502 2502 }
2503 2503
2504 2504 if (should_do_concurrent_full_gc(cause)) {
2505 2505 // Schedule an initial-mark evacuation pause that will start a
2506 2506 // concurrent cycle. We're setting word_size to 0 which means that
2507 2507 // we are not requesting a post-GC allocation.
2508 2508 VM_G1IncCollectionPause op(gc_count_before,
2509 2509 0, /* word_size */
2510 2510 true, /* should_initiate_conc_mark */
2511 2511 g1_policy()->max_pause_time_ms(),
2512 2512 cause);
2513 2513
2514 2514 VMThread::execute(&op);
2515 2515 if (!op.pause_succeeded()) {
2516 2516 if (old_marking_count_before == _old_marking_cycles_started) {
2517 2517 retry_gc = op.should_retry_gc();
2518 2518 } else {
2519 2519 // A Full GC happened while we were trying to schedule the
2520 2520 // initial-mark GC. No point in starting a new cycle given
2521 2521 // that the whole heap was collected anyway.
2522 2522 }
2523 2523
2524 2524 if (retry_gc) {
2525 2525 if (GC_locker::is_active_and_needs_gc()) {
2526 2526 GC_locker::stall_until_clear();
2527 2527 }
2528 2528 }
2529 2529 }
2530 2530 } else {
2531 2531 if (cause == GCCause::_gc_locker
2532 2532 DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
2533 2533
2534 2534 // Schedule a standard evacuation pause. We're setting word_size
2535 2535 // to 0 which means that we are not requesting a post-GC allocation.
2536 2536 VM_G1IncCollectionPause op(gc_count_before,
2537 2537 0, /* word_size */
2538 2538 false, /* should_initiate_conc_mark */
2539 2539 g1_policy()->max_pause_time_ms(),
2540 2540 cause);
2541 2541 VMThread::execute(&op);
2542 2542 } else {
2543 2543 // Schedule a Full GC.
2544 2544 VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause);
2545 2545 VMThread::execute(&op);
2546 2546 }
2547 2547 }
2548 2548 } while (retry_gc);
2549 2549 }
2550 2550
2551 2551 bool G1CollectedHeap::is_in(const void* p) const {
2552 2552 if (_g1_committed.contains(p)) {
2553 2553 // Given that we know that p is in the committed space,
2554 2554 // heap_region_containing_raw() should successfully
2555 2555 // return the containing region.
2556 2556 HeapRegion* hr = heap_region_containing_raw(p);
2557 2557 return hr->is_in(p);
2558 2558 } else {
2559 2559 return _perm_gen->as_gen()->is_in(p);
2560 2560 }
2561 2561 }
2562 2562
2563 2563 // Iteration functions.
2564 2564
2565 2565 // Iterates an OopClosure over all ref-containing fields of objects
2566 2566 // within a HeapRegion.
2567 2567
2568 2568 class IterateOopClosureRegionClosure: public HeapRegionClosure {
2569 2569 MemRegion _mr;
2570 2570 OopClosure* _cl;
2571 2571 public:
2572 2572 IterateOopClosureRegionClosure(MemRegion mr, OopClosure* cl)
2573 2573 : _mr(mr), _cl(cl) {}
2574 2574 bool doHeapRegion(HeapRegion* r) {
2575 2575 if (!r->continuesHumongous()) {
2576 2576 r->oop_iterate(_cl);
2577 2577 }
2578 2578 return false;
2579 2579 }
2580 2580 };
2581 2581
2582 2582 void G1CollectedHeap::oop_iterate(OopClosure* cl, bool do_perm) {
2583 2583 IterateOopClosureRegionClosure blk(_g1_committed, cl);
2584 2584 heap_region_iterate(&blk);
2585 2585 if (do_perm) {
2586 2586 perm_gen()->oop_iterate(cl);
2587 2587 }
2588 2588 }
2589 2589
2590 2590 void G1CollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm) {
2591 2591 IterateOopClosureRegionClosure blk(mr, cl);
2592 2592 heap_region_iterate(&blk);
2593 2593 if (do_perm) {
2594 2594 perm_gen()->oop_iterate(cl);
2595 2595 }
2596 2596 }
2597 2597
2598 2598 // Iterates an ObjectClosure over all objects within a HeapRegion.
2599 2599
2600 2600 class IterateObjectClosureRegionClosure: public HeapRegionClosure {
2601 2601 ObjectClosure* _cl;
2602 2602 public:
2603 2603 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
2604 2604 bool doHeapRegion(HeapRegion* r) {
2605 2605 if (! r->continuesHumongous()) {
2606 2606 r->object_iterate(_cl);
2607 2607 }
2608 2608 return false;
2609 2609 }
2610 2610 };
2611 2611
2612 2612 void G1CollectedHeap::object_iterate(ObjectClosure* cl, bool do_perm) {
2613 2613 IterateObjectClosureRegionClosure blk(cl);
2614 2614 heap_region_iterate(&blk);
2615 2615 if (do_perm) {
2616 2616 perm_gen()->object_iterate(cl);
2617 2617 }
2618 2618 }
2619 2619
2620 2620 void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
2621 2621 // FIXME: is this right?
2622 2622 guarantee(false, "object_iterate_since_last_GC not supported by G1 heap");
2623 2623 }
2624 2624
2625 2625 // Calls a SpaceClosure on a HeapRegion.
2626 2626
2627 2627 class SpaceClosureRegionClosure: public HeapRegionClosure {
2628 2628 SpaceClosure* _cl;
2629 2629 public:
2630 2630 SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
2631 2631 bool doHeapRegion(HeapRegion* r) {
2632 2632 _cl->do_space(r);
2633 2633 return false;
2634 2634 }
2635 2635 };
2636 2636
2637 2637 void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
2638 2638 SpaceClosureRegionClosure blk(cl);
2639 2639 heap_region_iterate(&blk);
2640 2640 }
2641 2641
2642 2642 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
2643 2643 _hrs.iterate(cl);
2644 2644 }
2645 2645
2646 2646 void
2647 2647 G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
2648 2648 uint worker_id,
2649 2649 uint no_of_par_workers,
2650 2650 jint claim_value) {
2651 2651 const uint regions = n_regions();
2652 2652 const uint max_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
2653 2653 no_of_par_workers :
2654 2654 1);
2655 2655 assert(UseDynamicNumberOfGCThreads ||
2656 2656 no_of_par_workers == workers()->total_workers(),
2657 2657 "Non dynamic should use fixed number of workers");
2658 2658 // try to spread out the starting points of the workers
2659 2659 const HeapRegion* start_hr =
2660 2660 start_region_for_worker(worker_id, no_of_par_workers);
2661 2661 const uint start_index = start_hr->hrs_index();
2662 2662
2663 2663 // each worker will actually look at all regions
2664 2664 for (uint count = 0; count < regions; ++count) {
2665 2665 const uint index = (start_index + count) % regions;
2666 2666 assert(0 <= index && index < regions, "sanity");
2667 2667 HeapRegion* r = region_at(index);
2668 2668 // we'll ignore "continues humongous" regions (we'll process them
2669 2669 // when we come across their corresponding "start humongous"
2670 2670 // region) and regions already claimed
2671 2671 if (r->claim_value() == claim_value || r->continuesHumongous()) {
2672 2672 continue;
2673 2673 }
2674 2674 // OK, try to claim it
2675 2675 if (r->claimHeapRegion(claim_value)) {
2676 2676 // success!
2677 2677 assert(!r->continuesHumongous(), "sanity");
2678 2678 if (r->startsHumongous()) {
2679 2679 // If the region is "starts humongous" we'll iterate over its
2680 2680 // "continues humongous" first; in fact we'll do them
2681 2681 // first. The order is important. In on case, calling the
2682 2682 // closure on the "starts humongous" region might de-allocate
2683 2683 // and clear all its "continues humongous" regions and, as a
2684 2684 // result, we might end up processing them twice. So, we'll do
2685 2685 // them first (notice: most closures will ignore them anyway) and
2686 2686 // then we'll do the "starts humongous" region.
2687 2687 for (uint ch_index = index + 1; ch_index < regions; ++ch_index) {
2688 2688 HeapRegion* chr = region_at(ch_index);
2689 2689
2690 2690 // if the region has already been claimed or it's not
2691 2691 // "continues humongous" we're done
2692 2692 if (chr->claim_value() == claim_value ||
2693 2693 !chr->continuesHumongous()) {
2694 2694 break;
2695 2695 }
2696 2696
2697 2697 // Noone should have claimed it directly. We can given
2698 2698 // that we claimed its "starts humongous" region.
2699 2699 assert(chr->claim_value() != claim_value, "sanity");
2700 2700 assert(chr->humongous_start_region() == r, "sanity");
2701 2701
2702 2702 if (chr->claimHeapRegion(claim_value)) {
2703 2703 // we should always be able to claim it; noone else should
2704 2704 // be trying to claim this region
2705 2705
2706 2706 bool res2 = cl->doHeapRegion(chr);
2707 2707 assert(!res2, "Should not abort");
2708 2708
2709 2709 // Right now, this holds (i.e., no closure that actually
2710 2710 // does something with "continues humongous" regions
2711 2711 // clears them). We might have to weaken it in the future,
2712 2712 // but let's leave these two asserts here for extra safety.
2713 2713 assert(chr->continuesHumongous(), "should still be the case");
2714 2714 assert(chr->humongous_start_region() == r, "sanity");
2715 2715 } else {
2716 2716 guarantee(false, "we should not reach here");
2717 2717 }
2718 2718 }
2719 2719 }
2720 2720
2721 2721 assert(!r->continuesHumongous(), "sanity");
2722 2722 bool res = cl->doHeapRegion(r);
2723 2723 assert(!res, "Should not abort");
2724 2724 }
2725 2725 }
2726 2726 }
2727 2727
2728 2728 class ResetClaimValuesClosure: public HeapRegionClosure {
2729 2729 public:
2730 2730 bool doHeapRegion(HeapRegion* r) {
2731 2731 r->set_claim_value(HeapRegion::InitialClaimValue);
2732 2732 return false;
2733 2733 }
2734 2734 };
2735 2735
2736 2736 void G1CollectedHeap::reset_heap_region_claim_values() {
2737 2737 ResetClaimValuesClosure blk;
2738 2738 heap_region_iterate(&blk);
2739 2739 }
2740 2740
2741 2741 void G1CollectedHeap::reset_cset_heap_region_claim_values() {
2742 2742 ResetClaimValuesClosure blk;
2743 2743 collection_set_iterate(&blk);
2744 2744 }
2745 2745
2746 2746 #ifdef ASSERT
2747 2747 // This checks whether all regions in the heap have the correct claim
2748 2748 // value. I also piggy-backed on this a check to ensure that the
2749 2749 // humongous_start_region() information on "continues humongous"
2750 2750 // regions is correct.
2751 2751
2752 2752 class CheckClaimValuesClosure : public HeapRegionClosure {
2753 2753 private:
2754 2754 jint _claim_value;
2755 2755 uint _failures;
2756 2756 HeapRegion* _sh_region;
2757 2757
2758 2758 public:
2759 2759 CheckClaimValuesClosure(jint claim_value) :
2760 2760 _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
2761 2761 bool doHeapRegion(HeapRegion* r) {
2762 2762 if (r->claim_value() != _claim_value) {
2763 2763 gclog_or_tty->print_cr("Region " HR_FORMAT ", "
2764 2764 "claim value = %d, should be %d",
2765 2765 HR_FORMAT_PARAMS(r),
2766 2766 r->claim_value(), _claim_value);
2767 2767 ++_failures;
2768 2768 }
2769 2769 if (!r->isHumongous()) {
2770 2770 _sh_region = NULL;
2771 2771 } else if (r->startsHumongous()) {
2772 2772 _sh_region = r;
2773 2773 } else if (r->continuesHumongous()) {
2774 2774 if (r->humongous_start_region() != _sh_region) {
2775 2775 gclog_or_tty->print_cr("Region " HR_FORMAT ", "
2776 2776 "HS = "PTR_FORMAT", should be "PTR_FORMAT,
2777 2777 HR_FORMAT_PARAMS(r),
2778 2778 r->humongous_start_region(),
2779 2779 _sh_region);
2780 2780 ++_failures;
2781 2781 }
2782 2782 }
2783 2783 return false;
2784 2784 }
2785 2785 uint failures() { return _failures; }
2786 2786 };
2787 2787
2788 2788 bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) {
2789 2789 CheckClaimValuesClosure cl(claim_value);
2790 2790 heap_region_iterate(&cl);
2791 2791 return cl.failures() == 0;
2792 2792 }
2793 2793
2794 2794 class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure {
2795 2795 private:
2796 2796 jint _claim_value;
2797 2797 uint _failures;
2798 2798
2799 2799 public:
2800 2800 CheckClaimValuesInCSetHRClosure(jint claim_value) :
2801 2801 _claim_value(claim_value), _failures(0) { }
2802 2802
2803 2803 uint failures() { return _failures; }
2804 2804
2805 2805 bool doHeapRegion(HeapRegion* hr) {
2806 2806 assert(hr->in_collection_set(), "how?");
2807 2807 assert(!hr->isHumongous(), "H-region in CSet");
2808 2808 if (hr->claim_value() != _claim_value) {
2809 2809 gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", "
2810 2810 "claim value = %d, should be %d",
2811 2811 HR_FORMAT_PARAMS(hr),
2812 2812 hr->claim_value(), _claim_value);
2813 2813 _failures += 1;
2814 2814 }
2815 2815 return false;
2816 2816 }
2817 2817 };
2818 2818
2819 2819 bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) {
2820 2820 CheckClaimValuesInCSetHRClosure cl(claim_value);
2821 2821 collection_set_iterate(&cl);
2822 2822 return cl.failures() == 0;
2823 2823 }
2824 2824 #endif // ASSERT
2825 2825
2826 2826 // Clear the cached CSet starting regions and (more importantly)
2827 2827 // the time stamps. Called when we reset the GC time stamp.
2828 2828 void G1CollectedHeap::clear_cset_start_regions() {
2829 2829 assert(_worker_cset_start_region != NULL, "sanity");
2830 2830 assert(_worker_cset_start_region_time_stamp != NULL, "sanity");
2831 2831
2832 2832 int n_queues = MAX2((int)ParallelGCThreads, 1);
2833 2833 for (int i = 0; i < n_queues; i++) {
2834 2834 _worker_cset_start_region[i] = NULL;
2835 2835 _worker_cset_start_region_time_stamp[i] = 0;
2836 2836 }
2837 2837 }
2838 2838
2839 2839 // Given the id of a worker, obtain or calculate a suitable
2840 2840 // starting region for iterating over the current collection set.
2841 2841 HeapRegion* G1CollectedHeap::start_cset_region_for_worker(int worker_i) {
2842 2842 assert(get_gc_time_stamp() > 0, "should have been updated by now");
2843 2843
2844 2844 HeapRegion* result = NULL;
2845 2845 unsigned gc_time_stamp = get_gc_time_stamp();
2846 2846
2847 2847 if (_worker_cset_start_region_time_stamp[worker_i] == gc_time_stamp) {
2848 2848 // Cached starting region for current worker was set
2849 2849 // during the current pause - so it's valid.
2850 2850 // Note: the cached starting heap region may be NULL
2851 2851 // (when the collection set is empty).
2852 2852 result = _worker_cset_start_region[worker_i];
2853 2853 assert(result == NULL || result->in_collection_set(), "sanity");
2854 2854 return result;
2855 2855 }
2856 2856
2857 2857 // The cached entry was not valid so let's calculate
2858 2858 // a suitable starting heap region for this worker.
2859 2859
2860 2860 // We want the parallel threads to start their collection
2861 2861 // set iteration at different collection set regions to
2862 2862 // avoid contention.
2863 2863 // If we have:
2864 2864 // n collection set regions
2865 2865 // p threads
2866 2866 // Then thread t will start at region floor ((t * n) / p)
2867 2867
2868 2868 result = g1_policy()->collection_set();
2869 2869 if (G1CollectedHeap::use_parallel_gc_threads()) {
2870 2870 uint cs_size = g1_policy()->cset_region_length();
2871 2871 uint active_workers = workers()->active_workers();
2872 2872 assert(UseDynamicNumberOfGCThreads ||
2873 2873 active_workers == workers()->total_workers(),
2874 2874 "Unless dynamic should use total workers");
2875 2875
2876 2876 uint end_ind = (cs_size * worker_i) / active_workers;
2877 2877 uint start_ind = 0;
2878 2878
2879 2879 if (worker_i > 0 &&
2880 2880 _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
2881 2881 // Previous workers starting region is valid
2882 2882 // so let's iterate from there
2883 2883 start_ind = (cs_size * (worker_i - 1)) / active_workers;
2884 2884 result = _worker_cset_start_region[worker_i - 1];
2885 2885 }
2886 2886
2887 2887 for (uint i = start_ind; i < end_ind; i++) {
2888 2888 result = result->next_in_collection_set();
2889 2889 }
2890 2890 }
2891 2891
2892 2892 // Note: the calculated starting heap region may be NULL
2893 2893 // (when the collection set is empty).
2894 2894 assert(result == NULL || result->in_collection_set(), "sanity");
2895 2895 assert(_worker_cset_start_region_time_stamp[worker_i] != gc_time_stamp,
2896 2896 "should be updated only once per pause");
2897 2897 _worker_cset_start_region[worker_i] = result;
2898 2898 OrderAccess::storestore();
2899 2899 _worker_cset_start_region_time_stamp[worker_i] = gc_time_stamp;
2900 2900 return result;
2901 2901 }
2902 2902
2903 2903 HeapRegion* G1CollectedHeap::start_region_for_worker(uint worker_i,
2904 2904 uint no_of_par_workers) {
2905 2905 uint worker_num =
2906 2906 G1CollectedHeap::use_parallel_gc_threads() ? no_of_par_workers : 1U;
2907 2907 assert(UseDynamicNumberOfGCThreads ||
2908 2908 no_of_par_workers == workers()->total_workers(),
2909 2909 "Non dynamic should use fixed number of workers");
2910 2910 const uint start_index = n_regions() * worker_i / worker_num;
2911 2911 return region_at(start_index);
2912 2912 }
2913 2913
2914 2914 void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
2915 2915 HeapRegion* r = g1_policy()->collection_set();
2916 2916 while (r != NULL) {
2917 2917 HeapRegion* next = r->next_in_collection_set();
2918 2918 if (cl->doHeapRegion(r)) {
2919 2919 cl->incomplete();
2920 2920 return;
2921 2921 }
2922 2922 r = next;
2923 2923 }
2924 2924 }
2925 2925
2926 2926 void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
2927 2927 HeapRegionClosure *cl) {
2928 2928 if (r == NULL) {
2929 2929 // The CSet is empty so there's nothing to do.
2930 2930 return;
2931 2931 }
2932 2932
2933 2933 assert(r->in_collection_set(),
2934 2934 "Start region must be a member of the collection set.");
2935 2935 HeapRegion* cur = r;
2936 2936 while (cur != NULL) {
2937 2937 HeapRegion* next = cur->next_in_collection_set();
2938 2938 if (cl->doHeapRegion(cur) && false) {
2939 2939 cl->incomplete();
2940 2940 return;
2941 2941 }
2942 2942 cur = next;
2943 2943 }
2944 2944 cur = g1_policy()->collection_set();
2945 2945 while (cur != r) {
2946 2946 HeapRegion* next = cur->next_in_collection_set();
2947 2947 if (cl->doHeapRegion(cur) && false) {
2948 2948 cl->incomplete();
2949 2949 return;
2950 2950 }
2951 2951 cur = next;
2952 2952 }
2953 2953 }
2954 2954
2955 2955 CompactibleSpace* G1CollectedHeap::first_compactible_space() {
2956 2956 return n_regions() > 0 ? region_at(0) : NULL;
2957 2957 }
2958 2958
2959 2959
2960 2960 Space* G1CollectedHeap::space_containing(const void* addr) const {
2961 2961 Space* res = heap_region_containing(addr);
2962 2962 if (res == NULL)
2963 2963 res = perm_gen()->space_containing(addr);
2964 2964 return res;
2965 2965 }
2966 2966
2967 2967 HeapWord* G1CollectedHeap::block_start(const void* addr) const {
2968 2968 Space* sp = space_containing(addr);
2969 2969 if (sp != NULL) {
2970 2970 return sp->block_start(addr);
2971 2971 }
2972 2972 return NULL;
2973 2973 }
2974 2974
2975 2975 size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
2976 2976 Space* sp = space_containing(addr);
2977 2977 assert(sp != NULL, "block_size of address outside of heap");
2978 2978 return sp->block_size(addr);
2979 2979 }
2980 2980
2981 2981 bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
2982 2982 Space* sp = space_containing(addr);
2983 2983 return sp->block_is_obj(addr);
2984 2984 }
2985 2985
2986 2986 bool G1CollectedHeap::supports_tlab_allocation() const {
2987 2987 return true;
2988 2988 }
2989 2989
2990 2990 size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
2991 2991 return HeapRegion::GrainBytes;
2992 2992 }
2993 2993
2994 2994 size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
2995 2995 // Return the remaining space in the cur alloc region, but not less than
2996 2996 // the min TLAB size.
2997 2997
2998 2998 // Also, this value can be at most the humongous object threshold,
2999 2999 // since we can't allow tlabs to grow big enough to accomodate
3000 3000 // humongous objects.
3001 3001
3002 3002 HeapRegion* hr = _mutator_alloc_region.get();
3003 3003 size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
3004 3004 if (hr == NULL) {
3005 3005 return max_tlab_size;
3006 3006 } else {
3007 3007 return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size);
3008 3008 }
3009 3009 }
3010 3010
3011 3011 size_t G1CollectedHeap::max_capacity() const {
3012 3012 return _g1_reserved.byte_size();
3013 3013 }
3014 3014
3015 3015 jlong G1CollectedHeap::millis_since_last_gc() {
3016 3016 // assert(false, "NYI");
3017 3017 return 0;
3018 3018 }
3019 3019
3020 3020 void G1CollectedHeap::prepare_for_verify() {
3021 3021 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
3022 3022 ensure_parsability(false);
3023 3023 }
3024 3024 g1_rem_set()->prepare_for_verify();
3025 3025 }
3026 3026
3027 3027 bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr,
3028 3028 VerifyOption vo) {
3029 3029 switch (vo) {
3030 3030 case VerifyOption_G1UsePrevMarking:
3031 3031 return hr->obj_allocated_since_prev_marking(obj);
3032 3032 case VerifyOption_G1UseNextMarking:
3033 3033 return hr->obj_allocated_since_next_marking(obj);
3034 3034 case VerifyOption_G1UseMarkWord:
3035 3035 return false;
3036 3036 default:
3037 3037 ShouldNotReachHere();
3038 3038 }
3039 3039 return false; // keep some compilers happy
3040 3040 }
3041 3041
3042 3042 HeapWord* G1CollectedHeap::top_at_mark_start(HeapRegion* hr, VerifyOption vo) {
3043 3043 switch (vo) {
3044 3044 case VerifyOption_G1UsePrevMarking: return hr->prev_top_at_mark_start();
3045 3045 case VerifyOption_G1UseNextMarking: return hr->next_top_at_mark_start();
3046 3046 case VerifyOption_G1UseMarkWord: return NULL;
3047 3047 default: ShouldNotReachHere();
3048 3048 }
3049 3049 return NULL; // keep some compilers happy
3050 3050 }
3051 3051
3052 3052 bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) {
3053 3053 switch (vo) {
3054 3054 case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj);
3055 3055 case VerifyOption_G1UseNextMarking: return isMarkedNext(obj);
3056 3056 case VerifyOption_G1UseMarkWord: return obj->is_gc_marked();
3057 3057 default: ShouldNotReachHere();
3058 3058 }
3059 3059 return false; // keep some compilers happy
3060 3060 }
3061 3061
3062 3062 const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) {
3063 3063 switch (vo) {
3064 3064 case VerifyOption_G1UsePrevMarking: return "PTAMS";
3065 3065 case VerifyOption_G1UseNextMarking: return "NTAMS";
3066 3066 case VerifyOption_G1UseMarkWord: return "NONE";
3067 3067 default: ShouldNotReachHere();
3068 3068 }
3069 3069 return NULL; // keep some compilers happy
3070 3070 }
3071 3071
3072 3072 class VerifyLivenessOopClosure: public OopClosure {
3073 3073 G1CollectedHeap* _g1h;
3074 3074 VerifyOption _vo;
3075 3075 public:
3076 3076 VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
3077 3077 _g1h(g1h), _vo(vo)
3078 3078 { }
3079 3079 void do_oop(narrowOop *p) { do_oop_work(p); }
3080 3080 void do_oop( oop *p) { do_oop_work(p); }
3081 3081
3082 3082 template <class T> void do_oop_work(T *p) {
3083 3083 oop obj = oopDesc::load_decode_heap_oop(p);
3084 3084 guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo),
3085 3085 "Dead object referenced by a not dead object");
3086 3086 }
3087 3087 };
3088 3088
3089 3089 class VerifyObjsInRegionClosure: public ObjectClosure {
3090 3090 private:
3091 3091 G1CollectedHeap* _g1h;
3092 3092 size_t _live_bytes;
3093 3093 HeapRegion *_hr;
3094 3094 VerifyOption _vo;
3095 3095 public:
3096 3096 // _vo == UsePrevMarking -> use "prev" marking information,
3097 3097 // _vo == UseNextMarking -> use "next" marking information,
3098 3098 // _vo == UseMarkWord -> use mark word from object header.
3099 3099 VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
3100 3100 : _live_bytes(0), _hr(hr), _vo(vo) {
3101 3101 _g1h = G1CollectedHeap::heap();
3102 3102 }
3103 3103 void do_object(oop o) {
3104 3104 VerifyLivenessOopClosure isLive(_g1h, _vo);
3105 3105 assert(o != NULL, "Huh?");
3106 3106 if (!_g1h->is_obj_dead_cond(o, _vo)) {
3107 3107 // If the object is alive according to the mark word,
3108 3108 // then verify that the marking information agrees.
3109 3109 // Note we can't verify the contra-positive of the
3110 3110 // above: if the object is dead (according to the mark
3111 3111 // word), it may not be marked, or may have been marked
3112 3112 // but has since became dead, or may have been allocated
3113 3113 // since the last marking.
3114 3114 if (_vo == VerifyOption_G1UseMarkWord) {
3115 3115 guarantee(!_g1h->is_obj_dead(o), "mark word and concurrent mark mismatch");
3116 3116 }
3117 3117
3118 3118 o->oop_iterate(&isLive);
3119 3119 if (!_hr->obj_allocated_since_prev_marking(o)) {
3120 3120 size_t obj_size = o->size(); // Make sure we don't overflow
3121 3121 _live_bytes += (obj_size * HeapWordSize);
3122 3122 }
3123 3123 }
3124 3124 }
3125 3125 size_t live_bytes() { return _live_bytes; }
3126 3126 };
3127 3127
3128 3128 class PrintObjsInRegionClosure : public ObjectClosure {
3129 3129 HeapRegion *_hr;
3130 3130 G1CollectedHeap *_g1;
3131 3131 public:
3132 3132 PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
3133 3133 _g1 = G1CollectedHeap::heap();
3134 3134 };
3135 3135
3136 3136 void do_object(oop o) {
3137 3137 if (o != NULL) {
3138 3138 HeapWord *start = (HeapWord *) o;
3139 3139 size_t word_sz = o->size();
3140 3140 gclog_or_tty->print("\nPrinting obj "PTR_FORMAT" of size " SIZE_FORMAT
3141 3141 " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
3142 3142 (void*) o, word_sz,
3143 3143 _g1->isMarkedPrev(o),
3144 3144 _g1->isMarkedNext(o),
3145 3145 _hr->obj_allocated_since_prev_marking(o));
3146 3146 HeapWord *end = start + word_sz;
3147 3147 HeapWord *cur;
3148 3148 int *val;
3149 3149 for (cur = start; cur < end; cur++) {
3150 3150 val = (int *) cur;
3151 3151 gclog_or_tty->print("\t "PTR_FORMAT":"PTR_FORMAT"\n", val, *val);
3152 3152 }
3153 3153 }
3154 3154 }
3155 3155 };
3156 3156
3157 3157 class VerifyRegionClosure: public HeapRegionClosure {
3158 3158 private:
3159 3159 bool _par;
3160 3160 VerifyOption _vo;
3161 3161 bool _failures;
3162 3162 public:
3163 3163 // _vo == UsePrevMarking -> use "prev" marking information,
3164 3164 // _vo == UseNextMarking -> use "next" marking information,
3165 3165 // _vo == UseMarkWord -> use mark word from object header.
3166 3166 VerifyRegionClosure(bool par, VerifyOption vo)
3167 3167 : _par(par),
3168 3168 _vo(vo),
3169 3169 _failures(false) {}
3170 3170
3171 3171 bool failures() {
3172 3172 return _failures;
3173 3173 }
3174 3174
3175 3175 bool doHeapRegion(HeapRegion* r) {
3176 3176 if (!r->continuesHumongous()) {
3177 3177 bool failures = false;
3178 3178 r->verify(_vo, &failures);
3179 3179 if (failures) {
3180 3180 _failures = true;
3181 3181 } else {
3182 3182 VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo);
3183 3183 r->object_iterate(¬_dead_yet_cl);
3184 3184 if (_vo != VerifyOption_G1UseNextMarking) {
3185 3185 if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) {
3186 3186 gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
3187 3187 "max_live_bytes "SIZE_FORMAT" "
3188 3188 "< calculated "SIZE_FORMAT,
3189 3189 r->bottom(), r->end(),
3190 3190 r->max_live_bytes(),
3191 3191 not_dead_yet_cl.live_bytes());
3192 3192 _failures = true;
3193 3193 }
3194 3194 } else {
3195 3195 // When vo == UseNextMarking we cannot currently do a sanity
3196 3196 // check on the live bytes as the calculation has not been
3197 3197 // finalized yet.
3198 3198 }
3199 3199 }
3200 3200 }
3201 3201 return false; // stop the region iteration if we hit a failure
3202 3202 }
3203 3203 };
3204 3204
3205 3205 class VerifyRootsClosure: public OopsInGenClosure {
3206 3206 private:
3207 3207 G1CollectedHeap* _g1h;
3208 3208 VerifyOption _vo;
3209 3209 bool _failures;
3210 3210 public:
3211 3211 // _vo == UsePrevMarking -> use "prev" marking information,
3212 3212 // _vo == UseNextMarking -> use "next" marking information,
3213 3213 // _vo == UseMarkWord -> use mark word from object header.
3214 3214 VerifyRootsClosure(VerifyOption vo) :
3215 3215 _g1h(G1CollectedHeap::heap()),
3216 3216 _vo(vo),
3217 3217 _failures(false) { }
3218 3218
3219 3219 bool failures() { return _failures; }
3220 3220
3221 3221 template <class T> void do_oop_nv(T* p) {
3222 3222 T heap_oop = oopDesc::load_heap_oop(p);
3223 3223 if (!oopDesc::is_null(heap_oop)) {
3224 3224 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
3225 3225 if (_g1h->is_obj_dead_cond(obj, _vo)) {
3226 3226 gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
3227 3227 "points to dead obj "PTR_FORMAT, p, (void*) obj);
3228 3228 if (_vo == VerifyOption_G1UseMarkWord) {
3229 3229 gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark()));
3230 3230 }
3231 3231 obj->print_on(gclog_or_tty);
3232 3232 _failures = true;
3233 3233 }
3234 3234 }
3235 3235 }
3236 3236
3237 3237 void do_oop(oop* p) { do_oop_nv(p); }
3238 3238 void do_oop(narrowOop* p) { do_oop_nv(p); }
3239 3239 };
3240 3240
3241 3241 // This is the task used for parallel heap verification.
3242 3242
3243 3243 class G1ParVerifyTask: public AbstractGangTask {
3244 3244 private:
3245 3245 G1CollectedHeap* _g1h;
3246 3246 VerifyOption _vo;
3247 3247 bool _failures;
3248 3248
3249 3249 public:
3250 3250 // _vo == UsePrevMarking -> use "prev" marking information,
3251 3251 // _vo == UseNextMarking -> use "next" marking information,
3252 3252 // _vo == UseMarkWord -> use mark word from object header.
3253 3253 G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
3254 3254 AbstractGangTask("Parallel verify task"),
3255 3255 _g1h(g1h),
3256 3256 _vo(vo),
3257 3257 _failures(false) { }
3258 3258
3259 3259 bool failures() {
3260 3260 return _failures;
3261 3261 }
3262 3262
3263 3263 void work(uint worker_id) {
3264 3264 HandleMark hm;
3265 3265 VerifyRegionClosure blk(true, _vo);
3266 3266 _g1h->heap_region_par_iterate_chunked(&blk, worker_id,
3267 3267 _g1h->workers()->active_workers(),
3268 3268 HeapRegion::ParVerifyClaimValue);
3269 3269 if (blk.failures()) {
3270 3270 _failures = true;
3271 3271 }
3272 3272 }
3273 3273 };
3274 3274
3275 3275 void G1CollectedHeap::verify(bool silent) {
3276 3276 verify(silent, VerifyOption_G1UsePrevMarking);
3277 3277 }
3278 3278
3279 3279 void G1CollectedHeap::verify(bool silent,
3280 3280 VerifyOption vo) {
3281 3281 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
3282 3282 if (!silent) { gclog_or_tty->print("Roots (excluding permgen) "); }
3283 3283 VerifyRootsClosure rootsCl(vo);
3284 3284
3285 3285 assert(Thread::current()->is_VM_thread(),
3286 3286 "Expected to be executed serially by the VM thread at this point");
3287 3287
3288 3288 CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
3289 3289
3290 3290 // We apply the relevant closures to all the oops in the
3291 3291 // system dictionary, the string table and the code cache.
3292 3292 const int so = SO_AllClasses | SO_Strings | SO_CodeCache;
3293 3293
3294 3294 process_strong_roots(true, // activate StrongRootsScope
3295 3295 true, // we set "collecting perm gen" to true,
3296 3296 // so we don't reset the dirty cards in the perm gen.
3297 3297 ScanningOption(so), // roots scanning options
3298 3298 &rootsCl,
3299 3299 &blobsCl,
3300 3300 &rootsCl);
3301 3301
3302 3302 // If we're verifying after the marking phase of a Full GC then we can't
3303 3303 // treat the perm gen as roots into the G1 heap. Some of the objects in
3304 3304 // the perm gen may be dead and hence not marked. If one of these dead
3305 3305 // objects is considered to be a root then we may end up with a false
3306 3306 // "Root location <x> points to dead ob <y>" failure.
3307 3307 if (vo != VerifyOption_G1UseMarkWord) {
3308 3308 // Since we used "collecting_perm_gen" == true above, we will not have
3309 3309 // checked the refs from perm into the G1-collected heap. We check those
3310 3310 // references explicitly below. Whether the relevant cards are dirty
3311 3311 // is checked further below in the rem set verification.
3312 3312 if (!silent) { gclog_or_tty->print("Permgen roots "); }
3313 3313 perm_gen()->oop_iterate(&rootsCl);
3314 3314 }
3315 3315 bool failures = rootsCl.failures();
3316 3316
3317 3317 if (vo != VerifyOption_G1UseMarkWord) {
3318 3318 // If we're verifying during a full GC then the region sets
3319 3319 // will have been torn down at the start of the GC. Therefore
3320 3320 // verifying the region sets will fail. So we only verify
3321 3321 // the region sets when not in a full GC.
3322 3322 if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
3323 3323 verify_region_sets();
3324 3324 }
3325 3325
3326 3326 if (!silent) { gclog_or_tty->print("HeapRegions "); }
3327 3327 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
3328 3328 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
3329 3329 "sanity check");
3330 3330
3331 3331 G1ParVerifyTask task(this, vo);
3332 3332 assert(UseDynamicNumberOfGCThreads ||
3333 3333 workers()->active_workers() == workers()->total_workers(),
3334 3334 "If not dynamic should be using all the workers");
3335 3335 int n_workers = workers()->active_workers();
3336 3336 set_par_threads(n_workers);
3337 3337 workers()->run_task(&task);
3338 3338 set_par_threads(0);
3339 3339 if (task.failures()) {
3340 3340 failures = true;
3341 3341 }
3342 3342
3343 3343 // Checks that the expected amount of parallel work was done.
3344 3344 // The implication is that n_workers is > 0.
3345 3345 assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
3346 3346 "sanity check");
3347 3347
3348 3348 reset_heap_region_claim_values();
3349 3349
3350 3350 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
3351 3351 "sanity check");
3352 3352 } else {
3353 3353 VerifyRegionClosure blk(false, vo);
3354 3354 heap_region_iterate(&blk);
3355 3355 if (blk.failures()) {
3356 3356 failures = true;
3357 3357 }
3358 3358 }
3359 3359 if (!silent) gclog_or_tty->print("RemSet ");
3360 3360 rem_set()->verify();
3361 3361
3362 3362 if (failures) {
3363 3363 gclog_or_tty->print_cr("Heap:");
3364 3364 // It helps to have the per-region information in the output to
3365 3365 // help us track down what went wrong. This is why we call
3366 3366 // print_extended_on() instead of print_on().
3367 3367 print_extended_on(gclog_or_tty);
3368 3368 gclog_or_tty->print_cr("");
3369 3369 #ifndef PRODUCT
3370 3370 if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
3371 3371 concurrent_mark()->print_reachable("at-verification-failure",
3372 3372 vo, false /* all */);
3373 3373 }
3374 3374 #endif
3375 3375 gclog_or_tty->flush();
3376 3376 }
3377 3377 guarantee(!failures, "there should not have been any failures");
3378 3378 } else {
3379 3379 if (!silent) gclog_or_tty->print("(SKIPPING roots, heapRegions, remset) ");
3380 3380 }
3381 3381 }
3382 3382
3383 3383 class PrintRegionClosure: public HeapRegionClosure {
3384 3384 outputStream* _st;
3385 3385 public:
3386 3386 PrintRegionClosure(outputStream* st) : _st(st) {}
3387 3387 bool doHeapRegion(HeapRegion* r) {
3388 3388 r->print_on(_st);
3389 3389 return false;
3390 3390 }
3391 3391 };
3392 3392
3393 3393 void G1CollectedHeap::print_on(outputStream* st) const {
3394 3394 st->print(" %-20s", "garbage-first heap");
3395 3395 st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
3396 3396 capacity()/K, used_unlocked()/K);
3397 3397 st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
3398 3398 _g1_storage.low_boundary(),
3399 3399 _g1_storage.high(),
3400 3400 _g1_storage.high_boundary());
3401 3401 st->cr();
3402 3402 st->print(" region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K);
3403 3403 uint young_regions = _young_list->length();
3404 3404 st->print("%u young (" SIZE_FORMAT "K), ", young_regions,
3405 3405 (size_t) young_regions * HeapRegion::GrainBytes / K);
3406 3406 uint survivor_regions = g1_policy()->recorded_survivor_regions();
3407 3407 st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions,
3408 3408 (size_t) survivor_regions * HeapRegion::GrainBytes / K);
3409 3409 st->cr();
3410 3410 perm()->as_gen()->print_on(st);
3411 3411 }
3412 3412
3413 3413 void G1CollectedHeap::print_extended_on(outputStream* st) const {
3414 3414 print_on(st);
3415 3415
3416 3416 // Print the per-region information.
3417 3417 st->cr();
3418 3418 st->print_cr("Heap Regions: (Y=young(eden), SU=young(survivor), "
3419 3419 "HS=humongous(starts), HC=humongous(continues), "
3420 3420 "CS=collection set, F=free, TS=gc time stamp, "
3421 3421 "PTAMS=previous top-at-mark-start, "
3422 3422 "NTAMS=next top-at-mark-start)");
3423 3423 PrintRegionClosure blk(st);
3424 3424 heap_region_iterate(&blk);
3425 3425 }
3426 3426
3427 3427 void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
3428 3428 if (G1CollectedHeap::use_parallel_gc_threads()) {
3429 3429 workers()->print_worker_threads_on(st);
3430 3430 }
3431 3431 _cmThread->print_on(st);
3432 3432 st->cr();
3433 3433 _cm->print_worker_threads_on(st);
3434 3434 _cg1r->print_worker_threads_on(st);
3435 3435 st->cr();
3436 3436 }
3437 3437
3438 3438 void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
3439 3439 if (G1CollectedHeap::use_parallel_gc_threads()) {
3440 3440 workers()->threads_do(tc);
3441 3441 }
3442 3442 tc->do_thread(_cmThread);
3443 3443 _cg1r->threads_do(tc);
3444 3444 }
3445 3445
3446 3446 void G1CollectedHeap::print_tracing_info() const {
3447 3447 // We'll overload this to mean "trace GC pause statistics."
3448 3448 if (TraceGen0Time || TraceGen1Time) {
3449 3449 // The "G1CollectorPolicy" is keeping track of these stats, so delegate
3450 3450 // to that.
3451 3451 g1_policy()->print_tracing_info();
3452 3452 }
3453 3453 if (G1SummarizeRSetStats) {
3454 3454 g1_rem_set()->print_summary_info();
3455 3455 }
3456 3456 if (G1SummarizeConcMark) {
3457 3457 concurrent_mark()->print_summary_info();
3458 3458 }
3459 3459 g1_policy()->print_yg_surv_rate_info();
3460 3460 SpecializationStats::print();
3461 3461 }
3462 3462
3463 3463 #ifndef PRODUCT
3464 3464 // Helpful for debugging RSet issues.
3465 3465
3466 3466 class PrintRSetsClosure : public HeapRegionClosure {
3467 3467 private:
3468 3468 const char* _msg;
3469 3469 size_t _occupied_sum;
3470 3470
3471 3471 public:
3472 3472 bool doHeapRegion(HeapRegion* r) {
3473 3473 HeapRegionRemSet* hrrs = r->rem_set();
3474 3474 size_t occupied = hrrs->occupied();
3475 3475 _occupied_sum += occupied;
3476 3476
3477 3477 gclog_or_tty->print_cr("Printing RSet for region "HR_FORMAT,
3478 3478 HR_FORMAT_PARAMS(r));
3479 3479 if (occupied == 0) {
3480 3480 gclog_or_tty->print_cr(" RSet is empty");
3481 3481 } else {
3482 3482 hrrs->print();
3483 3483 }
3484 3484 gclog_or_tty->print_cr("----------");
3485 3485 return false;
3486 3486 }
3487 3487
3488 3488 PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) {
3489 3489 gclog_or_tty->cr();
3490 3490 gclog_or_tty->print_cr("========================================");
3491 3491 gclog_or_tty->print_cr(msg);
3492 3492 gclog_or_tty->cr();
3493 3493 }
3494 3494
3495 3495 ~PrintRSetsClosure() {
3496 3496 gclog_or_tty->print_cr("Occupied Sum: "SIZE_FORMAT, _occupied_sum);
3497 3497 gclog_or_tty->print_cr("========================================");
3498 3498 gclog_or_tty->cr();
3499 3499 }
3500 3500 };
3501 3501
3502 3502 void G1CollectedHeap::print_cset_rsets() {
3503 3503 PrintRSetsClosure cl("Printing CSet RSets");
3504 3504 collection_set_iterate(&cl);
3505 3505 }
3506 3506
3507 3507 void G1CollectedHeap::print_all_rsets() {
3508 3508 PrintRSetsClosure cl("Printing All RSets");;
3509 3509 heap_region_iterate(&cl);
3510 3510 }
3511 3511 #endif // PRODUCT
3512 3512
3513 3513 G1CollectedHeap* G1CollectedHeap::heap() {
3514 3514 assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
3515 3515 "not a garbage-first heap");
3516 3516 return _g1h;
3517 3517 }
3518 3518
3519 3519 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
3520 3520 // always_do_update_barrier = false;
3521 3521 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
3522 3522 // Call allocation profiler
3523 3523 AllocationProfiler::iterate_since_last_gc();
3524 3524 // Fill TLAB's and such
3525 3525 ensure_parsability(true);
3526 3526 }
3527 3527
3528 3528 void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
3529 3529 // FIXME: what is this about?
3530 3530 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
3531 3531 // is set.
3532 3532 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
3533 3533 "derived pointer present"));
3534 3534 // always_do_update_barrier = true;
3535 3535
3536 3536 // We have just completed a GC. Update the soft reference
3537 3537 // policy with the new heap occupancy
3538 3538 Universe::update_heap_info_at_gc();
3539 3539 }
3540 3540
3541 3541 HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
3542 3542 unsigned int gc_count_before,
3543 3543 bool* succeeded) {
3544 3544 assert_heap_not_locked_and_not_at_safepoint();
3545 3545 g1_policy()->record_stop_world_start();
3546 3546 VM_G1IncCollectionPause op(gc_count_before,
3547 3547 word_size,
3548 3548 false, /* should_initiate_conc_mark */
3549 3549 g1_policy()->max_pause_time_ms(),
3550 3550 GCCause::_g1_inc_collection_pause);
3551 3551 VMThread::execute(&op);
3552 3552
3553 3553 HeapWord* result = op.result();
3554 3554 bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
3555 3555 assert(result == NULL || ret_succeeded,
3556 3556 "the result should be NULL if the VM did not succeed");
3557 3557 *succeeded = ret_succeeded;
3558 3558
3559 3559 assert_heap_not_locked();
3560 3560 return result;
3561 3561 }
3562 3562
3563 3563 void
3564 3564 G1CollectedHeap::doConcurrentMark() {
3565 3565 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
3566 3566 if (!_cmThread->in_progress()) {
3567 3567 _cmThread->set_started();
3568 3568 CGC_lock->notify();
3569 3569 }
3570 3570 }
3571 3571
3572 3572 size_t G1CollectedHeap::pending_card_num() {
↓ open down ↓ |
3572 lines elided |
↑ open up ↑ |
3573 3573 size_t extra_cards = 0;
3574 3574 JavaThread *curr = Threads::first();
3575 3575 while (curr != NULL) {
3576 3576 DirtyCardQueue& dcq = curr->dirty_card_queue();
3577 3577 extra_cards += dcq.size();
3578 3578 curr = curr->next();
3579 3579 }
3580 3580 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
3581 3581 size_t buffer_size = dcqs.buffer_size();
3582 3582 size_t buffer_num = dcqs.completed_buffers_num();
3583 - return buffer_size * buffer_num + extra_cards;
3583 +
3584 + // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes
3585 + // in bytes - not the number of 'entries'. We need to convert
3586 + // into a number of cards.
3587 + return (buffer_size * buffer_num + extra_cards) / oopSize;
3584 3588 }
3585 3589
3586 3590 size_t G1CollectedHeap::max_pending_card_num() {
3587 3591 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
3588 3592 size_t buffer_size = dcqs.buffer_size();
3589 3593 size_t buffer_num = dcqs.completed_buffers_num();
3590 3594 int thread_num = Threads::number_of_threads();
3591 3595 return (buffer_num + thread_num) * buffer_size;
3592 3596 }
3593 3597
3594 3598 size_t G1CollectedHeap::cards_scanned() {
3595 3599 return g1_rem_set()->cardsScanned();
3596 3600 }
3597 3601
3598 3602 void
3599 3603 G1CollectedHeap::setup_surviving_young_words() {
3600 3604 assert(_surviving_young_words == NULL, "pre-condition");
3601 3605 uint array_length = g1_policy()->young_cset_region_length();
3602 3606 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
3603 3607 if (_surviving_young_words == NULL) {
3604 3608 vm_exit_out_of_memory(sizeof(size_t) * array_length,
3605 3609 "Not enough space for young surv words summary.");
3606 3610 }
3607 3611 memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t));
3608 3612 #ifdef ASSERT
3609 3613 for (uint i = 0; i < array_length; ++i) {
3610 3614 assert( _surviving_young_words[i] == 0, "memset above" );
3611 3615 }
3612 3616 #endif // !ASSERT
3613 3617 }
3614 3618
3615 3619 void
3616 3620 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
3617 3621 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
3618 3622 uint array_length = g1_policy()->young_cset_region_length();
3619 3623 for (uint i = 0; i < array_length; ++i) {
3620 3624 _surviving_young_words[i] += surv_young_words[i];
3621 3625 }
3622 3626 }
3623 3627
3624 3628 void
3625 3629 G1CollectedHeap::cleanup_surviving_young_words() {
3626 3630 guarantee( _surviving_young_words != NULL, "pre-condition" );
3627 3631 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC);
3628 3632 _surviving_young_words = NULL;
3629 3633 }
3630 3634
3631 3635 #ifdef ASSERT
3632 3636 class VerifyCSetClosure: public HeapRegionClosure {
3633 3637 public:
3634 3638 bool doHeapRegion(HeapRegion* hr) {
3635 3639 // Here we check that the CSet region's RSet is ready for parallel
3636 3640 // iteration. The fields that we'll verify are only manipulated
3637 3641 // when the region is part of a CSet and is collected. Afterwards,
3638 3642 // we reset these fields when we clear the region's RSet (when the
3639 3643 // region is freed) so they are ready when the region is
3640 3644 // re-allocated. The only exception to this is if there's an
3641 3645 // evacuation failure and instead of freeing the region we leave
3642 3646 // it in the heap. In that case, we reset these fields during
3643 3647 // evacuation failure handling.
3644 3648 guarantee(hr->rem_set()->verify_ready_for_par_iteration(), "verification");
3645 3649
3646 3650 // Here's a good place to add any other checks we'd like to
3647 3651 // perform on CSet regions.
3648 3652 return false;
3649 3653 }
3650 3654 };
3651 3655 #endif // ASSERT
3652 3656
3653 3657 #if TASKQUEUE_STATS
3654 3658 void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
3655 3659 st->print_raw_cr("GC Task Stats");
3656 3660 st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
3657 3661 st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
3658 3662 }
3659 3663
3660 3664 void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
3661 3665 print_taskqueue_stats_hdr(st);
3662 3666
3663 3667 TaskQueueStats totals;
3664 3668 const int n = workers() != NULL ? workers()->total_workers() : 1;
3665 3669 for (int i = 0; i < n; ++i) {
3666 3670 st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
3667 3671 totals += task_queue(i)->stats;
3668 3672 }
3669 3673 st->print_raw("tot "); totals.print(st); st->cr();
3670 3674
3671 3675 DEBUG_ONLY(totals.verify());
3672 3676 }
3673 3677
3674 3678 void G1CollectedHeap::reset_taskqueue_stats() {
3675 3679 const int n = workers() != NULL ? workers()->total_workers() : 1;
3676 3680 for (int i = 0; i < n; ++i) {
3677 3681 task_queue(i)->stats.reset();
3678 3682 }
3679 3683 }
3680 3684 #endif // TASKQUEUE_STATS
3681 3685
3682 3686 bool
3683 3687 G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
3684 3688 assert_at_safepoint(true /* should_be_vm_thread */);
3685 3689 guarantee(!is_gc_active(), "collection is not reentrant");
3686 3690
3687 3691 if (GC_locker::check_active_before_gc()) {
3688 3692 return false;
3689 3693 }
3690 3694
3691 3695 SvcGCMarker sgcm(SvcGCMarker::MINOR);
3692 3696 ResourceMark rm;
3693 3697
3694 3698 print_heap_before_gc();
3695 3699
3696 3700 HRSPhaseSetter x(HRSPhaseEvacuation);
3697 3701 verify_region_sets_optional();
3698 3702 verify_dirty_young_regions();
3699 3703
3700 3704 // This call will decide whether this pause is an initial-mark
3701 3705 // pause. If it is, during_initial_mark_pause() will return true
3702 3706 // for the duration of this pause.
3703 3707 g1_policy()->decide_on_conc_mark_initiation();
3704 3708
3705 3709 // We do not allow initial-mark to be piggy-backed on a mixed GC.
3706 3710 assert(!g1_policy()->during_initial_mark_pause() ||
3707 3711 g1_policy()->gcs_are_young(), "sanity");
3708 3712
3709 3713 // We also do not allow mixed GCs during marking.
3710 3714 assert(!mark_in_progress() || g1_policy()->gcs_are_young(), "sanity");
3711 3715
3712 3716 // Record whether this pause is an initial mark. When the current
3713 3717 // thread has completed its logging output and it's safe to signal
3714 3718 // the CM thread, the flag's value in the policy has been reset.
3715 3719 bool should_start_conc_mark = g1_policy()->during_initial_mark_pause();
3716 3720
3717 3721 // Inner scope for scope based logging, timers, and stats collection
3718 3722 {
3719 3723 if (g1_policy()->during_initial_mark_pause()) {
3720 3724 // We are about to start a marking cycle, so we increment the
3721 3725 // full collection counter.
3722 3726 increment_old_marking_cycles_started();
3723 3727 }
3724 3728 // if the log level is "finer" is on, we'll print long statistics information
3725 3729 // in the collector policy code, so let's not print this as the output
3726 3730 // is messy if we do.
3727 3731 gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
3728 3732 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
3729 3733
3730 3734 int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
3731 3735 workers()->active_workers() : 1);
3732 3736 g1_policy()->phase_times()->note_gc_start(os::elapsedTime(), active_workers,
3733 3737 g1_policy()->gcs_are_young(), g1_policy()->during_initial_mark_pause(), gc_cause());
3734 3738
3735 3739 TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
3736 3740 TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
3737 3741
3738 3742 // If the secondary_free_list is not empty, append it to the
3739 3743 // free_list. No need to wait for the cleanup operation to finish;
3740 3744 // the region allocation code will check the secondary_free_list
3741 3745 // and wait if necessary. If the G1StressConcRegionFreeing flag is
3742 3746 // set, skip this step so that the region allocation code has to
3743 3747 // get entries from the secondary_free_list.
3744 3748 if (!G1StressConcRegionFreeing) {
3745 3749 append_secondary_free_list_if_not_empty_with_lock();
3746 3750 }
3747 3751
3748 3752 assert(check_young_list_well_formed(),
3749 3753 "young list should be well formed");
3750 3754
3751 3755 // Don't dynamically change the number of GC threads this early. A value of
3752 3756 // 0 is used to indicate serial work. When parallel work is done,
3753 3757 // it will be set.
3754 3758
3755 3759 { // Call to jvmpi::post_class_unload_events must occur outside of active GC
3756 3760 IsGCActiveMark x;
3757 3761
3758 3762 gc_prologue(false);
3759 3763 increment_total_collections(false /* full gc */);
3760 3764 increment_gc_time_stamp();
3761 3765
3762 3766 if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
3763 3767 HandleMark hm; // Discard invalid handles created during verification
3764 3768 gclog_or_tty->print(" VerifyBeforeGC:");
3765 3769 prepare_for_verify();
3766 3770 Universe::verify(/* silent */ false,
3767 3771 /* option */ VerifyOption_G1UsePrevMarking);
3768 3772 }
3769 3773
3770 3774 COMPILER2_PRESENT(DerivedPointerTable::clear());
3771 3775
3772 3776 // Please see comment in g1CollectedHeap.hpp and
3773 3777 // G1CollectedHeap::ref_processing_init() to see how
3774 3778 // reference processing currently works in G1.
3775 3779
3776 3780 // Enable discovery in the STW reference processor
3777 3781 ref_processor_stw()->enable_discovery(true /*verify_disabled*/,
3778 3782 true /*verify_no_refs*/);
3779 3783
3780 3784 {
3781 3785 // We want to temporarily turn off discovery by the
3782 3786 // CM ref processor, if necessary, and turn it back on
3783 3787 // on again later if we do. Using a scoped
3784 3788 // NoRefDiscovery object will do this.
3785 3789 NoRefDiscovery no_cm_discovery(ref_processor_cm());
3786 3790
3787 3791 // Forget the current alloc region (we might even choose it to be part
3788 3792 // of the collection set!).
3789 3793 release_mutator_alloc_region();
3790 3794
3791 3795 // We should call this after we retire the mutator alloc
3792 3796 // region(s) so that all the ALLOC / RETIRE events are generated
3793 3797 // before the start GC event.
3794 3798 _hr_printer.start_gc(false /* full */, (size_t) total_collections());
3795 3799
3796 3800 // This timing is only used by the ergonomics to handle our pause target.
3797 3801 // It is unclear why this should not include the full pause. We will
3798 3802 // investigate this in CR 7178365.
3799 3803 //
3800 3804 // Preserving the old comment here if that helps the investigation:
3801 3805 //
3802 3806 // The elapsed time induced by the start time below deliberately elides
3803 3807 // the possible verification above.
3804 3808 double sample_start_time_sec = os::elapsedTime();
3805 3809 size_t start_used_bytes = used();
3806 3810
3807 3811 #if YOUNG_LIST_VERBOSE
3808 3812 gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
3809 3813 _young_list->print();
3810 3814 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
3811 3815 #endif // YOUNG_LIST_VERBOSE
3812 3816
3813 3817 g1_policy()->record_collection_pause_start(sample_start_time_sec,
3814 3818 start_used_bytes);
3815 3819
3816 3820 double scan_wait_start = os::elapsedTime();
3817 3821 // We have to wait until the CM threads finish scanning the
3818 3822 // root regions as it's the only way to ensure that all the
3819 3823 // objects on them have been correctly scanned before we start
3820 3824 // moving them during the GC.
3821 3825 bool waited = _cm->root_regions()->wait_until_scan_finished();
3822 3826 double wait_time_ms = 0.0;
3823 3827 if (waited) {
3824 3828 double scan_wait_end = os::elapsedTime();
3825 3829 wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
3826 3830 }
3827 3831 g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms);
3828 3832
3829 3833 #if YOUNG_LIST_VERBOSE
3830 3834 gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
3831 3835 _young_list->print();
3832 3836 #endif // YOUNG_LIST_VERBOSE
3833 3837
3834 3838 if (g1_policy()->during_initial_mark_pause()) {
3835 3839 concurrent_mark()->checkpointRootsInitialPre();
3836 3840 }
3837 3841 perm_gen()->save_marks();
3838 3842
3839 3843 #if YOUNG_LIST_VERBOSE
3840 3844 gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
3841 3845 _young_list->print();
3842 3846 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
3843 3847 #endif // YOUNG_LIST_VERBOSE
3844 3848
3845 3849 g1_policy()->finalize_cset(target_pause_time_ms);
3846 3850
3847 3851 _cm->note_start_of_gc();
3848 3852 // We should not verify the per-thread SATB buffers given that
3849 3853 // we have not filtered them yet (we'll do so during the
3850 3854 // GC). We also call this after finalize_cset() to
3851 3855 // ensure that the CSet has been finalized.
3852 3856 _cm->verify_no_cset_oops(true /* verify_stacks */,
3853 3857 true /* verify_enqueued_buffers */,
3854 3858 false /* verify_thread_buffers */,
3855 3859 true /* verify_fingers */);
3856 3860
3857 3861 if (_hr_printer.is_active()) {
3858 3862 HeapRegion* hr = g1_policy()->collection_set();
3859 3863 while (hr != NULL) {
3860 3864 G1HRPrinter::RegionType type;
3861 3865 if (!hr->is_young()) {
3862 3866 type = G1HRPrinter::Old;
3863 3867 } else if (hr->is_survivor()) {
3864 3868 type = G1HRPrinter::Survivor;
3865 3869 } else {
3866 3870 type = G1HRPrinter::Eden;
3867 3871 }
3868 3872 _hr_printer.cset(hr);
3869 3873 hr = hr->next_in_collection_set();
3870 3874 }
3871 3875 }
3872 3876
3873 3877 #ifdef ASSERT
3874 3878 VerifyCSetClosure cl;
3875 3879 collection_set_iterate(&cl);
3876 3880 #endif // ASSERT
3877 3881
3878 3882 setup_surviving_young_words();
3879 3883
3880 3884 // Initialize the GC alloc regions.
3881 3885 init_gc_alloc_regions();
3882 3886
3883 3887 // Actually do the work...
3884 3888 evacuate_collection_set();
3885 3889
3886 3890 // We do this to mainly verify the per-thread SATB buffers
3887 3891 // (which have been filtered by now) since we didn't verify
3888 3892 // them earlier. No point in re-checking the stacks / enqueued
3889 3893 // buffers given that the CSet has not changed since last time
3890 3894 // we checked.
3891 3895 _cm->verify_no_cset_oops(false /* verify_stacks */,
3892 3896 false /* verify_enqueued_buffers */,
3893 3897 true /* verify_thread_buffers */,
3894 3898 true /* verify_fingers */);
3895 3899
3896 3900 free_collection_set(g1_policy()->collection_set());
3897 3901 g1_policy()->clear_collection_set();
3898 3902
3899 3903 cleanup_surviving_young_words();
3900 3904
3901 3905 // Start a new incremental collection set for the next pause.
3902 3906 g1_policy()->start_incremental_cset_building();
3903 3907
3904 3908 // Clear the _cset_fast_test bitmap in anticipation of adding
3905 3909 // regions to the incremental collection set for the next
3906 3910 // evacuation pause.
3907 3911 clear_cset_fast_test();
3908 3912
3909 3913 _young_list->reset_sampled_info();
3910 3914
3911 3915 // Don't check the whole heap at this point as the
3912 3916 // GC alloc regions from this pause have been tagged
3913 3917 // as survivors and moved on to the survivor list.
3914 3918 // Survivor regions will fail the !is_young() check.
3915 3919 assert(check_young_list_empty(false /* check_heap */),
3916 3920 "young list should be empty");
3917 3921
3918 3922 #if YOUNG_LIST_VERBOSE
3919 3923 gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
3920 3924 _young_list->print();
3921 3925 #endif // YOUNG_LIST_VERBOSE
3922 3926
3923 3927 g1_policy()->record_survivor_regions(_young_list->survivor_length(),
3924 3928 _young_list->first_survivor_region(),
3925 3929 _young_list->last_survivor_region());
3926 3930
3927 3931 _young_list->reset_auxilary_lists();
3928 3932
3929 3933 if (evacuation_failed()) {
3930 3934 _summary_bytes_used = recalculate_used();
3931 3935 } else {
3932 3936 // The "used" of the the collection set have already been subtracted
3933 3937 // when they were freed. Add in the bytes evacuated.
3934 3938 _summary_bytes_used += g1_policy()->bytes_copied_during_gc();
3935 3939 }
3936 3940
3937 3941 if (g1_policy()->during_initial_mark_pause()) {
3938 3942 // We have to do this before we notify the CM threads that
3939 3943 // they can start working to make sure that all the
3940 3944 // appropriate initialization is done on the CM object.
3941 3945 concurrent_mark()->checkpointRootsInitialPost();
3942 3946 set_marking_started();
3943 3947 // Note that we don't actually trigger the CM thread at
3944 3948 // this point. We do that later when we're sure that
3945 3949 // the current thread has completed its logging output.
3946 3950 }
3947 3951
3948 3952 allocate_dummy_regions();
3949 3953
3950 3954 #if YOUNG_LIST_VERBOSE
3951 3955 gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
3952 3956 _young_list->print();
3953 3957 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
3954 3958 #endif // YOUNG_LIST_VERBOSE
3955 3959
3956 3960 init_mutator_alloc_region();
3957 3961
3958 3962 {
3959 3963 size_t expand_bytes = g1_policy()->expansion_amount();
3960 3964 if (expand_bytes > 0) {
3961 3965 size_t bytes_before = capacity();
3962 3966 // No need for an ergo verbose message here,
3963 3967 // expansion_amount() does this when it returns a value > 0.
3964 3968 if (!expand(expand_bytes)) {
3965 3969 // We failed to expand the heap so let's verify that
3966 3970 // committed/uncommitted amount match the backing store
3967 3971 assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
3968 3972 assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch");
3969 3973 }
3970 3974 }
3971 3975 }
3972 3976
3973 3977 // We redo the verificaiton but now wrt to the new CSet which
3974 3978 // has just got initialized after the previous CSet was freed.
3975 3979 _cm->verify_no_cset_oops(true /* verify_stacks */,
3976 3980 true /* verify_enqueued_buffers */,
3977 3981 true /* verify_thread_buffers */,
3978 3982 true /* verify_fingers */);
3979 3983 _cm->note_end_of_gc();
3980 3984
3981 3985 // Collect thread local data to allow the ergonomics to use
3982 3986 // the collected information
3983 3987 g1_policy()->phase_times()->collapse_par_times();
3984 3988
3985 3989 // This timing is only used by the ergonomics to handle our pause target.
3986 3990 // It is unclear why this should not include the full pause. We will
3987 3991 // investigate this in CR 7178365.
3988 3992 double sample_end_time_sec = os::elapsedTime();
3989 3993 double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS;
3990 3994 g1_policy()->record_collection_pause_end(pause_time_ms);
3991 3995
3992 3996 MemoryService::track_memory_usage();
3993 3997
3994 3998 // In prepare_for_verify() below we'll need to scan the deferred
3995 3999 // update buffers to bring the RSets up-to-date if
3996 4000 // G1HRRSFlushLogBuffersOnVerify has been set. While scanning
3997 4001 // the update buffers we'll probably need to scan cards on the
3998 4002 // regions we just allocated to (i.e., the GC alloc
3999 4003 // regions). However, during the last GC we called
4000 4004 // set_saved_mark() on all the GC alloc regions, so card
4001 4005 // scanning might skip the [saved_mark_word()...top()] area of
4002 4006 // those regions (i.e., the area we allocated objects into
4003 4007 // during the last GC). But it shouldn't. Given that
4004 4008 // saved_mark_word() is conditional on whether the GC time stamp
4005 4009 // on the region is current or not, by incrementing the GC time
4006 4010 // stamp here we invalidate all the GC time stamps on all the
4007 4011 // regions and saved_mark_word() will simply return top() for
4008 4012 // all the regions. This is a nicer way of ensuring this rather
4009 4013 // than iterating over the regions and fixing them. In fact, the
4010 4014 // GC time stamp increment here also ensures that
4011 4015 // saved_mark_word() will return top() between pauses, i.e.,
4012 4016 // during concurrent refinement. So we don't need the
4013 4017 // is_gc_active() check to decided which top to use when
4014 4018 // scanning cards (see CR 7039627).
4015 4019 increment_gc_time_stamp();
4016 4020
4017 4021 if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
4018 4022 HandleMark hm; // Discard invalid handles created during verification
4019 4023 gclog_or_tty->print(" VerifyAfterGC:");
4020 4024 prepare_for_verify();
4021 4025 Universe::verify(/* silent */ false,
4022 4026 /* option */ VerifyOption_G1UsePrevMarking);
4023 4027 }
4024 4028
4025 4029 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4026 4030 ref_processor_stw()->verify_no_references_recorded();
4027 4031
4028 4032 // CM reference discovery will be re-enabled if necessary.
4029 4033 }
4030 4034
4031 4035 // We should do this after we potentially expand the heap so
4032 4036 // that all the COMMIT events are generated before the end GC
4033 4037 // event, and after we retire the GC alloc regions so that all
4034 4038 // RETIRE events are generated before the end GC event.
4035 4039 _hr_printer.end_gc(false /* full */, (size_t) total_collections());
4036 4040
4037 4041 if (mark_in_progress()) {
4038 4042 concurrent_mark()->update_g1_committed();
4039 4043 }
4040 4044
4041 4045 #ifdef TRACESPINNING
4042 4046 ParallelTaskTerminator::print_termination_counts();
4043 4047 #endif
4044 4048
4045 4049 gc_epilogue(false);
4046 4050
4047 4051 g1_policy()->phase_times()->note_gc_end(os::elapsedTime());
4048 4052
4049 4053 // We have to do this after we decide whether to expand the heap or not.
4050 4054 g1_policy()->print_heap_transition();
4051 4055 }
4052 4056
4053 4057 // It is not yet to safe to tell the concurrent mark to
4054 4058 // start as we have some optional output below. We don't want the
4055 4059 // output from the concurrent mark thread interfering with this
4056 4060 // logging output either.
4057 4061
4058 4062 _hrs.verify_optional();
4059 4063 verify_region_sets_optional();
4060 4064
4061 4065 TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
4062 4066 TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
4063 4067
4064 4068 print_heap_after_gc();
4065 4069
4066 4070 // We must call G1MonitoringSupport::update_sizes() in the same scoping level
4067 4071 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
4068 4072 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
4069 4073 // before any GC notifications are raised.
4070 4074 g1mm()->update_sizes();
4071 4075 }
4072 4076
4073 4077 if (G1SummarizeRSetStats &&
4074 4078 (G1SummarizeRSetStatsPeriod > 0) &&
4075 4079 (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
4076 4080 g1_rem_set()->print_summary_info();
4077 4081 }
4078 4082
4079 4083 // It should now be safe to tell the concurrent mark thread to start
4080 4084 // without its logging output interfering with the logging output
4081 4085 // that came from the pause.
4082 4086
4083 4087 if (should_start_conc_mark) {
4084 4088 // CAUTION: after the doConcurrentMark() call below,
4085 4089 // the concurrent marking thread(s) could be running
4086 4090 // concurrently with us. Make sure that anything after
4087 4091 // this point does not assume that we are the only GC thread
4088 4092 // running. Note: of course, the actual marking work will
4089 4093 // not start until the safepoint itself is released in
4090 4094 // ConcurrentGCThread::safepoint_desynchronize().
4091 4095 doConcurrentMark();
4092 4096 }
4093 4097
4094 4098 return true;
4095 4099 }
4096 4100
4097 4101 size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
4098 4102 {
4099 4103 size_t gclab_word_size;
4100 4104 switch (purpose) {
4101 4105 case GCAllocForSurvived:
4102 4106 gclab_word_size = YoungPLABSize;
4103 4107 break;
4104 4108 case GCAllocForTenured:
4105 4109 gclab_word_size = OldPLABSize;
4106 4110 break;
4107 4111 default:
4108 4112 assert(false, "unknown GCAllocPurpose");
4109 4113 gclab_word_size = OldPLABSize;
4110 4114 break;
4111 4115 }
4112 4116 return gclab_word_size;
4113 4117 }
4114 4118
4115 4119 void G1CollectedHeap::init_mutator_alloc_region() {
4116 4120 assert(_mutator_alloc_region.get() == NULL, "pre-condition");
4117 4121 _mutator_alloc_region.init();
4118 4122 }
4119 4123
4120 4124 void G1CollectedHeap::release_mutator_alloc_region() {
4121 4125 _mutator_alloc_region.release();
4122 4126 assert(_mutator_alloc_region.get() == NULL, "post-condition");
4123 4127 }
4124 4128
4125 4129 void G1CollectedHeap::init_gc_alloc_regions() {
4126 4130 assert_at_safepoint(true /* should_be_vm_thread */);
4127 4131
4128 4132 _survivor_gc_alloc_region.init();
4129 4133 _old_gc_alloc_region.init();
4130 4134 HeapRegion* retained_region = _retained_old_gc_alloc_region;
4131 4135 _retained_old_gc_alloc_region = NULL;
4132 4136
4133 4137 // We will discard the current GC alloc region if:
4134 4138 // a) it's in the collection set (it can happen!),
4135 4139 // b) it's already full (no point in using it),
4136 4140 // c) it's empty (this means that it was emptied during
4137 4141 // a cleanup and it should be on the free list now), or
4138 4142 // d) it's humongous (this means that it was emptied
4139 4143 // during a cleanup and was added to the free list, but
4140 4144 // has been subseqently used to allocate a humongous
4141 4145 // object that may be less than the region size).
4142 4146 if (retained_region != NULL &&
4143 4147 !retained_region->in_collection_set() &&
4144 4148 !(retained_region->top() == retained_region->end()) &&
4145 4149 !retained_region->is_empty() &&
4146 4150 !retained_region->isHumongous()) {
4147 4151 retained_region->set_saved_mark();
4148 4152 // The retained region was added to the old region set when it was
4149 4153 // retired. We have to remove it now, since we don't allow regions
4150 4154 // we allocate to in the region sets. We'll re-add it later, when
4151 4155 // it's retired again.
4152 4156 _old_set.remove(retained_region);
4153 4157 bool during_im = g1_policy()->during_initial_mark_pause();
4154 4158 retained_region->note_start_of_copying(during_im);
4155 4159 _old_gc_alloc_region.set(retained_region);
4156 4160 _hr_printer.reuse(retained_region);
4157 4161 }
4158 4162 }
4159 4163
4160 4164 void G1CollectedHeap::release_gc_alloc_regions() {
4161 4165 _survivor_gc_alloc_region.release();
4162 4166 // If we have an old GC alloc region to release, we'll save it in
4163 4167 // _retained_old_gc_alloc_region. If we don't
4164 4168 // _retained_old_gc_alloc_region will become NULL. This is what we
4165 4169 // want either way so no reason to check explicitly for either
4166 4170 // condition.
4167 4171 _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
4168 4172 }
4169 4173
4170 4174 void G1CollectedHeap::abandon_gc_alloc_regions() {
4171 4175 assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition");
4172 4176 assert(_old_gc_alloc_region.get() == NULL, "pre-condition");
4173 4177 _retained_old_gc_alloc_region = NULL;
4174 4178 }
4175 4179
4176 4180 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4177 4181 _drain_in_progress = false;
4178 4182 set_evac_failure_closure(cl);
4179 4183 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
4180 4184 }
4181 4185
4182 4186 void G1CollectedHeap::finalize_for_evac_failure() {
4183 4187 assert(_evac_failure_scan_stack != NULL &&
4184 4188 _evac_failure_scan_stack->length() == 0,
4185 4189 "Postcondition");
4186 4190 assert(!_drain_in_progress, "Postcondition");
4187 4191 delete _evac_failure_scan_stack;
4188 4192 _evac_failure_scan_stack = NULL;
4189 4193 }
4190 4194
4191 4195 void G1CollectedHeap::remove_self_forwarding_pointers() {
4192 4196 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
4193 4197
4194 4198 G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
4195 4199
4196 4200 if (G1CollectedHeap::use_parallel_gc_threads()) {
4197 4201 set_par_threads();
4198 4202 workers()->run_task(&rsfp_task);
4199 4203 set_par_threads(0);
4200 4204 } else {
4201 4205 rsfp_task.work(0);
4202 4206 }
4203 4207
4204 4208 assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity");
4205 4209
4206 4210 // Reset the claim values in the regions in the collection set.
4207 4211 reset_cset_heap_region_claim_values();
4208 4212
4209 4213 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
4210 4214
4211 4215 // Now restore saved marks, if any.
4212 4216 if (_objs_with_preserved_marks != NULL) {
4213 4217 assert(_preserved_marks_of_objs != NULL, "Both or none.");
4214 4218 guarantee(_objs_with_preserved_marks->length() ==
4215 4219 _preserved_marks_of_objs->length(), "Both or none.");
4216 4220 for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
4217 4221 oop obj = _objs_with_preserved_marks->at(i);
4218 4222 markOop m = _preserved_marks_of_objs->at(i);
4219 4223 obj->set_mark(m);
4220 4224 }
4221 4225
4222 4226 // Delete the preserved marks growable arrays (allocated on the C heap).
4223 4227 delete _objs_with_preserved_marks;
4224 4228 delete _preserved_marks_of_objs;
4225 4229 _objs_with_preserved_marks = NULL;
4226 4230 _preserved_marks_of_objs = NULL;
4227 4231 }
4228 4232 }
4229 4233
4230 4234 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4231 4235 _evac_failure_scan_stack->push(obj);
4232 4236 }
4233 4237
4234 4238 void G1CollectedHeap::drain_evac_failure_scan_stack() {
4235 4239 assert(_evac_failure_scan_stack != NULL, "precondition");
4236 4240
4237 4241 while (_evac_failure_scan_stack->length() > 0) {
4238 4242 oop obj = _evac_failure_scan_stack->pop();
4239 4243 _evac_failure_closure->set_region(heap_region_containing(obj));
4240 4244 obj->oop_iterate_backwards(_evac_failure_closure);
4241 4245 }
4242 4246 }
4243 4247
4244 4248 oop
4245 4249 G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl,
4246 4250 oop old) {
4247 4251 assert(obj_in_cs(old),
4248 4252 err_msg("obj: "PTR_FORMAT" should still be in the CSet",
4249 4253 (HeapWord*) old));
4250 4254 markOop m = old->mark();
4251 4255 oop forward_ptr = old->forward_to_atomic(old);
4252 4256 if (forward_ptr == NULL) {
4253 4257 // Forward-to-self succeeded.
4254 4258
4255 4259 if (_evac_failure_closure != cl) {
4256 4260 MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4257 4261 assert(!_drain_in_progress,
4258 4262 "Should only be true while someone holds the lock.");
4259 4263 // Set the global evac-failure closure to the current thread's.
4260 4264 assert(_evac_failure_closure == NULL, "Or locking has failed.");
4261 4265 set_evac_failure_closure(cl);
4262 4266 // Now do the common part.
4263 4267 handle_evacuation_failure_common(old, m);
4264 4268 // Reset to NULL.
4265 4269 set_evac_failure_closure(NULL);
4266 4270 } else {
4267 4271 // The lock is already held, and this is recursive.
4268 4272 assert(_drain_in_progress, "This should only be the recursive case.");
4269 4273 handle_evacuation_failure_common(old, m);
4270 4274 }
4271 4275 return old;
4272 4276 } else {
4273 4277 // Forward-to-self failed. Either someone else managed to allocate
4274 4278 // space for this object (old != forward_ptr) or they beat us in
4275 4279 // self-forwarding it (old == forward_ptr).
4276 4280 assert(old == forward_ptr || !obj_in_cs(forward_ptr),
4277 4281 err_msg("obj: "PTR_FORMAT" forwarded to: "PTR_FORMAT" "
4278 4282 "should not be in the CSet",
4279 4283 (HeapWord*) old, (HeapWord*) forward_ptr));
4280 4284 return forward_ptr;
4281 4285 }
4282 4286 }
4283 4287
4284 4288 void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4285 4289 set_evacuation_failed(true);
4286 4290
4287 4291 preserve_mark_if_necessary(old, m);
4288 4292
4289 4293 HeapRegion* r = heap_region_containing(old);
4290 4294 if (!r->evacuation_failed()) {
4291 4295 r->set_evacuation_failed(true);
4292 4296 _hr_printer.evac_failure(r);
4293 4297 }
4294 4298
4295 4299 push_on_evac_failure_scan_stack(old);
4296 4300
4297 4301 if (!_drain_in_progress) {
4298 4302 // prevent recursion in copy_to_survivor_space()
4299 4303 _drain_in_progress = true;
4300 4304 drain_evac_failure_scan_stack();
4301 4305 _drain_in_progress = false;
4302 4306 }
4303 4307 }
4304 4308
4305 4309 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
4306 4310 assert(evacuation_failed(), "Oversaving!");
4307 4311 // We want to call the "for_promotion_failure" version only in the
4308 4312 // case of a promotion failure.
4309 4313 if (m->must_be_preserved_for_promotion_failure(obj)) {
4310 4314 if (_objs_with_preserved_marks == NULL) {
4311 4315 assert(_preserved_marks_of_objs == NULL, "Both or none.");
4312 4316 _objs_with_preserved_marks =
4313 4317 new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
4314 4318 _preserved_marks_of_objs =
4315 4319 new (ResourceObj::C_HEAP, mtGC) GrowableArray<markOop>(40, true);
4316 4320 }
4317 4321 _objs_with_preserved_marks->push(obj);
4318 4322 _preserved_marks_of_objs->push(m);
4319 4323 }
4320 4324 }
4321 4325
4322 4326 HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4323 4327 size_t word_size) {
4324 4328 if (purpose == GCAllocForSurvived) {
4325 4329 HeapWord* result = survivor_attempt_allocation(word_size);
4326 4330 if (result != NULL) {
4327 4331 return result;
4328 4332 } else {
4329 4333 // Let's try to allocate in the old gen in case we can fit the
4330 4334 // object there.
4331 4335 return old_attempt_allocation(word_size);
4332 4336 }
4333 4337 } else {
4334 4338 assert(purpose == GCAllocForTenured, "sanity");
4335 4339 HeapWord* result = old_attempt_allocation(word_size);
4336 4340 if (result != NULL) {
4337 4341 return result;
4338 4342 } else {
4339 4343 // Let's try to allocate in the survivors in case we can fit the
4340 4344 // object there.
4341 4345 return survivor_attempt_allocation(word_size);
4342 4346 }
4343 4347 }
4344 4348
4345 4349 ShouldNotReachHere();
4346 4350 // Trying to keep some compilers happy.
4347 4351 return NULL;
4348 4352 }
4349 4353
4350 4354 G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) :
4351 4355 ParGCAllocBuffer(gclab_word_size), _retired(false) { }
4352 4356
4353 4357 G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num)
4354 4358 : _g1h(g1h),
4355 4359 _refs(g1h->task_queue(queue_num)),
4356 4360 _dcq(&g1h->dirty_card_queue_set()),
4357 4361 _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
4358 4362 _g1_rem(g1h->g1_rem_set()),
4359 4363 _hash_seed(17), _queue_num(queue_num),
4360 4364 _term_attempts(0),
4361 4365 _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
4362 4366 _tenured_alloc_buffer(g1h->desired_plab_sz(GCAllocForTenured)),
4363 4367 _age_table(false),
4364 4368 _strong_roots_time(0), _term_time(0),
4365 4369 _alloc_buffer_waste(0), _undo_waste(0) {
4366 4370 // we allocate G1YoungSurvRateNumRegions plus one entries, since
4367 4371 // we "sacrifice" entry 0 to keep track of surviving bytes for
4368 4372 // non-young regions (where the age is -1)
4369 4373 // We also add a few elements at the beginning and at the end in
4370 4374 // an attempt to eliminate cache contention
4371 4375 uint real_length = 1 + _g1h->g1_policy()->young_cset_region_length();
4372 4376 uint array_length = PADDING_ELEM_NUM +
4373 4377 real_length +
4374 4378 PADDING_ELEM_NUM;
4375 4379 _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC);
4376 4380 if (_surviving_young_words_base == NULL)
4377 4381 vm_exit_out_of_memory(array_length * sizeof(size_t),
4378 4382 "Not enough space for young surv histo.");
4379 4383 _surviving_young_words = _surviving_young_words_base + PADDING_ELEM_NUM;
4380 4384 memset(_surviving_young_words, 0, (size_t) real_length * sizeof(size_t));
4381 4385
4382 4386 _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
4383 4387 _alloc_buffers[GCAllocForTenured] = &_tenured_alloc_buffer;
4384 4388
4385 4389 _start = os::elapsedTime();
4386 4390 }
4387 4391
4388 4392 void
4389 4393 G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
4390 4394 {
4391 4395 st->print_raw_cr("GC Termination Stats");
4392 4396 st->print_raw_cr(" elapsed --strong roots-- -------termination-------"
4393 4397 " ------waste (KiB)------");
4394 4398 st->print_raw_cr("thr ms ms % ms % attempts"
4395 4399 " total alloc undo");
4396 4400 st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
4397 4401 " ------- ------- -------");
4398 4402 }
4399 4403
4400 4404 void
4401 4405 G1ParScanThreadState::print_termination_stats(int i,
4402 4406 outputStream* const st) const
4403 4407 {
4404 4408 const double elapsed_ms = elapsed_time() * 1000.0;
4405 4409 const double s_roots_ms = strong_roots_time() * 1000.0;
4406 4410 const double term_ms = term_time() * 1000.0;
4407 4411 st->print_cr("%3d %9.2f %9.2f %6.2f "
4408 4412 "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
4409 4413 SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
4410 4414 i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
4411 4415 term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
4412 4416 (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
4413 4417 alloc_buffer_waste() * HeapWordSize / K,
4414 4418 undo_waste() * HeapWordSize / K);
4415 4419 }
4416 4420
4417 4421 #ifdef ASSERT
4418 4422 bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
4419 4423 assert(ref != NULL, "invariant");
4420 4424 assert(UseCompressedOops, "sanity");
4421 4425 assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
4422 4426 oop p = oopDesc::load_decode_heap_oop(ref);
4423 4427 assert(_g1h->is_in_g1_reserved(p),
4424 4428 err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
4425 4429 return true;
4426 4430 }
4427 4431
4428 4432 bool G1ParScanThreadState::verify_ref(oop* ref) const {
4429 4433 assert(ref != NULL, "invariant");
4430 4434 if (has_partial_array_mask(ref)) {
4431 4435 // Must be in the collection set--it's already been copied.
4432 4436 oop p = clear_partial_array_mask(ref);
4433 4437 assert(_g1h->obj_in_cs(p),
4434 4438 err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
4435 4439 } else {
4436 4440 oop p = oopDesc::load_decode_heap_oop(ref);
4437 4441 assert(_g1h->is_in_g1_reserved(p),
4438 4442 err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
4439 4443 }
4440 4444 return true;
4441 4445 }
4442 4446
4443 4447 bool G1ParScanThreadState::verify_task(StarTask ref) const {
4444 4448 if (ref.is_narrow()) {
4445 4449 return verify_ref((narrowOop*) ref);
4446 4450 } else {
4447 4451 return verify_ref((oop*) ref);
4448 4452 }
4449 4453 }
4450 4454 #endif // ASSERT
4451 4455
4452 4456 void G1ParScanThreadState::trim_queue() {
4453 4457 assert(_evac_cl != NULL, "not set");
4454 4458 assert(_evac_failure_cl != NULL, "not set");
4455 4459 assert(_partial_scan_cl != NULL, "not set");
4456 4460
4457 4461 StarTask ref;
4458 4462 do {
4459 4463 // Drain the overflow stack first, so other threads can steal.
4460 4464 while (refs()->pop_overflow(ref)) {
4461 4465 deal_with_reference(ref);
4462 4466 }
4463 4467
4464 4468 while (refs()->pop_local(ref)) {
4465 4469 deal_with_reference(ref);
4466 4470 }
4467 4471 } while (!refs()->is_empty());
4468 4472 }
4469 4473
4470 4474 G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1,
4471 4475 G1ParScanThreadState* par_scan_state) :
4472 4476 _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()),
4473 4477 _par_scan_state(par_scan_state),
4474 4478 _worker_id(par_scan_state->queue_num()),
4475 4479 _during_initial_mark(_g1->g1_policy()->during_initial_mark_pause()),
4476 4480 _mark_in_progress(_g1->mark_in_progress()) { }
4477 4481
4478 4482 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
4479 4483 void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>::mark_object(oop obj) {
4480 4484 #ifdef ASSERT
4481 4485 HeapRegion* hr = _g1->heap_region_containing(obj);
4482 4486 assert(hr != NULL, "sanity");
4483 4487 assert(!hr->in_collection_set(), "should not mark objects in the CSet");
4484 4488 #endif // ASSERT
4485 4489
4486 4490 // We know that the object is not moving so it's safe to read its size.
4487 4491 _cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
4488 4492 }
4489 4493
4490 4494 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
4491 4495 void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
4492 4496 ::mark_forwarded_object(oop from_obj, oop to_obj) {
4493 4497 #ifdef ASSERT
4494 4498 assert(from_obj->is_forwarded(), "from obj should be forwarded");
4495 4499 assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee");
4496 4500 assert(from_obj != to_obj, "should not be self-forwarded");
4497 4501
4498 4502 HeapRegion* from_hr = _g1->heap_region_containing(from_obj);
4499 4503 assert(from_hr != NULL, "sanity");
4500 4504 assert(from_hr->in_collection_set(), "from obj should be in the CSet");
4501 4505
4502 4506 HeapRegion* to_hr = _g1->heap_region_containing(to_obj);
4503 4507 assert(to_hr != NULL, "sanity");
4504 4508 assert(!to_hr->in_collection_set(), "should not mark objects in the CSet");
4505 4509 #endif // ASSERT
4506 4510
4507 4511 // The object might be in the process of being copied by another
4508 4512 // worker so we cannot trust that its to-space image is
4509 4513 // well-formed. So we have to read its size from its from-space
4510 4514 // image which we know should not be changing.
4511 4515 _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id);
4512 4516 }
4513 4517
4514 4518 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
4515 4519 oop G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
4516 4520 ::copy_to_survivor_space(oop old) {
4517 4521 size_t word_sz = old->size();
4518 4522 HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4519 4523 // +1 to make the -1 indexes valid...
4520 4524 int young_index = from_region->young_index_in_cset()+1;
4521 4525 assert( (from_region->is_young() && young_index > 0) ||
4522 4526 (!from_region->is_young() && young_index == 0), "invariant" );
4523 4527 G1CollectorPolicy* g1p = _g1->g1_policy();
4524 4528 markOop m = old->mark();
4525 4529 int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4526 4530 : m->age();
4527 4531 GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
4528 4532 word_sz);
4529 4533 HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
4530 4534 oop obj = oop(obj_ptr);
4531 4535
4532 4536 if (obj_ptr == NULL) {
4533 4537 // This will either forward-to-self, or detect that someone else has
4534 4538 // installed a forwarding pointer.
4535 4539 OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
4536 4540 return _g1->handle_evacuation_failure_par(cl, old);
4537 4541 }
4538 4542
4539 4543 // We're going to allocate linearly, so might as well prefetch ahead.
4540 4544 Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
4541 4545
4542 4546 oop forward_ptr = old->forward_to_atomic(obj);
4543 4547 if (forward_ptr == NULL) {
4544 4548 Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
4545 4549 if (g1p->track_object_age(alloc_purpose)) {
4546 4550 // We could simply do obj->incr_age(). However, this causes a
4547 4551 // performance issue. obj->incr_age() will first check whether
4548 4552 // the object has a displaced mark by checking its mark word;
4549 4553 // getting the mark word from the new location of the object
4550 4554 // stalls. So, given that we already have the mark word and we
4551 4555 // are about to install it anyway, it's better to increase the
4552 4556 // age on the mark word, when the object does not have a
4553 4557 // displaced mark word. We're not expecting many objects to have
4554 4558 // a displaced marked word, so that case is not optimized
4555 4559 // further (it could be...) and we simply call obj->incr_age().
4556 4560
4557 4561 if (m->has_displaced_mark_helper()) {
4558 4562 // in this case, we have to install the mark word first,
4559 4563 // otherwise obj looks to be forwarded (the old mark word,
4560 4564 // which contains the forward pointer, was copied)
4561 4565 obj->set_mark(m);
4562 4566 obj->incr_age();
4563 4567 } else {
4564 4568 m = m->incr_age();
4565 4569 obj->set_mark(m);
4566 4570 }
4567 4571 _par_scan_state->age_table()->add(obj, word_sz);
4568 4572 } else {
4569 4573 obj->set_mark(m);
4570 4574 }
4571 4575
4572 4576 size_t* surv_young_words = _par_scan_state->surviving_young_words();
4573 4577 surv_young_words[young_index] += word_sz;
4574 4578
4575 4579 if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
4576 4580 // We keep track of the next start index in the length field of
4577 4581 // the to-space object. The actual length can be found in the
4578 4582 // length field of the from-space object.
4579 4583 arrayOop(obj)->set_length(0);
4580 4584 oop* old_p = set_partial_array_mask(old);
4581 4585 _par_scan_state->push_on_queue(old_p);
4582 4586 } else {
4583 4587 // No point in using the slower heap_region_containing() method,
4584 4588 // given that we know obj is in the heap.
4585 4589 _scanner.set_region(_g1->heap_region_containing_raw(obj));
4586 4590 obj->oop_iterate_backwards(&_scanner);
4587 4591 }
4588 4592 } else {
4589 4593 _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4590 4594 obj = forward_ptr;
4591 4595 }
4592 4596 return obj;
4593 4597 }
4594 4598
4595 4599 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
4596 4600 template <class T>
4597 4601 void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
4598 4602 ::do_oop_work(T* p) {
4599 4603 oop obj = oopDesc::load_decode_heap_oop(p);
4600 4604 assert(barrier != G1BarrierRS || obj != NULL,
4601 4605 "Precondition: G1BarrierRS implies obj is non-NULL");
4602 4606
4603 4607 assert(_worker_id == _par_scan_state->queue_num(), "sanity");
4604 4608
4605 4609 // here the null check is implicit in the cset_fast_test() test
4606 4610 if (_g1->in_cset_fast_test(obj)) {
4607 4611 oop forwardee;
4608 4612 if (obj->is_forwarded()) {
4609 4613 forwardee = obj->forwardee();
4610 4614 } else {
4611 4615 forwardee = copy_to_survivor_space(obj);
4612 4616 }
4613 4617 assert(forwardee != NULL, "forwardee should not be NULL");
4614 4618 oopDesc::encode_store_heap_oop(p, forwardee);
4615 4619 if (do_mark_object && forwardee != obj) {
4616 4620 // If the object is self-forwarded we don't need to explicitly
4617 4621 // mark it, the evacuation failure protocol will do so.
4618 4622 mark_forwarded_object(obj, forwardee);
4619 4623 }
4620 4624
4621 4625 // When scanning the RS, we only care about objs in CS.
4622 4626 if (barrier == G1BarrierRS) {
4623 4627 _par_scan_state->update_rs(_from, p, _worker_id);
4624 4628 }
4625 4629 } else {
4626 4630 // The object is not in collection set. If we're a root scanning
4627 4631 // closure during an initial mark pause (i.e. do_mark_object will
4628 4632 // be true) then attempt to mark the object.
4629 4633 if (do_mark_object && _g1->is_in_g1_reserved(obj)) {
4630 4634 mark_object(obj);
4631 4635 }
4632 4636 }
4633 4637
4634 4638 if (barrier == G1BarrierEvac && obj != NULL) {
4635 4639 _par_scan_state->update_rs(_from, p, _worker_id);
4636 4640 }
4637 4641
4638 4642 if (do_gen_barrier && obj != NULL) {
4639 4643 par_do_barrier(p);
4640 4644 }
4641 4645 }
4642 4646
4643 4647 template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
4644 4648 template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(narrowOop* p);
4645 4649
4646 4650 template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
4647 4651 assert(has_partial_array_mask(p), "invariant");
4648 4652 oop from_obj = clear_partial_array_mask(p);
4649 4653
4650 4654 assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap.");
4651 4655 assert(from_obj->is_objArray(), "must be obj array");
4652 4656 objArrayOop from_obj_array = objArrayOop(from_obj);
4653 4657 // The from-space object contains the real length.
4654 4658 int length = from_obj_array->length();
4655 4659
4656 4660 assert(from_obj->is_forwarded(), "must be forwarded");
4657 4661 oop to_obj = from_obj->forwardee();
4658 4662 assert(from_obj != to_obj, "should not be chunking self-forwarded objects");
4659 4663 objArrayOop to_obj_array = objArrayOop(to_obj);
4660 4664 // We keep track of the next start index in the length field of the
4661 4665 // to-space object.
4662 4666 int next_index = to_obj_array->length();
4663 4667 assert(0 <= next_index && next_index < length,
4664 4668 err_msg("invariant, next index: %d, length: %d", next_index, length));
4665 4669
4666 4670 int start = next_index;
4667 4671 int end = length;
4668 4672 int remainder = end - start;
4669 4673 // We'll try not to push a range that's smaller than ParGCArrayScanChunk.
4670 4674 if (remainder > 2 * ParGCArrayScanChunk) {
4671 4675 end = start + ParGCArrayScanChunk;
4672 4676 to_obj_array->set_length(end);
4673 4677 // Push the remainder before we process the range in case another
4674 4678 // worker has run out of things to do and can steal it.
4675 4679 oop* from_obj_p = set_partial_array_mask(from_obj);
4676 4680 _par_scan_state->push_on_queue(from_obj_p);
4677 4681 } else {
4678 4682 assert(length == end, "sanity");
4679 4683 // We'll process the final range for this object. Restore the length
4680 4684 // so that the heap remains parsable in case of evacuation failure.
4681 4685 to_obj_array->set_length(end);
4682 4686 }
4683 4687 _scanner.set_region(_g1->heap_region_containing_raw(to_obj));
4684 4688 // Process indexes [start,end). It will also process the header
4685 4689 // along with the first chunk (i.e., the chunk with start == 0).
4686 4690 // Note that at this point the length field of to_obj_array is not
4687 4691 // correct given that we are using it to keep track of the next
4688 4692 // start index. oop_iterate_range() (thankfully!) ignores the length
4689 4693 // field and only relies on the start / end parameters. It does
4690 4694 // however return the size of the object which will be incorrect. So
4691 4695 // we have to ignore it even if we wanted to use it.
4692 4696 to_obj_array->oop_iterate_range(&_scanner, start, end);
4693 4697 }
4694 4698
4695 4699 class G1ParEvacuateFollowersClosure : public VoidClosure {
4696 4700 protected:
4697 4701 G1CollectedHeap* _g1h;
4698 4702 G1ParScanThreadState* _par_scan_state;
4699 4703 RefToScanQueueSet* _queues;
4700 4704 ParallelTaskTerminator* _terminator;
4701 4705
4702 4706 G1ParScanThreadState* par_scan_state() { return _par_scan_state; }
4703 4707 RefToScanQueueSet* queues() { return _queues; }
4704 4708 ParallelTaskTerminator* terminator() { return _terminator; }
4705 4709
4706 4710 public:
4707 4711 G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4708 4712 G1ParScanThreadState* par_scan_state,
4709 4713 RefToScanQueueSet* queues,
4710 4714 ParallelTaskTerminator* terminator)
4711 4715 : _g1h(g1h), _par_scan_state(par_scan_state),
4712 4716 _queues(queues), _terminator(terminator) {}
4713 4717
4714 4718 void do_void();
4715 4719
4716 4720 private:
4717 4721 inline bool offer_termination();
4718 4722 };
4719 4723
4720 4724 bool G1ParEvacuateFollowersClosure::offer_termination() {
4721 4725 G1ParScanThreadState* const pss = par_scan_state();
4722 4726 pss->start_term_time();
4723 4727 const bool res = terminator()->offer_termination();
4724 4728 pss->end_term_time();
4725 4729 return res;
4726 4730 }
4727 4731
4728 4732 void G1ParEvacuateFollowersClosure::do_void() {
4729 4733 StarTask stolen_task;
4730 4734 G1ParScanThreadState* const pss = par_scan_state();
4731 4735 pss->trim_queue();
4732 4736
4733 4737 do {
4734 4738 while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
4735 4739 assert(pss->verify_task(stolen_task), "sanity");
4736 4740 if (stolen_task.is_narrow()) {
4737 4741 pss->deal_with_reference((narrowOop*) stolen_task);
4738 4742 } else {
4739 4743 pss->deal_with_reference((oop*) stolen_task);
4740 4744 }
4741 4745
4742 4746 // We've just processed a reference and we might have made
4743 4747 // available new entries on the queues. So we have to make sure
4744 4748 // we drain the queues as necessary.
4745 4749 pss->trim_queue();
4746 4750 }
4747 4751 } while (!offer_termination());
4748 4752
4749 4753 pss->retire_alloc_buffers();
4750 4754 }
4751 4755
4752 4756 class G1ParTask : public AbstractGangTask {
4753 4757 protected:
4754 4758 G1CollectedHeap* _g1h;
4755 4759 RefToScanQueueSet *_queues;
4756 4760 ParallelTaskTerminator _terminator;
4757 4761 uint _n_workers;
4758 4762
4759 4763 Mutex _stats_lock;
4760 4764 Mutex* stats_lock() { return &_stats_lock; }
4761 4765
4762 4766 size_t getNCards() {
4763 4767 return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4764 4768 / G1BlockOffsetSharedArray::N_bytes;
4765 4769 }
4766 4770
4767 4771 public:
4768 4772 G1ParTask(G1CollectedHeap* g1h,
4769 4773 RefToScanQueueSet *task_queues)
4770 4774 : AbstractGangTask("G1 collection"),
4771 4775 _g1h(g1h),
4772 4776 _queues(task_queues),
4773 4777 _terminator(0, _queues),
4774 4778 _stats_lock(Mutex::leaf, "parallel G1 stats lock", true)
4775 4779 {}
4776 4780
4777 4781 RefToScanQueueSet* queues() { return _queues; }
4778 4782
4779 4783 RefToScanQueue *work_queue(int i) {
4780 4784 return queues()->queue(i);
4781 4785 }
4782 4786
4783 4787 ParallelTaskTerminator* terminator() { return &_terminator; }
4784 4788
4785 4789 virtual void set_for_termination(int active_workers) {
4786 4790 // This task calls set_n_termination() in par_non_clean_card_iterate_work()
4787 4791 // in the young space (_par_seq_tasks) in the G1 heap
4788 4792 // for SequentialSubTasksDone.
4789 4793 // This task also uses SubTasksDone in SharedHeap and G1CollectedHeap
4790 4794 // both of which need setting by set_n_termination().
4791 4795 _g1h->SharedHeap::set_n_termination(active_workers);
4792 4796 _g1h->set_n_termination(active_workers);
4793 4797 terminator()->reset_for_reuse(active_workers);
4794 4798 _n_workers = active_workers;
4795 4799 }
4796 4800
4797 4801 void work(uint worker_id) {
4798 4802 if (worker_id >= _n_workers) return; // no work needed this round
4799 4803
4800 4804 double start_time_ms = os::elapsedTime() * 1000.0;
4801 4805 _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms);
4802 4806
4803 4807 {
4804 4808 ResourceMark rm;
4805 4809 HandleMark hm;
4806 4810
4807 4811 ReferenceProcessor* rp = _g1h->ref_processor_stw();
4808 4812
4809 4813 G1ParScanThreadState pss(_g1h, worker_id);
4810 4814 G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, rp);
4811 4815 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp);
4812 4816 G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, rp);
4813 4817
4814 4818 pss.set_evac_closure(&scan_evac_cl);
4815 4819 pss.set_evac_failure_closure(&evac_failure_cl);
4816 4820 pss.set_partial_scan_closure(&partial_scan_cl);
4817 4821
4818 4822 G1ParScanExtRootClosure only_scan_root_cl(_g1h, &pss, rp);
4819 4823 G1ParScanPermClosure only_scan_perm_cl(_g1h, &pss, rp);
4820 4824
4821 4825 G1ParScanAndMarkExtRootClosure scan_mark_root_cl(_g1h, &pss, rp);
4822 4826 G1ParScanAndMarkPermClosure scan_mark_perm_cl(_g1h, &pss, rp);
4823 4827
4824 4828 OopClosure* scan_root_cl = &only_scan_root_cl;
4825 4829 OopsInHeapRegionClosure* scan_perm_cl = &only_scan_perm_cl;
4826 4830
4827 4831 if (_g1h->g1_policy()->during_initial_mark_pause()) {
4828 4832 // We also need to mark copied objects.
4829 4833 scan_root_cl = &scan_mark_root_cl;
4830 4834 scan_perm_cl = &scan_mark_perm_cl;
4831 4835 }
4832 4836
4833 4837 G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss);
4834 4838
4835 4839 pss.start_strong_roots();
4836 4840 _g1h->g1_process_strong_roots(/* not collecting perm */ false,
4837 4841 SharedHeap::SO_AllClasses,
4838 4842 scan_root_cl,
4839 4843 &push_heap_rs_cl,
4840 4844 scan_perm_cl,
4841 4845 worker_id);
4842 4846 pss.end_strong_roots();
4843 4847
4844 4848 {
4845 4849 double start = os::elapsedTime();
4846 4850 G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4847 4851 evac.do_void();
4848 4852 double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4849 4853 double term_ms = pss.term_time()*1000.0;
4850 4854 _g1h->g1_policy()->phase_times()->record_obj_copy_time(worker_id, elapsed_ms-term_ms);
4851 4855 _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts());
4852 4856 }
4853 4857 _g1h->g1_policy()->record_thread_age_table(pss.age_table());
4854 4858 _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
4855 4859
4856 4860 if (ParallelGCVerbose) {
4857 4861 MutexLocker x(stats_lock());
4858 4862 pss.print_termination_stats(worker_id);
4859 4863 }
4860 4864
4861 4865 assert(pss.refs()->is_empty(), "should be empty");
4862 4866
4863 4867 // Close the inner scope so that the ResourceMark and HandleMark
4864 4868 // destructors are executed here and are included as part of the
4865 4869 // "GC Worker Time".
4866 4870 }
4867 4871
4868 4872 double end_time_ms = os::elapsedTime() * 1000.0;
4869 4873 _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
4870 4874 }
4871 4875 };
4872 4876
4873 4877 // *** Common G1 Evacuation Stuff
4874 4878
4875 4879 // Closures that support the filtering of CodeBlobs scanned during
4876 4880 // external root scanning.
4877 4881
4878 4882 // Closure applied to reference fields in code blobs (specifically nmethods)
4879 4883 // to determine whether an nmethod contains references that point into
4880 4884 // the collection set. Used as a predicate when walking code roots so
4881 4885 // that only nmethods that point into the collection set are added to the
4882 4886 // 'marked' list.
4883 4887
4884 4888 class G1FilteredCodeBlobToOopClosure : public CodeBlobToOopClosure {
4885 4889
4886 4890 class G1PointsIntoCSOopClosure : public OopClosure {
4887 4891 G1CollectedHeap* _g1;
4888 4892 bool _points_into_cs;
4889 4893 public:
4890 4894 G1PointsIntoCSOopClosure(G1CollectedHeap* g1) :
4891 4895 _g1(g1), _points_into_cs(false) { }
4892 4896
4893 4897 bool points_into_cs() const { return _points_into_cs; }
4894 4898
4895 4899 template <class T>
4896 4900 void do_oop_nv(T* p) {
4897 4901 if (!_points_into_cs) {
4898 4902 T heap_oop = oopDesc::load_heap_oop(p);
4899 4903 if (!oopDesc::is_null(heap_oop) &&
4900 4904 _g1->in_cset_fast_test(oopDesc::decode_heap_oop_not_null(heap_oop))) {
4901 4905 _points_into_cs = true;
4902 4906 }
4903 4907 }
4904 4908 }
4905 4909
4906 4910 virtual void do_oop(oop* p) { do_oop_nv(p); }
4907 4911 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
4908 4912 };
4909 4913
4910 4914 G1CollectedHeap* _g1;
4911 4915
4912 4916 public:
4913 4917 G1FilteredCodeBlobToOopClosure(G1CollectedHeap* g1, OopClosure* cl) :
4914 4918 CodeBlobToOopClosure(cl, true), _g1(g1) { }
4915 4919
4916 4920 virtual void do_code_blob(CodeBlob* cb) {
4917 4921 nmethod* nm = cb->as_nmethod_or_null();
4918 4922 if (nm != NULL && !(nm->test_oops_do_mark())) {
4919 4923 G1PointsIntoCSOopClosure predicate_cl(_g1);
4920 4924 nm->oops_do(&predicate_cl);
4921 4925
4922 4926 if (predicate_cl.points_into_cs()) {
4923 4927 // At least one of the reference fields or the oop relocations
4924 4928 // in the nmethod points into the collection set. We have to
4925 4929 // 'mark' this nmethod.
4926 4930 // Note: Revisit the following if CodeBlobToOopClosure::do_code_blob()
4927 4931 // or MarkingCodeBlobClosure::do_code_blob() change.
4928 4932 if (!nm->test_set_oops_do_mark()) {
4929 4933 do_newly_marked_nmethod(nm);
4930 4934 }
4931 4935 }
4932 4936 }
4933 4937 }
4934 4938 };
4935 4939
4936 4940 // This method is run in a GC worker.
4937 4941
4938 4942 void
4939 4943 G1CollectedHeap::
4940 4944 g1_process_strong_roots(bool collecting_perm_gen,
4941 4945 ScanningOption so,
4942 4946 OopClosure* scan_non_heap_roots,
4943 4947 OopsInHeapRegionClosure* scan_rs,
4944 4948 OopsInGenClosure* scan_perm,
4945 4949 int worker_i) {
4946 4950
4947 4951 // First scan the strong roots, including the perm gen.
4948 4952 double ext_roots_start = os::elapsedTime();
4949 4953 double closure_app_time_sec = 0.0;
4950 4954
4951 4955 BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4952 4956 BufferingOopsInGenClosure buf_scan_perm(scan_perm);
4953 4957 buf_scan_perm.set_generation(perm_gen());
4954 4958
4955 4959 // Walk the code cache w/o buffering, because StarTask cannot handle
4956 4960 // unaligned oop locations.
4957 4961 G1FilteredCodeBlobToOopClosure eager_scan_code_roots(this, scan_non_heap_roots);
4958 4962
4959 4963 process_strong_roots(false, // no scoping; this is parallel code
4960 4964 collecting_perm_gen, so,
4961 4965 &buf_scan_non_heap_roots,
4962 4966 &eager_scan_code_roots,
4963 4967 &buf_scan_perm);
4964 4968
4965 4969 // Now the CM ref_processor roots.
4966 4970 if (!_process_strong_tasks->is_task_claimed(G1H_PS_refProcessor_oops_do)) {
4967 4971 // We need to treat the discovered reference lists of the
4968 4972 // concurrent mark ref processor as roots and keep entries
4969 4973 // (which are added by the marking threads) on them live
4970 4974 // until they can be processed at the end of marking.
4971 4975 ref_processor_cm()->weak_oops_do(&buf_scan_non_heap_roots);
4972 4976 }
4973 4977
4974 4978 // Finish up any enqueued closure apps (attributed as object copy time).
4975 4979 buf_scan_non_heap_roots.done();
4976 4980 buf_scan_perm.done();
4977 4981
4978 4982 double ext_roots_end = os::elapsedTime();
4979 4983
4980 4984 g1_policy()->phase_times()->reset_obj_copy_time(worker_i);
4981 4985 double obj_copy_time_sec = buf_scan_perm.closure_app_seconds() +
4982 4986 buf_scan_non_heap_roots.closure_app_seconds();
4983 4987 g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
4984 4988
4985 4989 double ext_root_time_ms =
4986 4990 ((ext_roots_end - ext_roots_start) - obj_copy_time_sec) * 1000.0;
4987 4991
4988 4992 g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
4989 4993
4990 4994 // During conc marking we have to filter the per-thread SATB buffers
4991 4995 // to make sure we remove any oops into the CSet (which will show up
4992 4996 // as implicitly live).
4993 4997 if (!_process_strong_tasks->is_task_claimed(G1H_PS_filter_satb_buffers)) {
4994 4998 if (mark_in_progress()) {
4995 4999 JavaThread::satb_mark_queue_set().filter_thread_buffers();
4996 5000 }
4997 5001 }
4998 5002 double satb_filtering_ms = (os::elapsedTime() - ext_roots_end) * 1000.0;
4999 5003 g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
5000 5004
5001 5005 // Now scan the complement of the collection set.
5002 5006 if (scan_rs != NULL) {
5003 5007 g1_rem_set()->oops_into_collection_set_do(scan_rs, worker_i);
5004 5008 }
5005 5009
5006 5010 _process_strong_tasks->all_tasks_completed();
5007 5011 }
5008 5012
5009 5013 void
5010 5014 G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure,
5011 5015 OopClosure* non_root_closure) {
5012 5016 CodeBlobToOopClosure roots_in_blobs(root_closure, /*do_marking=*/ false);
5013 5017 SharedHeap::process_weak_roots(root_closure, &roots_in_blobs, non_root_closure);
5014 5018 }
5015 5019
5016 5020 // Weak Reference Processing support
5017 5021
5018 5022 // An always "is_alive" closure that is used to preserve referents.
5019 5023 // If the object is non-null then it's alive. Used in the preservation
5020 5024 // of referent objects that are pointed to by reference objects
5021 5025 // discovered by the CM ref processor.
5022 5026 class G1AlwaysAliveClosure: public BoolObjectClosure {
5023 5027 G1CollectedHeap* _g1;
5024 5028 public:
5025 5029 G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
5026 5030 void do_object(oop p) { assert(false, "Do not call."); }
5027 5031 bool do_object_b(oop p) {
5028 5032 if (p != NULL) {
5029 5033 return true;
5030 5034 }
5031 5035 return false;
5032 5036 }
5033 5037 };
5034 5038
5035 5039 bool G1STWIsAliveClosure::do_object_b(oop p) {
5036 5040 // An object is reachable if it is outside the collection set,
5037 5041 // or is inside and copied.
5038 5042 return !_g1->obj_in_cs(p) || p->is_forwarded();
5039 5043 }
5040 5044
5041 5045 // Non Copying Keep Alive closure
5042 5046 class G1KeepAliveClosure: public OopClosure {
5043 5047 G1CollectedHeap* _g1;
5044 5048 public:
5045 5049 G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
5046 5050 void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
5047 5051 void do_oop( oop* p) {
5048 5052 oop obj = *p;
5049 5053
5050 5054 if (_g1->obj_in_cs(obj)) {
5051 5055 assert( obj->is_forwarded(), "invariant" );
5052 5056 *p = obj->forwardee();
5053 5057 }
5054 5058 }
5055 5059 };
5056 5060
5057 5061 // Copying Keep Alive closure - can be called from both
5058 5062 // serial and parallel code as long as different worker
5059 5063 // threads utilize different G1ParScanThreadState instances
5060 5064 // and different queues.
5061 5065
5062 5066 class G1CopyingKeepAliveClosure: public OopClosure {
5063 5067 G1CollectedHeap* _g1h;
5064 5068 OopClosure* _copy_non_heap_obj_cl;
5065 5069 OopsInHeapRegionClosure* _copy_perm_obj_cl;
5066 5070 G1ParScanThreadState* _par_scan_state;
5067 5071
5068 5072 public:
5069 5073 G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
5070 5074 OopClosure* non_heap_obj_cl,
5071 5075 OopsInHeapRegionClosure* perm_obj_cl,
5072 5076 G1ParScanThreadState* pss):
5073 5077 _g1h(g1h),
5074 5078 _copy_non_heap_obj_cl(non_heap_obj_cl),
5075 5079 _copy_perm_obj_cl(perm_obj_cl),
5076 5080 _par_scan_state(pss)
5077 5081 {}
5078 5082
5079 5083 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
5080 5084 virtual void do_oop( oop* p) { do_oop_work(p); }
5081 5085
5082 5086 template <class T> void do_oop_work(T* p) {
5083 5087 oop obj = oopDesc::load_decode_heap_oop(p);
5084 5088
5085 5089 if (_g1h->obj_in_cs(obj)) {
5086 5090 // If the referent object has been forwarded (either copied
5087 5091 // to a new location or to itself in the event of an
5088 5092 // evacuation failure) then we need to update the reference
5089 5093 // field and, if both reference and referent are in the G1
5090 5094 // heap, update the RSet for the referent.
5091 5095 //
5092 5096 // If the referent has not been forwarded then we have to keep
5093 5097 // it alive by policy. Therefore we have copy the referent.
5094 5098 //
5095 5099 // If the reference field is in the G1 heap then we can push
5096 5100 // on the PSS queue. When the queue is drained (after each
5097 5101 // phase of reference processing) the object and it's followers
5098 5102 // will be copied, the reference field set to point to the
5099 5103 // new location, and the RSet updated. Otherwise we need to
5100 5104 // use the the non-heap or perm closures directly to copy
5101 5105 // the refernt object and update the pointer, while avoiding
5102 5106 // updating the RSet.
5103 5107
5104 5108 if (_g1h->is_in_g1_reserved(p)) {
5105 5109 _par_scan_state->push_on_queue(p);
5106 5110 } else {
5107 5111 // The reference field is not in the G1 heap.
5108 5112 if (_g1h->perm_gen()->is_in(p)) {
5109 5113 _copy_perm_obj_cl->do_oop(p);
5110 5114 } else {
5111 5115 _copy_non_heap_obj_cl->do_oop(p);
5112 5116 }
5113 5117 }
5114 5118 }
5115 5119 }
5116 5120 };
5117 5121
5118 5122 // Serial drain queue closure. Called as the 'complete_gc'
5119 5123 // closure for each discovered list in some of the
5120 5124 // reference processing phases.
5121 5125
5122 5126 class G1STWDrainQueueClosure: public VoidClosure {
5123 5127 protected:
5124 5128 G1CollectedHeap* _g1h;
5125 5129 G1ParScanThreadState* _par_scan_state;
5126 5130
5127 5131 G1ParScanThreadState* par_scan_state() { return _par_scan_state; }
5128 5132
5129 5133 public:
5130 5134 G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) :
5131 5135 _g1h(g1h),
5132 5136 _par_scan_state(pss)
5133 5137 { }
5134 5138
5135 5139 void do_void() {
5136 5140 G1ParScanThreadState* const pss = par_scan_state();
5137 5141 pss->trim_queue();
5138 5142 }
5139 5143 };
5140 5144
5141 5145 // Parallel Reference Processing closures
5142 5146
5143 5147 // Implementation of AbstractRefProcTaskExecutor for parallel reference
5144 5148 // processing during G1 evacuation pauses.
5145 5149
5146 5150 class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
5147 5151 private:
5148 5152 G1CollectedHeap* _g1h;
5149 5153 RefToScanQueueSet* _queues;
5150 5154 FlexibleWorkGang* _workers;
5151 5155 int _active_workers;
5152 5156
5153 5157 public:
5154 5158 G1STWRefProcTaskExecutor(G1CollectedHeap* g1h,
5155 5159 FlexibleWorkGang* workers,
5156 5160 RefToScanQueueSet *task_queues,
5157 5161 int n_workers) :
5158 5162 _g1h(g1h),
5159 5163 _queues(task_queues),
5160 5164 _workers(workers),
5161 5165 _active_workers(n_workers)
5162 5166 {
5163 5167 assert(n_workers > 0, "shouldn't call this otherwise");
5164 5168 }
5165 5169
5166 5170 // Executes the given task using concurrent marking worker threads.
5167 5171 virtual void execute(ProcessTask& task);
5168 5172 virtual void execute(EnqueueTask& task);
5169 5173 };
5170 5174
5171 5175 // Gang task for possibly parallel reference processing
5172 5176
5173 5177 class G1STWRefProcTaskProxy: public AbstractGangTask {
5174 5178 typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
5175 5179 ProcessTask& _proc_task;
5176 5180 G1CollectedHeap* _g1h;
5177 5181 RefToScanQueueSet *_task_queues;
5178 5182 ParallelTaskTerminator* _terminator;
5179 5183
5180 5184 public:
5181 5185 G1STWRefProcTaskProxy(ProcessTask& proc_task,
5182 5186 G1CollectedHeap* g1h,
5183 5187 RefToScanQueueSet *task_queues,
5184 5188 ParallelTaskTerminator* terminator) :
5185 5189 AbstractGangTask("Process reference objects in parallel"),
5186 5190 _proc_task(proc_task),
5187 5191 _g1h(g1h),
5188 5192 _task_queues(task_queues),
5189 5193 _terminator(terminator)
5190 5194 {}
5191 5195
5192 5196 virtual void work(uint worker_id) {
5193 5197 // The reference processing task executed by a single worker.
5194 5198 ResourceMark rm;
5195 5199 HandleMark hm;
5196 5200
5197 5201 G1STWIsAliveClosure is_alive(_g1h);
5198 5202
5199 5203 G1ParScanThreadState pss(_g1h, worker_id);
5200 5204
5201 5205 G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, NULL);
5202 5206 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
5203 5207 G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, NULL);
5204 5208
5205 5209 pss.set_evac_closure(&scan_evac_cl);
5206 5210 pss.set_evac_failure_closure(&evac_failure_cl);
5207 5211 pss.set_partial_scan_closure(&partial_scan_cl);
5208 5212
5209 5213 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
5210 5214 G1ParScanPermClosure only_copy_perm_cl(_g1h, &pss, NULL);
5211 5215
5212 5216 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
5213 5217 G1ParScanAndMarkPermClosure copy_mark_perm_cl(_g1h, &pss, NULL);
5214 5218
5215 5219 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
5216 5220 OopsInHeapRegionClosure* copy_perm_cl = &only_copy_perm_cl;
5217 5221
5218 5222 if (_g1h->g1_policy()->during_initial_mark_pause()) {
5219 5223 // We also need to mark copied objects.
5220 5224 copy_non_heap_cl = ©_mark_non_heap_cl;
5221 5225 copy_perm_cl = ©_mark_perm_cl;
5222 5226 }
5223 5227
5224 5228 // Keep alive closure.
5225 5229 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_perm_cl, &pss);
5226 5230
5227 5231 // Complete GC closure
5228 5232 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
5229 5233
5230 5234 // Call the reference processing task's work routine.
5231 5235 _proc_task.work(worker_id, is_alive, keep_alive, drain_queue);
5232 5236
5233 5237 // Note we cannot assert that the refs array is empty here as not all
5234 5238 // of the processing tasks (specifically phase2 - pp2_work) execute
5235 5239 // the complete_gc closure (which ordinarily would drain the queue) so
5236 5240 // the queue may not be empty.
5237 5241 }
5238 5242 };
5239 5243
5240 5244 // Driver routine for parallel reference processing.
5241 5245 // Creates an instance of the ref processing gang
5242 5246 // task and has the worker threads execute it.
5243 5247 void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) {
5244 5248 assert(_workers != NULL, "Need parallel worker threads.");
5245 5249
5246 5250 ParallelTaskTerminator terminator(_active_workers, _queues);
5247 5251 G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator);
5248 5252
5249 5253 _g1h->set_par_threads(_active_workers);
5250 5254 _workers->run_task(&proc_task_proxy);
5251 5255 _g1h->set_par_threads(0);
5252 5256 }
5253 5257
5254 5258 // Gang task for parallel reference enqueueing.
5255 5259
5256 5260 class G1STWRefEnqueueTaskProxy: public AbstractGangTask {
5257 5261 typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
5258 5262 EnqueueTask& _enq_task;
5259 5263
5260 5264 public:
5261 5265 G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) :
5262 5266 AbstractGangTask("Enqueue reference objects in parallel"),
5263 5267 _enq_task(enq_task)
5264 5268 { }
5265 5269
5266 5270 virtual void work(uint worker_id) {
5267 5271 _enq_task.work(worker_id);
5268 5272 }
5269 5273 };
5270 5274
5271 5275 // Driver routine for parallel reference enqueing.
5272 5276 // Creates an instance of the ref enqueueing gang
5273 5277 // task and has the worker threads execute it.
5274 5278
5275 5279 void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) {
5276 5280 assert(_workers != NULL, "Need parallel worker threads.");
5277 5281
5278 5282 G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task);
5279 5283
5280 5284 _g1h->set_par_threads(_active_workers);
5281 5285 _workers->run_task(&enq_task_proxy);
5282 5286 _g1h->set_par_threads(0);
5283 5287 }
5284 5288
5285 5289 // End of weak reference support closures
5286 5290
5287 5291 // Abstract task used to preserve (i.e. copy) any referent objects
5288 5292 // that are in the collection set and are pointed to by reference
5289 5293 // objects discovered by the CM ref processor.
5290 5294
5291 5295 class G1ParPreserveCMReferentsTask: public AbstractGangTask {
5292 5296 protected:
5293 5297 G1CollectedHeap* _g1h;
5294 5298 RefToScanQueueSet *_queues;
5295 5299 ParallelTaskTerminator _terminator;
5296 5300 uint _n_workers;
5297 5301
5298 5302 public:
5299 5303 G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) :
5300 5304 AbstractGangTask("ParPreserveCMReferents"),
5301 5305 _g1h(g1h),
5302 5306 _queues(task_queues),
5303 5307 _terminator(workers, _queues),
5304 5308 _n_workers(workers)
5305 5309 { }
5306 5310
5307 5311 void work(uint worker_id) {
5308 5312 ResourceMark rm;
5309 5313 HandleMark hm;
5310 5314
5311 5315 G1ParScanThreadState pss(_g1h, worker_id);
5312 5316 G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, NULL);
5313 5317 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
5314 5318 G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, NULL);
5315 5319
5316 5320 pss.set_evac_closure(&scan_evac_cl);
5317 5321 pss.set_evac_failure_closure(&evac_failure_cl);
5318 5322 pss.set_partial_scan_closure(&partial_scan_cl);
5319 5323
5320 5324 assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
5321 5325
5322 5326
5323 5327 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
5324 5328 G1ParScanPermClosure only_copy_perm_cl(_g1h, &pss, NULL);
5325 5329
5326 5330 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
5327 5331 G1ParScanAndMarkPermClosure copy_mark_perm_cl(_g1h, &pss, NULL);
5328 5332
5329 5333 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
5330 5334 OopsInHeapRegionClosure* copy_perm_cl = &only_copy_perm_cl;
5331 5335
5332 5336 if (_g1h->g1_policy()->during_initial_mark_pause()) {
5333 5337 // We also need to mark copied objects.
5334 5338 copy_non_heap_cl = ©_mark_non_heap_cl;
5335 5339 copy_perm_cl = ©_mark_perm_cl;
5336 5340 }
5337 5341
5338 5342 // Is alive closure
5339 5343 G1AlwaysAliveClosure always_alive(_g1h);
5340 5344
5341 5345 // Copying keep alive closure. Applied to referent objects that need
5342 5346 // to be copied.
5343 5347 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_perm_cl, &pss);
5344 5348
5345 5349 ReferenceProcessor* rp = _g1h->ref_processor_cm();
5346 5350
5347 5351 uint limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q();
5348 5352 uint stride = MIN2(MAX2(_n_workers, 1U), limit);
5349 5353
5350 5354 // limit is set using max_num_q() - which was set using ParallelGCThreads.
5351 5355 // So this must be true - but assert just in case someone decides to
5352 5356 // change the worker ids.
5353 5357 assert(0 <= worker_id && worker_id < limit, "sanity");
5354 5358 assert(!rp->discovery_is_atomic(), "check this code");
5355 5359
5356 5360 // Select discovered lists [i, i+stride, i+2*stride,...,limit)
5357 5361 for (uint idx = worker_id; idx < limit; idx += stride) {
5358 5362 DiscoveredList& ref_list = rp->discovered_refs()[idx];
5359 5363
5360 5364 DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive);
5361 5365 while (iter.has_next()) {
5362 5366 // Since discovery is not atomic for the CM ref processor, we
5363 5367 // can see some null referent objects.
5364 5368 iter.load_ptrs(DEBUG_ONLY(true));
5365 5369 oop ref = iter.obj();
5366 5370
5367 5371 // This will filter nulls.
5368 5372 if (iter.is_referent_alive()) {
5369 5373 iter.make_referent_alive();
5370 5374 }
5371 5375 iter.move_to_next();
5372 5376 }
5373 5377 }
5374 5378
5375 5379 // Drain the queue - which may cause stealing
5376 5380 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator);
5377 5381 drain_queue.do_void();
5378 5382 // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure
5379 5383 assert(pss.refs()->is_empty(), "should be");
5380 5384 }
5381 5385 };
5382 5386
5383 5387 // Weak Reference processing during an evacuation pause (part 1).
5384 5388 void G1CollectedHeap::process_discovered_references() {
5385 5389 double ref_proc_start = os::elapsedTime();
5386 5390
5387 5391 ReferenceProcessor* rp = _ref_processor_stw;
5388 5392 assert(rp->discovery_enabled(), "should have been enabled");
5389 5393
5390 5394 // Any reference objects, in the collection set, that were 'discovered'
5391 5395 // by the CM ref processor should have already been copied (either by
5392 5396 // applying the external root copy closure to the discovered lists, or
5393 5397 // by following an RSet entry).
5394 5398 //
5395 5399 // But some of the referents, that are in the collection set, that these
5396 5400 // reference objects point to may not have been copied: the STW ref
5397 5401 // processor would have seen that the reference object had already
5398 5402 // been 'discovered' and would have skipped discovering the reference,
5399 5403 // but would not have treated the reference object as a regular oop.
5400 5404 // As a reult the copy closure would not have been applied to the
5401 5405 // referent object.
5402 5406 //
5403 5407 // We need to explicitly copy these referent objects - the references
5404 5408 // will be processed at the end of remarking.
5405 5409 //
5406 5410 // We also need to do this copying before we process the reference
5407 5411 // objects discovered by the STW ref processor in case one of these
5408 5412 // referents points to another object which is also referenced by an
5409 5413 // object discovered by the STW ref processor.
5410 5414
5411 5415 uint active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
5412 5416 workers()->active_workers() : 1);
5413 5417
5414 5418 assert(!G1CollectedHeap::use_parallel_gc_threads() ||
5415 5419 active_workers == workers()->active_workers(),
5416 5420 "Need to reset active_workers");
5417 5421
5418 5422 set_par_threads(active_workers);
5419 5423 G1ParPreserveCMReferentsTask keep_cm_referents(this, active_workers, _task_queues);
5420 5424
5421 5425 if (G1CollectedHeap::use_parallel_gc_threads()) {
5422 5426 workers()->run_task(&keep_cm_referents);
5423 5427 } else {
5424 5428 keep_cm_referents.work(0);
5425 5429 }
5426 5430
5427 5431 set_par_threads(0);
5428 5432
5429 5433 // Closure to test whether a referent is alive.
5430 5434 G1STWIsAliveClosure is_alive(this);
5431 5435
5432 5436 // Even when parallel reference processing is enabled, the processing
5433 5437 // of JNI refs is serial and performed serially by the current thread
5434 5438 // rather than by a worker. The following PSS will be used for processing
5435 5439 // JNI refs.
5436 5440
5437 5441 // Use only a single queue for this PSS.
5438 5442 G1ParScanThreadState pss(this, 0);
5439 5443
5440 5444 // We do not embed a reference processor in the copying/scanning
5441 5445 // closures while we're actually processing the discovered
5442 5446 // reference objects.
5443 5447 G1ParScanHeapEvacClosure scan_evac_cl(this, &pss, NULL);
5444 5448 G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL);
5445 5449 G1ParScanPartialArrayClosure partial_scan_cl(this, &pss, NULL);
5446 5450
5447 5451 pss.set_evac_closure(&scan_evac_cl);
5448 5452 pss.set_evac_failure_closure(&evac_failure_cl);
5449 5453 pss.set_partial_scan_closure(&partial_scan_cl);
5450 5454
5451 5455 assert(pss.refs()->is_empty(), "pre-condition");
5452 5456
5453 5457 G1ParScanExtRootClosure only_copy_non_heap_cl(this, &pss, NULL);
5454 5458 G1ParScanPermClosure only_copy_perm_cl(this, &pss, NULL);
5455 5459
5456 5460 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
5457 5461 G1ParScanAndMarkPermClosure copy_mark_perm_cl(this, &pss, NULL);
5458 5462
5459 5463 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
5460 5464 OopsInHeapRegionClosure* copy_perm_cl = &only_copy_perm_cl;
5461 5465
5462 5466 if (_g1h->g1_policy()->during_initial_mark_pause()) {
5463 5467 // We also need to mark copied objects.
5464 5468 copy_non_heap_cl = ©_mark_non_heap_cl;
5465 5469 copy_perm_cl = ©_mark_perm_cl;
5466 5470 }
5467 5471
5468 5472 // Keep alive closure.
5469 5473 G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, copy_perm_cl, &pss);
5470 5474
5471 5475 // Serial Complete GC closure
5472 5476 G1STWDrainQueueClosure drain_queue(this, &pss);
5473 5477
5474 5478 // Setup the soft refs policy...
5475 5479 rp->setup_policy(false);
5476 5480
5477 5481 if (!rp->processing_is_mt()) {
5478 5482 // Serial reference processing...
5479 5483 rp->process_discovered_references(&is_alive,
5480 5484 &keep_alive,
5481 5485 &drain_queue,
5482 5486 NULL);
5483 5487 } else {
5484 5488 // Parallel reference processing
5485 5489 assert(rp->num_q() == active_workers, "sanity");
5486 5490 assert(active_workers <= rp->max_num_q(), "sanity");
5487 5491
5488 5492 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
5489 5493 rp->process_discovered_references(&is_alive, &keep_alive, &drain_queue, &par_task_executor);
5490 5494 }
5491 5495
5492 5496 // We have completed copying any necessary live referent objects
5493 5497 // (that were not copied during the actual pause) so we can
5494 5498 // retire any active alloc buffers
5495 5499 pss.retire_alloc_buffers();
5496 5500 assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
5497 5501
5498 5502 double ref_proc_time = os::elapsedTime() - ref_proc_start;
5499 5503 g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
5500 5504 }
5501 5505
5502 5506 // Weak Reference processing during an evacuation pause (part 2).
5503 5507 void G1CollectedHeap::enqueue_discovered_references() {
5504 5508 double ref_enq_start = os::elapsedTime();
5505 5509
5506 5510 ReferenceProcessor* rp = _ref_processor_stw;
5507 5511 assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
5508 5512
5509 5513 // Now enqueue any remaining on the discovered lists on to
5510 5514 // the pending list.
5511 5515 if (!rp->processing_is_mt()) {
5512 5516 // Serial reference processing...
5513 5517 rp->enqueue_discovered_references();
5514 5518 } else {
5515 5519 // Parallel reference enqueuing
5516 5520
5517 5521 uint active_workers = (ParallelGCThreads > 0 ? workers()->active_workers() : 1);
5518 5522 assert(active_workers == workers()->active_workers(),
5519 5523 "Need to reset active_workers");
5520 5524 assert(rp->num_q() == active_workers, "sanity");
5521 5525 assert(active_workers <= rp->max_num_q(), "sanity");
5522 5526
5523 5527 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
5524 5528 rp->enqueue_discovered_references(&par_task_executor);
5525 5529 }
5526 5530
5527 5531 rp->verify_no_references_recorded();
5528 5532 assert(!rp->discovery_enabled(), "should have been disabled");
5529 5533
5530 5534 // FIXME
5531 5535 // CM's reference processing also cleans up the string and symbol tables.
5532 5536 // Should we do that here also? We could, but it is a serial operation
5533 5537 // and could signicantly increase the pause time.
5534 5538
5535 5539 double ref_enq_time = os::elapsedTime() - ref_enq_start;
5536 5540 g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0);
5537 5541 }
5538 5542
5539 5543 void G1CollectedHeap::evacuate_collection_set() {
5540 5544 _expand_heap_after_alloc_failure = true;
5541 5545 set_evacuation_failed(false);
5542 5546
5543 5547 g1_rem_set()->prepare_for_oops_into_collection_set_do();
5544 5548 concurrent_g1_refine()->set_use_cache(false);
5545 5549 concurrent_g1_refine()->clear_hot_cache_claimed_index();
5546 5550
5547 5551 uint n_workers;
5548 5552 if (G1CollectedHeap::use_parallel_gc_threads()) {
5549 5553 n_workers =
5550 5554 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
5551 5555 workers()->active_workers(),
5552 5556 Threads::number_of_non_daemon_threads());
5553 5557 assert(UseDynamicNumberOfGCThreads ||
5554 5558 n_workers == workers()->total_workers(),
5555 5559 "If not dynamic should be using all the workers");
5556 5560 workers()->set_active_workers(n_workers);
5557 5561 set_par_threads(n_workers);
5558 5562 } else {
5559 5563 assert(n_par_threads() == 0,
5560 5564 "Should be the original non-parallel value");
5561 5565 n_workers = 1;
5562 5566 }
5563 5567
5564 5568 G1ParTask g1_par_task(this, _task_queues);
5565 5569
5566 5570 init_for_evac_failure(NULL);
5567 5571
5568 5572 rem_set()->prepare_for_younger_refs_iterate(true);
5569 5573
5570 5574 assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty");
5571 5575 double start_par_time_sec = os::elapsedTime();
5572 5576 double end_par_time_sec;
5573 5577
5574 5578 {
5575 5579 StrongRootsScope srs(this);
5576 5580
5577 5581 if (G1CollectedHeap::use_parallel_gc_threads()) {
5578 5582 // The individual threads will set their evac-failure closures.
5579 5583 if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
5580 5584 // These tasks use ShareHeap::_process_strong_tasks
5581 5585 assert(UseDynamicNumberOfGCThreads ||
5582 5586 workers()->active_workers() == workers()->total_workers(),
5583 5587 "If not dynamic should be using all the workers");
5584 5588 workers()->run_task(&g1_par_task);
5585 5589 } else {
5586 5590 g1_par_task.set_for_termination(n_workers);
5587 5591 g1_par_task.work(0);
5588 5592 }
5589 5593 end_par_time_sec = os::elapsedTime();
5590 5594
5591 5595 // Closing the inner scope will execute the destructor
5592 5596 // for the StrongRootsScope object. We record the current
5593 5597 // elapsed time before closing the scope so that time
5594 5598 // taken for the SRS destructor is NOT included in the
5595 5599 // reported parallel time.
5596 5600 }
5597 5601
5598 5602 double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0;
5599 5603 g1_policy()->phase_times()->record_par_time(par_time_ms);
5600 5604
5601 5605 double code_root_fixup_time_ms =
5602 5606 (os::elapsedTime() - end_par_time_sec) * 1000.0;
5603 5607 g1_policy()->phase_times()->record_code_root_fixup_time(code_root_fixup_time_ms);
5604 5608
5605 5609 set_par_threads(0);
5606 5610
5607 5611 // Process any discovered reference objects - we have
5608 5612 // to do this _before_ we retire the GC alloc regions
5609 5613 // as we may have to copy some 'reachable' referent
5610 5614 // objects (and their reachable sub-graphs) that were
5611 5615 // not copied during the pause.
5612 5616 process_discovered_references();
5613 5617
5614 5618 // Weak root processing.
5615 5619 // Note: when JSR 292 is enabled and code blobs can contain
5616 5620 // non-perm oops then we will need to process the code blobs
5617 5621 // here too.
5618 5622 {
5619 5623 G1STWIsAliveClosure is_alive(this);
5620 5624 G1KeepAliveClosure keep_alive(this);
5621 5625 JNIHandles::weak_oops_do(&is_alive, &keep_alive);
5622 5626 }
5623 5627
5624 5628 release_gc_alloc_regions();
5625 5629 g1_rem_set()->cleanup_after_oops_into_collection_set_do();
5626 5630
5627 5631 concurrent_g1_refine()->clear_hot_cache();
5628 5632 concurrent_g1_refine()->set_use_cache(true);
5629 5633
5630 5634 finalize_for_evac_failure();
5631 5635
5632 5636 if (evacuation_failed()) {
5633 5637 remove_self_forwarding_pointers();
5634 5638 if (G1Log::finer()) {
5635 5639 gclog_or_tty->print(" (to-space exhausted)");
5636 5640 } else if (G1Log::fine()) {
5637 5641 gclog_or_tty->print("--");
5638 5642 }
5639 5643 }
5640 5644
5641 5645 // Enqueue any remaining references remaining on the STW
5642 5646 // reference processor's discovered lists. We need to do
5643 5647 // this after the card table is cleaned (and verified) as
5644 5648 // the act of enqueuing entries on to the pending list
5645 5649 // will log these updates (and dirty their associated
5646 5650 // cards). We need these updates logged to update any
5647 5651 // RSets.
5648 5652 enqueue_discovered_references();
5649 5653
5650 5654 if (G1DeferredRSUpdate) {
5651 5655 RedirtyLoggedCardTableEntryFastClosure redirty;
5652 5656 dirty_card_queue_set().set_closure(&redirty);
5653 5657 dirty_card_queue_set().apply_closure_to_all_completed_buffers();
5654 5658
5655 5659 DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
5656 5660 dcq.merge_bufferlists(&dirty_card_queue_set());
5657 5661 assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
5658 5662 }
5659 5663 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
5660 5664 }
5661 5665
5662 5666 void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
5663 5667 size_t* pre_used,
5664 5668 FreeRegionList* free_list,
5665 5669 OldRegionSet* old_proxy_set,
5666 5670 HumongousRegionSet* humongous_proxy_set,
5667 5671 HRRSCleanupTask* hrrs_cleanup_task,
5668 5672 bool par) {
5669 5673 if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) {
5670 5674 if (hr->isHumongous()) {
5671 5675 assert(hr->startsHumongous(), "we should only see starts humongous");
5672 5676 free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par);
5673 5677 } else {
5674 5678 _old_set.remove_with_proxy(hr, old_proxy_set);
5675 5679 free_region(hr, pre_used, free_list, par);
5676 5680 }
5677 5681 } else {
5678 5682 hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
5679 5683 }
5680 5684 }
5681 5685
5682 5686 void G1CollectedHeap::free_region(HeapRegion* hr,
5683 5687 size_t* pre_used,
5684 5688 FreeRegionList* free_list,
5685 5689 bool par) {
5686 5690 assert(!hr->isHumongous(), "this is only for non-humongous regions");
5687 5691 assert(!hr->is_empty(), "the region should not be empty");
5688 5692 assert(free_list != NULL, "pre-condition");
5689 5693
5690 5694 *pre_used += hr->used();
5691 5695 hr->hr_clear(par, true /* clear_space */);
5692 5696 free_list->add_as_head(hr);
5693 5697 }
5694 5698
5695 5699 void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
5696 5700 size_t* pre_used,
5697 5701 FreeRegionList* free_list,
5698 5702 HumongousRegionSet* humongous_proxy_set,
5699 5703 bool par) {
5700 5704 assert(hr->startsHumongous(), "this is only for starts humongous regions");
5701 5705 assert(free_list != NULL, "pre-condition");
5702 5706 assert(humongous_proxy_set != NULL, "pre-condition");
5703 5707
5704 5708 size_t hr_used = hr->used();
5705 5709 size_t hr_capacity = hr->capacity();
5706 5710 size_t hr_pre_used = 0;
5707 5711 _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
5708 5712 // We need to read this before we make the region non-humongous,
5709 5713 // otherwise the information will be gone.
5710 5714 uint last_index = hr->last_hc_index();
5711 5715 hr->set_notHumongous();
5712 5716 free_region(hr, &hr_pre_used, free_list, par);
5713 5717
5714 5718 uint i = hr->hrs_index() + 1;
5715 5719 while (i < last_index) {
5716 5720 HeapRegion* curr_hr = region_at(i);
5717 5721 assert(curr_hr->continuesHumongous(), "invariant");
5718 5722 curr_hr->set_notHumongous();
5719 5723 free_region(curr_hr, &hr_pre_used, free_list, par);
5720 5724 i += 1;
5721 5725 }
5722 5726 assert(hr_pre_used == hr_used,
5723 5727 err_msg("hr_pre_used: "SIZE_FORMAT" and hr_used: "SIZE_FORMAT" "
5724 5728 "should be the same", hr_pre_used, hr_used));
5725 5729 *pre_used += hr_pre_used;
5726 5730 }
5727 5731
5728 5732 void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
5729 5733 FreeRegionList* free_list,
5730 5734 OldRegionSet* old_proxy_set,
5731 5735 HumongousRegionSet* humongous_proxy_set,
5732 5736 bool par) {
5733 5737 if (pre_used > 0) {
5734 5738 Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
5735 5739 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
5736 5740 assert(_summary_bytes_used >= pre_used,
5737 5741 err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
5738 5742 "should be >= pre_used: "SIZE_FORMAT,
5739 5743 _summary_bytes_used, pre_used));
5740 5744 _summary_bytes_used -= pre_used;
5741 5745 }
5742 5746 if (free_list != NULL && !free_list->is_empty()) {
5743 5747 MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
5744 5748 _free_list.add_as_head(free_list);
5745 5749 }
5746 5750 if (old_proxy_set != NULL && !old_proxy_set->is_empty()) {
5747 5751 MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
5748 5752 _old_set.update_from_proxy(old_proxy_set);
5749 5753 }
5750 5754 if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
5751 5755 MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
5752 5756 _humongous_set.update_from_proxy(humongous_proxy_set);
5753 5757 }
5754 5758 }
5755 5759
5756 5760 class G1ParCleanupCTTask : public AbstractGangTask {
5757 5761 CardTableModRefBS* _ct_bs;
5758 5762 G1CollectedHeap* _g1h;
5759 5763 HeapRegion* volatile _su_head;
5760 5764 public:
5761 5765 G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
5762 5766 G1CollectedHeap* g1h) :
5763 5767 AbstractGangTask("G1 Par Cleanup CT Task"),
5764 5768 _ct_bs(ct_bs), _g1h(g1h) { }
5765 5769
5766 5770 void work(uint worker_id) {
5767 5771 HeapRegion* r;
5768 5772 while (r = _g1h->pop_dirty_cards_region()) {
5769 5773 clear_cards(r);
5770 5774 }
5771 5775 }
5772 5776
5773 5777 void clear_cards(HeapRegion* r) {
5774 5778 // Cards of the survivors should have already been dirtied.
5775 5779 if (!r->is_survivor()) {
5776 5780 _ct_bs->clear(MemRegion(r->bottom(), r->end()));
5777 5781 }
5778 5782 }
5779 5783 };
5780 5784
5781 5785 #ifndef PRODUCT
5782 5786 class G1VerifyCardTableCleanup: public HeapRegionClosure {
5783 5787 G1CollectedHeap* _g1h;
5784 5788 CardTableModRefBS* _ct_bs;
5785 5789 public:
5786 5790 G1VerifyCardTableCleanup(G1CollectedHeap* g1h, CardTableModRefBS* ct_bs)
5787 5791 : _g1h(g1h), _ct_bs(ct_bs) { }
5788 5792 virtual bool doHeapRegion(HeapRegion* r) {
5789 5793 if (r->is_survivor()) {
5790 5794 _g1h->verify_dirty_region(r);
5791 5795 } else {
5792 5796 _g1h->verify_not_dirty_region(r);
5793 5797 }
5794 5798 return false;
5795 5799 }
5796 5800 };
5797 5801
5798 5802 void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
5799 5803 // All of the region should be clean.
5800 5804 CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
5801 5805 MemRegion mr(hr->bottom(), hr->end());
5802 5806 ct_bs->verify_not_dirty_region(mr);
5803 5807 }
5804 5808
5805 5809 void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) {
5806 5810 // We cannot guarantee that [bottom(),end()] is dirty. Threads
5807 5811 // dirty allocated blocks as they allocate them. The thread that
5808 5812 // retires each region and replaces it with a new one will do a
5809 5813 // maximal allocation to fill in [pre_dummy_top(),end()] but will
5810 5814 // not dirty that area (one less thing to have to do while holding
5811 5815 // a lock). So we can only verify that [bottom(),pre_dummy_top()]
5812 5816 // is dirty.
5813 5817 CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
5814 5818 MemRegion mr(hr->bottom(), hr->pre_dummy_top());
5815 5819 ct_bs->verify_dirty_region(mr);
5816 5820 }
5817 5821
5818 5822 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
5819 5823 CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
5820 5824 for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
5821 5825 verify_dirty_region(hr);
5822 5826 }
5823 5827 }
5824 5828
5825 5829 void G1CollectedHeap::verify_dirty_young_regions() {
5826 5830 verify_dirty_young_list(_young_list->first_region());
5827 5831 }
5828 5832 #endif
5829 5833
5830 5834 void G1CollectedHeap::cleanUpCardTable() {
5831 5835 CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
5832 5836 double start = os::elapsedTime();
5833 5837
5834 5838 {
5835 5839 // Iterate over the dirty cards region list.
5836 5840 G1ParCleanupCTTask cleanup_task(ct_bs, this);
5837 5841
5838 5842 if (G1CollectedHeap::use_parallel_gc_threads()) {
5839 5843 set_par_threads();
5840 5844 workers()->run_task(&cleanup_task);
5841 5845 set_par_threads(0);
5842 5846 } else {
5843 5847 while (_dirty_cards_region_list) {
5844 5848 HeapRegion* r = _dirty_cards_region_list;
5845 5849 cleanup_task.clear_cards(r);
5846 5850 _dirty_cards_region_list = r->get_next_dirty_cards_region();
5847 5851 if (_dirty_cards_region_list == r) {
5848 5852 // The last region.
5849 5853 _dirty_cards_region_list = NULL;
5850 5854 }
5851 5855 r->set_next_dirty_cards_region(NULL);
5852 5856 }
5853 5857 }
5854 5858 #ifndef PRODUCT
5855 5859 if (G1VerifyCTCleanup || VerifyAfterGC) {
5856 5860 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
5857 5861 heap_region_iterate(&cleanup_verifier);
5858 5862 }
5859 5863 #endif
5860 5864 }
5861 5865
5862 5866 double elapsed = os::elapsedTime() - start;
5863 5867 g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0);
5864 5868 }
5865 5869
5866 5870 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
5867 5871 size_t pre_used = 0;
5868 5872 FreeRegionList local_free_list("Local List for CSet Freeing");
5869 5873
5870 5874 double young_time_ms = 0.0;
5871 5875 double non_young_time_ms = 0.0;
5872 5876
5873 5877 // Since the collection set is a superset of the the young list,
5874 5878 // all we need to do to clear the young list is clear its
5875 5879 // head and length, and unlink any young regions in the code below
5876 5880 _young_list->clear();
5877 5881
5878 5882 G1CollectorPolicy* policy = g1_policy();
5879 5883
5880 5884 double start_sec = os::elapsedTime();
5881 5885 bool non_young = true;
5882 5886
5883 5887 HeapRegion* cur = cs_head;
5884 5888 int age_bound = -1;
5885 5889 size_t rs_lengths = 0;
5886 5890
5887 5891 while (cur != NULL) {
5888 5892 assert(!is_on_master_free_list(cur), "sanity");
5889 5893 if (non_young) {
5890 5894 if (cur->is_young()) {
5891 5895 double end_sec = os::elapsedTime();
5892 5896 double elapsed_ms = (end_sec - start_sec) * 1000.0;
5893 5897 non_young_time_ms += elapsed_ms;
5894 5898
5895 5899 start_sec = os::elapsedTime();
5896 5900 non_young = false;
5897 5901 }
5898 5902 } else {
5899 5903 if (!cur->is_young()) {
5900 5904 double end_sec = os::elapsedTime();
5901 5905 double elapsed_ms = (end_sec - start_sec) * 1000.0;
5902 5906 young_time_ms += elapsed_ms;
5903 5907
5904 5908 start_sec = os::elapsedTime();
5905 5909 non_young = true;
5906 5910 }
5907 5911 }
5908 5912
5909 5913 rs_lengths += cur->rem_set()->occupied();
5910 5914
5911 5915 HeapRegion* next = cur->next_in_collection_set();
5912 5916 assert(cur->in_collection_set(), "bad CS");
5913 5917 cur->set_next_in_collection_set(NULL);
5914 5918 cur->set_in_collection_set(false);
5915 5919
5916 5920 if (cur->is_young()) {
5917 5921 int index = cur->young_index_in_cset();
5918 5922 assert(index != -1, "invariant");
5919 5923 assert((uint) index < policy->young_cset_region_length(), "invariant");
5920 5924 size_t words_survived = _surviving_young_words[index];
5921 5925 cur->record_surv_words_in_group(words_survived);
5922 5926
5923 5927 // At this point the we have 'popped' cur from the collection set
5924 5928 // (linked via next_in_collection_set()) but it is still in the
5925 5929 // young list (linked via next_young_region()). Clear the
5926 5930 // _next_young_region field.
5927 5931 cur->set_next_young_region(NULL);
5928 5932 } else {
5929 5933 int index = cur->young_index_in_cset();
5930 5934 assert(index == -1, "invariant");
5931 5935 }
5932 5936
5933 5937 assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
5934 5938 (!cur->is_young() && cur->young_index_in_cset() == -1),
5935 5939 "invariant" );
5936 5940
5937 5941 if (!cur->evacuation_failed()) {
5938 5942 MemRegion used_mr = cur->used_region();
5939 5943
5940 5944 // And the region is empty.
5941 5945 assert(!used_mr.is_empty(), "Should not have empty regions in a CS.");
5942 5946 free_region(cur, &pre_used, &local_free_list, false /* par */);
5943 5947 } else {
5944 5948 cur->uninstall_surv_rate_group();
5945 5949 if (cur->is_young()) {
5946 5950 cur->set_young_index_in_cset(-1);
5947 5951 }
5948 5952 cur->set_not_young();
5949 5953 cur->set_evacuation_failed(false);
5950 5954 // The region is now considered to be old.
5951 5955 _old_set.add(cur);
5952 5956 }
5953 5957 cur = next;
5954 5958 }
5955 5959
5956 5960 policy->record_max_rs_lengths(rs_lengths);
5957 5961 policy->cset_regions_freed();
5958 5962
5959 5963 double end_sec = os::elapsedTime();
5960 5964 double elapsed_ms = (end_sec - start_sec) * 1000.0;
5961 5965
5962 5966 if (non_young) {
5963 5967 non_young_time_ms += elapsed_ms;
5964 5968 } else {
5965 5969 young_time_ms += elapsed_ms;
5966 5970 }
5967 5971
5968 5972 update_sets_after_freeing_regions(pre_used, &local_free_list,
5969 5973 NULL /* old_proxy_set */,
5970 5974 NULL /* humongous_proxy_set */,
5971 5975 false /* par */);
5972 5976 policy->phase_times()->record_young_free_cset_time_ms(young_time_ms);
5973 5977 policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms);
5974 5978 }
5975 5979
5976 5980 // This routine is similar to the above but does not record
5977 5981 // any policy statistics or update free lists; we are abandoning
5978 5982 // the current incremental collection set in preparation of a
5979 5983 // full collection. After the full GC we will start to build up
5980 5984 // the incremental collection set again.
5981 5985 // This is only called when we're doing a full collection
5982 5986 // and is immediately followed by the tearing down of the young list.
5983 5987
5984 5988 void G1CollectedHeap::abandon_collection_set(HeapRegion* cs_head) {
5985 5989 HeapRegion* cur = cs_head;
5986 5990
5987 5991 while (cur != NULL) {
5988 5992 HeapRegion* next = cur->next_in_collection_set();
5989 5993 assert(cur->in_collection_set(), "bad CS");
5990 5994 cur->set_next_in_collection_set(NULL);
5991 5995 cur->set_in_collection_set(false);
5992 5996 cur->set_young_index_in_cset(-1);
5993 5997 cur = next;
5994 5998 }
5995 5999 }
5996 6000
5997 6001 void G1CollectedHeap::set_free_regions_coming() {
5998 6002 if (G1ConcRegionFreeingVerbose) {
5999 6003 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
6000 6004 "setting free regions coming");
6001 6005 }
6002 6006
6003 6007 assert(!free_regions_coming(), "pre-condition");
6004 6008 _free_regions_coming = true;
6005 6009 }
6006 6010
6007 6011 void G1CollectedHeap::reset_free_regions_coming() {
6008 6012 assert(free_regions_coming(), "pre-condition");
6009 6013
6010 6014 {
6011 6015 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
6012 6016 _free_regions_coming = false;
6013 6017 SecondaryFreeList_lock->notify_all();
6014 6018 }
6015 6019
6016 6020 if (G1ConcRegionFreeingVerbose) {
6017 6021 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
6018 6022 "reset free regions coming");
6019 6023 }
6020 6024 }
6021 6025
6022 6026 void G1CollectedHeap::wait_while_free_regions_coming() {
6023 6027 // Most of the time we won't have to wait, so let's do a quick test
6024 6028 // first before we take the lock.
6025 6029 if (!free_regions_coming()) {
6026 6030 return;
6027 6031 }
6028 6032
6029 6033 if (G1ConcRegionFreeingVerbose) {
6030 6034 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
6031 6035 "waiting for free regions");
6032 6036 }
6033 6037
6034 6038 {
6035 6039 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
6036 6040 while (free_regions_coming()) {
6037 6041 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
6038 6042 }
6039 6043 }
6040 6044
6041 6045 if (G1ConcRegionFreeingVerbose) {
6042 6046 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
6043 6047 "done waiting for free regions");
6044 6048 }
6045 6049 }
6046 6050
6047 6051 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
6048 6052 assert(heap_lock_held_for_gc(),
6049 6053 "the heap lock should already be held by or for this thread");
6050 6054 _young_list->push_region(hr);
6051 6055 }
6052 6056
6053 6057 class NoYoungRegionsClosure: public HeapRegionClosure {
6054 6058 private:
6055 6059 bool _success;
6056 6060 public:
6057 6061 NoYoungRegionsClosure() : _success(true) { }
6058 6062 bool doHeapRegion(HeapRegion* r) {
6059 6063 if (r->is_young()) {
6060 6064 gclog_or_tty->print_cr("Region ["PTR_FORMAT", "PTR_FORMAT") tagged as young",
6061 6065 r->bottom(), r->end());
6062 6066 _success = false;
6063 6067 }
6064 6068 return false;
6065 6069 }
6066 6070 bool success() { return _success; }
6067 6071 };
6068 6072
6069 6073 bool G1CollectedHeap::check_young_list_empty(bool check_heap, bool check_sample) {
6070 6074 bool ret = _young_list->check_list_empty(check_sample);
6071 6075
6072 6076 if (check_heap) {
6073 6077 NoYoungRegionsClosure closure;
6074 6078 heap_region_iterate(&closure);
6075 6079 ret = ret && closure.success();
6076 6080 }
6077 6081
6078 6082 return ret;
6079 6083 }
6080 6084
6081 6085 class TearDownRegionSetsClosure : public HeapRegionClosure {
6082 6086 private:
6083 6087 OldRegionSet *_old_set;
6084 6088
6085 6089 public:
6086 6090 TearDownRegionSetsClosure(OldRegionSet* old_set) : _old_set(old_set) { }
6087 6091
6088 6092 bool doHeapRegion(HeapRegion* r) {
6089 6093 if (r->is_empty()) {
6090 6094 // We ignore empty regions, we'll empty the free list afterwards
6091 6095 } else if (r->is_young()) {
6092 6096 // We ignore young regions, we'll empty the young list afterwards
6093 6097 } else if (r->isHumongous()) {
6094 6098 // We ignore humongous regions, we're not tearing down the
6095 6099 // humongous region set
6096 6100 } else {
6097 6101 // The rest should be old
6098 6102 _old_set->remove(r);
6099 6103 }
6100 6104 return false;
6101 6105 }
6102 6106
6103 6107 ~TearDownRegionSetsClosure() {
6104 6108 assert(_old_set->is_empty(), "post-condition");
6105 6109 }
6106 6110 };
6107 6111
6108 6112 void G1CollectedHeap::tear_down_region_sets(bool free_list_only) {
6109 6113 assert_at_safepoint(true /* should_be_vm_thread */);
6110 6114
6111 6115 if (!free_list_only) {
6112 6116 TearDownRegionSetsClosure cl(&_old_set);
6113 6117 heap_region_iterate(&cl);
6114 6118
6115 6119 // Need to do this after the heap iteration to be able to
6116 6120 // recognize the young regions and ignore them during the iteration.
6117 6121 _young_list->empty_list();
6118 6122 }
6119 6123 _free_list.remove_all();
6120 6124 }
6121 6125
6122 6126 class RebuildRegionSetsClosure : public HeapRegionClosure {
6123 6127 private:
6124 6128 bool _free_list_only;
6125 6129 OldRegionSet* _old_set;
6126 6130 FreeRegionList* _free_list;
6127 6131 size_t _total_used;
6128 6132
6129 6133 public:
6130 6134 RebuildRegionSetsClosure(bool free_list_only,
6131 6135 OldRegionSet* old_set, FreeRegionList* free_list) :
6132 6136 _free_list_only(free_list_only),
6133 6137 _old_set(old_set), _free_list(free_list), _total_used(0) {
6134 6138 assert(_free_list->is_empty(), "pre-condition");
6135 6139 if (!free_list_only) {
6136 6140 assert(_old_set->is_empty(), "pre-condition");
6137 6141 }
6138 6142 }
6139 6143
6140 6144 bool doHeapRegion(HeapRegion* r) {
6141 6145 if (r->continuesHumongous()) {
6142 6146 return false;
6143 6147 }
6144 6148
6145 6149 if (r->is_empty()) {
6146 6150 // Add free regions to the free list
6147 6151 _free_list->add_as_tail(r);
6148 6152 } else if (!_free_list_only) {
6149 6153 assert(!r->is_young(), "we should not come across young regions");
6150 6154
6151 6155 if (r->isHumongous()) {
6152 6156 // We ignore humongous regions, we left the humongous set unchanged
6153 6157 } else {
6154 6158 // The rest should be old, add them to the old set
6155 6159 _old_set->add(r);
6156 6160 }
6157 6161 _total_used += r->used();
6158 6162 }
6159 6163
6160 6164 return false;
6161 6165 }
6162 6166
6163 6167 size_t total_used() {
6164 6168 return _total_used;
6165 6169 }
6166 6170 };
6167 6171
6168 6172 void G1CollectedHeap::rebuild_region_sets(bool free_list_only) {
6169 6173 assert_at_safepoint(true /* should_be_vm_thread */);
6170 6174
6171 6175 RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_free_list);
6172 6176 heap_region_iterate(&cl);
6173 6177
6174 6178 if (!free_list_only) {
6175 6179 _summary_bytes_used = cl.total_used();
6176 6180 }
6177 6181 assert(_summary_bytes_used == recalculate_used(),
6178 6182 err_msg("inconsistent _summary_bytes_used, "
6179 6183 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT,
6180 6184 _summary_bytes_used, recalculate_used()));
6181 6185 }
6182 6186
6183 6187 void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
6184 6188 _refine_cte_cl->set_concurrent(concurrent);
6185 6189 }
6186 6190
6187 6191 bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
6188 6192 HeapRegion* hr = heap_region_containing(p);
6189 6193 if (hr == NULL) {
6190 6194 return is_in_permanent(p);
6191 6195 } else {
6192 6196 return hr->is_in(p);
6193 6197 }
6194 6198 }
6195 6199
6196 6200 // Methods for the mutator alloc region
6197 6201
6198 6202 HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
6199 6203 bool force) {
6200 6204 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
6201 6205 assert(!force || g1_policy()->can_expand_young_list(),
6202 6206 "if force is true we should be able to expand the young list");
6203 6207 bool young_list_full = g1_policy()->is_young_list_full();
6204 6208 if (force || !young_list_full) {
6205 6209 HeapRegion* new_alloc_region = new_region(word_size,
6206 6210 false /* do_expand */);
6207 6211 if (new_alloc_region != NULL) {
6208 6212 set_region_short_lived_locked(new_alloc_region);
6209 6213 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full);
6210 6214 return new_alloc_region;
6211 6215 }
6212 6216 }
6213 6217 return NULL;
6214 6218 }
6215 6219
6216 6220 void G1CollectedHeap::retire_mutator_alloc_region(HeapRegion* alloc_region,
6217 6221 size_t allocated_bytes) {
6218 6222 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
6219 6223 assert(alloc_region->is_young(), "all mutator alloc regions should be young");
6220 6224
6221 6225 g1_policy()->add_region_to_incremental_cset_lhs(alloc_region);
6222 6226 _summary_bytes_used += allocated_bytes;
6223 6227 _hr_printer.retire(alloc_region);
6224 6228 // We update the eden sizes here, when the region is retired,
6225 6229 // instead of when it's allocated, since this is the point that its
6226 6230 // used space has been recored in _summary_bytes_used.
6227 6231 g1mm()->update_eden_size();
6228 6232 }
6229 6233
6230 6234 HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size,
6231 6235 bool force) {
6232 6236 return _g1h->new_mutator_alloc_region(word_size, force);
6233 6237 }
6234 6238
6235 6239 void G1CollectedHeap::set_par_threads() {
6236 6240 // Don't change the number of workers. Use the value previously set
6237 6241 // in the workgroup.
6238 6242 assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
6239 6243 uint n_workers = workers()->active_workers();
6240 6244 assert(UseDynamicNumberOfGCThreads ||
6241 6245 n_workers == workers()->total_workers(),
6242 6246 "Otherwise should be using the total number of workers");
6243 6247 if (n_workers == 0) {
6244 6248 assert(false, "Should have been set in prior evacuation pause.");
6245 6249 n_workers = ParallelGCThreads;
6246 6250 workers()->set_active_workers(n_workers);
6247 6251 }
6248 6252 set_par_threads(n_workers);
6249 6253 }
6250 6254
6251 6255 void MutatorAllocRegion::retire_region(HeapRegion* alloc_region,
6252 6256 size_t allocated_bytes) {
6253 6257 _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes);
6254 6258 }
6255 6259
6256 6260 // Methods for the GC alloc regions
6257 6261
6258 6262 HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
6259 6263 uint count,
6260 6264 GCAllocPurpose ap) {
6261 6265 assert(FreeList_lock->owned_by_self(), "pre-condition");
6262 6266
6263 6267 if (count < g1_policy()->max_regions(ap)) {
6264 6268 HeapRegion* new_alloc_region = new_region(word_size,
6265 6269 true /* do_expand */);
6266 6270 if (new_alloc_region != NULL) {
6267 6271 // We really only need to do this for old regions given that we
6268 6272 // should never scan survivors. But it doesn't hurt to do it
6269 6273 // for survivors too.
6270 6274 new_alloc_region->set_saved_mark();
6271 6275 if (ap == GCAllocForSurvived) {
6272 6276 new_alloc_region->set_survivor();
6273 6277 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor);
6274 6278 } else {
6275 6279 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old);
6276 6280 }
6277 6281 bool during_im = g1_policy()->during_initial_mark_pause();
6278 6282 new_alloc_region->note_start_of_copying(during_im);
6279 6283 return new_alloc_region;
6280 6284 } else {
6281 6285 g1_policy()->note_alloc_region_limit_reached(ap);
6282 6286 }
6283 6287 }
6284 6288 return NULL;
6285 6289 }
6286 6290
6287 6291 void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
6288 6292 size_t allocated_bytes,
6289 6293 GCAllocPurpose ap) {
6290 6294 bool during_im = g1_policy()->during_initial_mark_pause();
6291 6295 alloc_region->note_end_of_copying(during_im);
6292 6296 g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
6293 6297 if (ap == GCAllocForSurvived) {
6294 6298 young_list()->add_survivor_region(alloc_region);
6295 6299 } else {
6296 6300 _old_set.add(alloc_region);
6297 6301 }
6298 6302 _hr_printer.retire(alloc_region);
6299 6303 }
6300 6304
6301 6305 HeapRegion* SurvivorGCAllocRegion::allocate_new_region(size_t word_size,
6302 6306 bool force) {
6303 6307 assert(!force, "not supported for GC alloc regions");
6304 6308 return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForSurvived);
6305 6309 }
6306 6310
6307 6311 void SurvivorGCAllocRegion::retire_region(HeapRegion* alloc_region,
6308 6312 size_t allocated_bytes) {
6309 6313 _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
6310 6314 GCAllocForSurvived);
6311 6315 }
6312 6316
6313 6317 HeapRegion* OldGCAllocRegion::allocate_new_region(size_t word_size,
6314 6318 bool force) {
6315 6319 assert(!force, "not supported for GC alloc regions");
6316 6320 return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForTenured);
6317 6321 }
6318 6322
6319 6323 void OldGCAllocRegion::retire_region(HeapRegion* alloc_region,
6320 6324 size_t allocated_bytes) {
6321 6325 _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
6322 6326 GCAllocForTenured);
6323 6327 }
6324 6328 // Heap region set verification
6325 6329
6326 6330 class VerifyRegionListsClosure : public HeapRegionClosure {
6327 6331 private:
6328 6332 FreeRegionList* _free_list;
6329 6333 OldRegionSet* _old_set;
6330 6334 HumongousRegionSet* _humongous_set;
6331 6335 uint _region_count;
6332 6336
6333 6337 public:
6334 6338 VerifyRegionListsClosure(OldRegionSet* old_set,
6335 6339 HumongousRegionSet* humongous_set,
6336 6340 FreeRegionList* free_list) :
6337 6341 _old_set(old_set), _humongous_set(humongous_set),
6338 6342 _free_list(free_list), _region_count(0) { }
6339 6343
6340 6344 uint region_count() { return _region_count; }
6341 6345
6342 6346 bool doHeapRegion(HeapRegion* hr) {
6343 6347 _region_count += 1;
6344 6348
6345 6349 if (hr->continuesHumongous()) {
6346 6350 return false;
6347 6351 }
6348 6352
6349 6353 if (hr->is_young()) {
6350 6354 // TODO
6351 6355 } else if (hr->startsHumongous()) {
6352 6356 _humongous_set->verify_next_region(hr);
6353 6357 } else if (hr->is_empty()) {
6354 6358 _free_list->verify_next_region(hr);
6355 6359 } else {
6356 6360 _old_set->verify_next_region(hr);
6357 6361 }
6358 6362 return false;
6359 6363 }
6360 6364 };
6361 6365
6362 6366 HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index,
6363 6367 HeapWord* bottom) {
6364 6368 HeapWord* end = bottom + HeapRegion::GrainWords;
6365 6369 MemRegion mr(bottom, end);
6366 6370 assert(_g1_reserved.contains(mr), "invariant");
6367 6371 // This might return NULL if the allocation fails
6368 6372 return new HeapRegion(hrs_index, _bot_shared, mr, true /* is_zeroed */);
6369 6373 }
6370 6374
6371 6375 void G1CollectedHeap::verify_region_sets() {
6372 6376 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
6373 6377
6374 6378 // First, check the explicit lists.
6375 6379 _free_list.verify();
6376 6380 {
6377 6381 // Given that a concurrent operation might be adding regions to
6378 6382 // the secondary free list we have to take the lock before
6379 6383 // verifying it.
6380 6384 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
6381 6385 _secondary_free_list.verify();
6382 6386 }
6383 6387 _old_set.verify();
6384 6388 _humongous_set.verify();
6385 6389
6386 6390 // If a concurrent region freeing operation is in progress it will
6387 6391 // be difficult to correctly attributed any free regions we come
6388 6392 // across to the correct free list given that they might belong to
6389 6393 // one of several (free_list, secondary_free_list, any local lists,
6390 6394 // etc.). So, if that's the case we will skip the rest of the
6391 6395 // verification operation. Alternatively, waiting for the concurrent
6392 6396 // operation to complete will have a non-trivial effect on the GC's
6393 6397 // operation (no concurrent operation will last longer than the
6394 6398 // interval between two calls to verification) and it might hide
6395 6399 // any issues that we would like to catch during testing.
6396 6400 if (free_regions_coming()) {
6397 6401 return;
6398 6402 }
6399 6403
6400 6404 // Make sure we append the secondary_free_list on the free_list so
6401 6405 // that all free regions we will come across can be safely
6402 6406 // attributed to the free_list.
6403 6407 append_secondary_free_list_if_not_empty_with_lock();
6404 6408
6405 6409 // Finally, make sure that the region accounting in the lists is
6406 6410 // consistent with what we see in the heap.
6407 6411 _old_set.verify_start();
6408 6412 _humongous_set.verify_start();
6409 6413 _free_list.verify_start();
6410 6414
6411 6415 VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_free_list);
6412 6416 heap_region_iterate(&cl);
6413 6417
6414 6418 _old_set.verify_end();
6415 6419 _humongous_set.verify_end();
6416 6420 _free_list.verify_end();
6417 6421 }
↓ open down ↓ |
2824 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX