< prev index next >

src/share/vm/gc/shared/collectorPolicy.cpp

Print this page
rev 8393 : 8077842: Remove the level parameter passed around in GenCollectedHeap
Reviewed-by:


 733 HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
 734                                                         bool   is_tlab) {
 735   GenCollectedHeap *gch = GenCollectedHeap::heap();
 736   GCCauseSetter x(gch, GCCause::_allocation_failure);
 737   HeapWord* result = NULL;
 738 
 739   assert(size != 0, "Precondition violated");
 740   if (GC_locker::is_active_and_needs_gc()) {
 741     // GC locker is active; instead of a collection we will attempt
 742     // to expand the heap, if there's room for expansion.
 743     if (!gch->is_maximal_no_gc()) {
 744       result = expand_heap_and_allocate(size, is_tlab);
 745     }
 746     return result;   // Could be null if we are out of space.
 747   } else if (!gch->incremental_collection_will_fail(false /* don't consult_young */)) {
 748     // Do an incremental collection.
 749     gch->do_collection(false            /* full */,
 750                        false            /* clear_all_soft_refs */,
 751                        size             /* size */,
 752                        is_tlab          /* is_tlab */,
 753                        number_of_generations() - 1 /* max_level */);
 754   } else {
 755     if (Verbose && PrintGCDetails) {
 756       gclog_or_tty->print(" :: Trying full because partial may fail :: ");
 757     }
 758     // Try a full collection; see delta for bug id 6266275
 759     // for the original code and why this has been simplified
 760     // with from-space allocation criteria modified and
 761     // such allocation moved out of the safepoint path.
 762     gch->do_collection(true             /* full */,
 763                        false            /* clear_all_soft_refs */,
 764                        size             /* size */,
 765                        is_tlab          /* is_tlab */,
 766                        number_of_generations() - 1 /* max_level */);
 767   }
 768 
 769   result = gch->attempt_allocation(size, is_tlab, false /*first_only*/);
 770 
 771   if (result != NULL) {
 772     assert(gch->is_in_reserved(result), "result not in heap");
 773     return result;
 774   }
 775 
 776   // OK, collection failed, try expansion.
 777   result = expand_heap_and_allocate(size, is_tlab);
 778   if (result != NULL) {
 779     return result;
 780   }
 781 
 782   // If we reach this point, we're really out of memory. Try every trick
 783   // we can to reclaim memory. Force collection of soft references. Force
 784   // a complete compaction of the heap. Any additional methods for finding
 785   // free memory should be here, especially if they are expensive. If this
 786   // attempt fails, an OOM exception will be thrown.
 787   {
 788     UIntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
 789 
 790     gch->do_collection(true             /* full */,
 791                        true             /* clear_all_soft_refs */,
 792                        size             /* size */,
 793                        is_tlab          /* is_tlab */,
 794                        number_of_generations() - 1 /* max_level */);
 795   }
 796 
 797   result = gch->attempt_allocation(size, is_tlab, false /* first_only */);
 798   if (result != NULL) {
 799     assert(gch->is_in_reserved(result), "result not in heap");
 800     return result;
 801   }
 802 
 803   assert(!should_clear_all_soft_refs(),
 804     "Flag should have been handled and cleared prior to this point");
 805 
 806   // What else?  We might try synchronous finalization later.  If the total
 807   // space available is large enough for the allocation, then a more
 808   // complete compaction phase than we've tried so far might be
 809   // appropriate.
 810   return NULL;
 811 }
 812 
 813 MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation(
 814                                                  ClassLoaderData* loader_data,




 733 HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
 734                                                         bool   is_tlab) {
 735   GenCollectedHeap *gch = GenCollectedHeap::heap();
 736   GCCauseSetter x(gch, GCCause::_allocation_failure);
 737   HeapWord* result = NULL;
 738 
 739   assert(size != 0, "Precondition violated");
 740   if (GC_locker::is_active_and_needs_gc()) {
 741     // GC locker is active; instead of a collection we will attempt
 742     // to expand the heap, if there's room for expansion.
 743     if (!gch->is_maximal_no_gc()) {
 744       result = expand_heap_and_allocate(size, is_tlab);
 745     }
 746     return result;   // Could be null if we are out of space.
 747   } else if (!gch->incremental_collection_will_fail(false /* don't consult_young */)) {
 748     // Do an incremental collection.
 749     gch->do_collection(false            /* full */,
 750                        false            /* clear_all_soft_refs */,
 751                        size             /* size */,
 752                        is_tlab          /* is_tlab */,
 753                        Generation::Old  /* max_generation */);
 754   } else {
 755     if (Verbose && PrintGCDetails) {
 756       gclog_or_tty->print(" :: Trying full because partial may fail :: ");
 757     }
 758     // Try a full collection; see delta for bug id 6266275
 759     // for the original code and why this has been simplified
 760     // with from-space allocation criteria modified and
 761     // such allocation moved out of the safepoint path.
 762     gch->do_collection(true             /* full */,
 763                        false            /* clear_all_soft_refs */,
 764                        size             /* size */,
 765                        is_tlab          /* is_tlab */,
 766                        Generation::Old  /* max_generation */);
 767   }
 768 
 769   result = gch->attempt_allocation(size, is_tlab, false /*first_only*/);
 770 
 771   if (result != NULL) {
 772     assert(gch->is_in_reserved(result), "result not in heap");
 773     return result;
 774   }
 775 
 776   // OK, collection failed, try expansion.
 777   result = expand_heap_and_allocate(size, is_tlab);
 778   if (result != NULL) {
 779     return result;
 780   }
 781 
 782   // If we reach this point, we're really out of memory. Try every trick
 783   // we can to reclaim memory. Force collection of soft references. Force
 784   // a complete compaction of the heap. Any additional methods for finding
 785   // free memory should be here, especially if they are expensive. If this
 786   // attempt fails, an OOM exception will be thrown.
 787   {
 788     UIntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
 789 
 790     gch->do_collection(true             /* full */,
 791                        true             /* clear_all_soft_refs */,
 792                        size             /* size */,
 793                        is_tlab          /* is_tlab */,
 794                        Generation::Old  /* max_generation */);
 795   }
 796 
 797   result = gch->attempt_allocation(size, is_tlab, false /* first_only */);
 798   if (result != NULL) {
 799     assert(gch->is_in_reserved(result), "result not in heap");
 800     return result;
 801   }
 802 
 803   assert(!should_clear_all_soft_refs(),
 804     "Flag should have been handled and cleared prior to this point");
 805 
 806   // What else?  We might try synchronous finalization later.  If the total
 807   // space available is large enough for the allocation, then a more
 808   // complete compaction phase than we've tried so far might be
 809   // appropriate.
 810   return NULL;
 811 }
 812 
 813 MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation(
 814                                                  ClassLoaderData* loader_data,


< prev index next >