47 if (_result == NULL && GCLocker::is_active_and_needs_gc()) { |
47 if (_result == NULL && GCLocker::is_active_and_needs_gc()) { |
48 set_gc_locked(); |
48 set_gc_locked(); |
49 } |
49 } |
50 } |
50 } |
51 |
51 |
|
52 static bool is_cause_full(GCCause::Cause cause) { |
|
53 return (cause != GCCause::_gc_locker) && (cause != GCCause::_wb_young_gc) |
|
54 DEBUG_ONLY(&& (cause != GCCause::_scavenge_alot)); |
|
55 } |
|
56 |
52 // Only used for System.gc() calls |
57 // Only used for System.gc() calls |
53 VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(uint gc_count, |
58 VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(uint gc_count, |
54 uint full_gc_count, |
59 uint full_gc_count, |
55 GCCause::Cause gc_cause) : |
60 GCCause::Cause gc_cause) : |
56 VM_GC_Operation(gc_count, gc_cause, full_gc_count, true /* full */) |
61 VM_GC_Operation(gc_count, gc_cause, full_gc_count, is_cause_full(gc_cause)) |
57 { |
62 { |
58 } |
63 } |
59 |
64 |
60 void VM_ParallelGCSystemGC::doit() { |
65 void VM_ParallelGCSystemGC::doit() { |
61 SvcGCMarker sgcm(SvcGCMarker::FULL); |
66 SvcGCMarker sgcm(SvcGCMarker::FULL); |
62 |
67 |
63 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); |
68 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); |
64 |
69 |
65 GCCauseSetter gccs(heap, _gc_cause); |
70 GCCauseSetter gccs(heap, _gc_cause); |
66 if (_gc_cause == GCCause::_gc_locker || _gc_cause == GCCause::_wb_young_gc |
71 if (!_full) { |
67 DEBUG_ONLY(|| _gc_cause == GCCause::_scavenge_alot)) { |
|
68 // If (and only if) the scavenge fails, this will invoke a full gc. |
72 // If (and only if) the scavenge fails, this will invoke a full gc. |
69 heap->invoke_scavenge(); |
73 heap->invoke_scavenge(); |
70 } else { |
74 } else { |
71 heap->do_full_collection(false); |
75 heap->do_full_collection(false); |
72 } |
76 } |