Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @ 1656:4e5661ba9d98
6944166: G1: explicit GCs are not always handled correctly
Summary: G1 was not handling explicit GCs correctly in many ways. It does now. See the CR for the list of improvements contained in this changeset.
Reviewed-by: iveresov, ysr, johnc
author | tonyp |
---|---|
date | Mon, 28 Jun 2010 14:13:17 -0400 |
parents | 215576b54709 |
children | 2d160770d2e5 |
comparison
equal
deleted
inserted
replaced
1655:e7ec8cd4dd8a | 1656:4e5661ba9d98 |
---|---|
275 | 275 |
276 void setup_surviving_young_words(); | 276 void setup_surviving_young_words(); |
277 void update_surviving_young_words(size_t* surv_young_words); | 277 void update_surviving_young_words(size_t* surv_young_words); |
278 void cleanup_surviving_young_words(); | 278 void cleanup_surviving_young_words(); |
279 | 279 |
280 // It decides whether an explicit GC should start a concurrent cycle | |
281 // instead of doing a STW GC. Currently, a concurrent cycle is | |
282 // explicitly started if: | |
283 // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or | |
284 // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent. | |
285 bool should_do_concurrent_full_gc(GCCause::Cause cause); | |
286 | |
287 // Keeps track of how many "full collections" (i.e., Full GCs or | |
288 // concurrent cycles) we have completed. The number of them we have | |
289 // started is maintained in _total_full_collections in CollectedHeap. | |
290 volatile unsigned int _full_collections_completed; | |
291 | |
280 protected: | 292 protected: |
281 | 293 |
282 // Returns "true" iff none of the gc alloc regions have any allocations | 294 // Returns "true" iff none of the gc alloc regions have any allocations |
283 // since the last call to "save_marks". | 295 // since the last call to "save_marks". |
284 bool all_alloc_regions_no_allocs_since_save_marks(); | 296 bool all_alloc_regions_no_allocs_since_save_marks(); |
354 | 366 |
355 // Retires an allocation region when it is full or at the end of a | 367 // Retires an allocation region when it is full or at the end of a |
356 // GC pause. | 368 // GC pause. |
357 void retire_alloc_region(HeapRegion* alloc_region, bool par); | 369 void retire_alloc_region(HeapRegion* alloc_region, bool par); |
358 | 370 |
359 // Helper function for two callbacks below. | 371 // - if explicit_gc is true, the GC is for a System.gc() or a heap |
360 // "full", if true, indicates that the GC is for a System.gc() request, | 372 // inspection request and should collect the entire heap |
361 // and should collect the entire heap. If "clear_all_soft_refs" is true, | 373 // - if clear_all_soft_refs is true, all soft references are cleared |
362 // all soft references are cleared during the GC. If "full" is false, | 374 // during the GC |
363 // "word_size" describes the allocation that the GC should | 375 // - if explicit_gc is false, word_size describes the allocation that |
364 // attempt (at least) to satisfy. | 376 // the GC should attempt (at least) to satisfy |
365 void do_collection(bool full, bool clear_all_soft_refs, | 377 void do_collection(bool explicit_gc, |
378 bool clear_all_soft_refs, | |
366 size_t word_size); | 379 size_t word_size); |
367 | 380 |
368 // Callback from VM_G1CollectFull operation. | 381 // Callback from VM_G1CollectFull operation. |
369 // Perform a full collection. | 382 // Perform a full collection. |
370 void do_full_collection(bool clear_all_soft_refs); | 383 void do_full_collection(bool clear_all_soft_refs); |
429 assert(_in_cset_fast_test_base != NULL, "sanity"); | 442 assert(_in_cset_fast_test_base != NULL, "sanity"); |
430 memset(_in_cset_fast_test_base, false, | 443 memset(_in_cset_fast_test_base, false, |
431 _in_cset_fast_test_length * sizeof(bool)); | 444 _in_cset_fast_test_length * sizeof(bool)); |
432 } | 445 } |
433 | 446 |
447 // This is called at the end of either a concurrent cycle or a Full | |
448 // GC to update the number of full collections completed. Those two | |
449 // can happen in a nested fashion, i.e., we start a concurrent | |
450 // cycle, a Full GC happens half-way through it which ends first, | |
451 // and then the cycle notices that a Full GC happened and ends | |
452 // too. The outer parameter is a boolean to help us do a bit tighter | |
453 // consistency checking in the method. If outer is false, the caller | |
454 // is the inner caller in the nesting (i.e., the Full GC). If outer | |
455 // is true, the caller is the outer caller in this nesting (i.e., | |
456 // the concurrent cycle). Further nesting is not currently | |
457 // supported. The end of the this call also notifies the | |
458 // FullGCCount_lock in case a Java thread is waiting for a full GC | |
459 // to happen (e.g., it called System.gc() with | |
460 // +ExplicitGCInvokesConcurrent). | |
461 void increment_full_collections_completed(bool outer); | |
462 | |
463 unsigned int full_collections_completed() { | |
464 return _full_collections_completed; | |
465 } | |
466 | |
434 protected: | 467 protected: |
435 | 468 |
436 // Shrink the garbage-first heap by at most the given size (in bytes!). | 469 // Shrink the garbage-first heap by at most the given size (in bytes!). |
437 // (Rounds down to a HeapRegion boundary.) | 470 // (Rounds down to a HeapRegion boundary.) |
438 virtual void shrink(size_t expand_bytes); | 471 virtual void shrink(size_t expand_bytes); |
442 // its live objects elsewhere. | 475 // its live objects elsewhere. |
443 virtual void do_collection_pause(); | 476 virtual void do_collection_pause(); |
444 | 477 |
445 // The guts of the incremental collection pause, executed by the vm | 478 // The guts of the incremental collection pause, executed by the vm |
446 // thread. | 479 // thread. |
447 virtual void do_collection_pause_at_safepoint(); | 480 virtual void do_collection_pause_at_safepoint(double target_pause_time_ms); |
448 | 481 |
449 // Actually do the work of evacuating the collection set. | 482 // Actually do the work of evacuating the collection set. |
450 virtual void evacuate_collection_set(); | 483 virtual void evacuate_collection_set(); |
451 | 484 |
452 // If this is an appropriate right time, do a collection pause. | 485 // If this is an appropriate right time, do a collection pause. |