< prev index next >

src/hotspot/share/gc/g1/vm_operations_g1.hpp

Print this page
rev 48467 : 8137099: G1 needs to "upgrade" GC within the safepoint if it can't allocate during that safepoint to avoid OoME
Summary: During a minor GC, if memory allocation fails, start a full GC within the same VM operation in the same safepoint. This avoids a race where the GC locker can prevent the full GC from occurring, and a premature OoME.
Reviewed-by:
Contributed-by: thomas.schatzl@oracle.com, axel.siebenborn@sap.com
rev 48469 : imported patch 8137099-sjohanns-messages
rev 48470 : [mq]: 8137099-erikd-review

*** 1,7 **** /* ! * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 30,104 **** #include "gc/shared/vmGCOperations.hpp" // VM_operations for the G1 collector. // VM_GC_Operation: // - VM_CGC_Operation - // - VM_G1CollectFull - // - VM_G1OperationWithAllocRequest // - VM_G1CollectForAllocation ! // - VM_G1IncCollectionPause ! ! class VM_G1OperationWithAllocRequest : public VM_CollectForAllocation { ! protected: ! bool _pause_succeeded; ! AllocationContext_t _allocation_context; ! ! public: ! VM_G1OperationWithAllocRequest(uint gc_count_before, ! size_t word_size, ! GCCause::Cause gc_cause) ! : VM_CollectForAllocation(word_size, gc_count_before, gc_cause), ! _pause_succeeded(false) {} ! bool pause_succeeded() { return _pause_succeeded; } ! void set_allocation_context(AllocationContext_t context) { _allocation_context = context; } ! AllocationContext_t allocation_context() { return _allocation_context; } ! }; class VM_G1CollectFull: public VM_GC_Operation { public: VM_G1CollectFull(uint gc_count_before, uint full_gc_count_before, GCCause::Cause cause) : VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { } virtual VMOp_Type type() const { return VMOp_G1CollectFull; } virtual void doit(); virtual const char* name() const { ! return "full garbage-first collection"; } }; ! class VM_G1CollectForAllocation: public VM_G1OperationWithAllocRequest { ! public: ! VM_G1CollectForAllocation(uint gc_count_before, ! size_t word_size); ! virtual VMOp_Type type() const { return VMOp_G1CollectForAllocation; } ! virtual void doit(); ! virtual const char* name() const { ! return "garbage-first collection to satisfy allocation"; ! } ! }; ! ! class VM_G1IncCollectionPause: public VM_G1OperationWithAllocRequest { private: bool _should_initiate_conc_mark; bool _should_retry_gc; double _target_pause_time_ms; uint _old_marking_cycles_completed_before; public: ! VM_G1IncCollectionPause(uint gc_count_before, ! size_t word_size, bool should_initiate_conc_mark, double target_pause_time_ms, ! GCCause::Cause gc_cause); ! virtual VMOp_Type type() const { return VMOp_G1IncCollectionPause; } virtual bool doit_prologue(); virtual void doit(); virtual void doit_epilogue(); virtual const char* name() const { ! return "garbage-first incremental collection pause"; } bool should_retry_gc() const { return _should_retry_gc; } }; // Concurrent GC stop-the-world operations such as remark and cleanup; // consider sharing these with CMS's counterparts. class VM_CGC_Operation: public VM_Operation { --- 30,80 ---- #include "gc/shared/vmGCOperations.hpp" // VM_operations for the G1 collector. // VM_GC_Operation: // - VM_CGC_Operation // - VM_G1CollectForAllocation ! // - VM_G1CollectFull class VM_G1CollectFull: public VM_GC_Operation { public: VM_G1CollectFull(uint gc_count_before, uint full_gc_count_before, GCCause::Cause cause) : VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { } virtual VMOp_Type type() const { return VMOp_G1CollectFull; } virtual void doit(); virtual const char* name() const { ! return "G1 Full collection"; } }; ! class VM_G1CollectForAllocation: public VM_CollectForAllocation { private: + bool _pause_succeeded; + AllocationContext_t _allocation_context; + bool _should_initiate_conc_mark; bool _should_retry_gc; double _target_pause_time_ms; uint _old_marking_cycles_completed_before; public: ! VM_G1CollectForAllocation(size_t word_size, ! uint gc_count_before, ! GCCause::Cause gc_cause, bool should_initiate_conc_mark, double target_pause_time_ms, ! AllocationContext_t allocation_context); ! virtual VMOp_Type type() const { return VMOp_G1CollectForAllocation; } virtual bool doit_prologue(); virtual void doit(); virtual void doit_epilogue(); virtual const char* name() const { ! return "G1 collect for allocation"; } bool should_retry_gc() const { return _should_retry_gc; } + bool pause_succeeded() { return _pause_succeeded; } }; // Concurrent GC stop-the-world operations such as remark and cleanup; // consider sharing these with CMS's counterparts. class VM_CGC_Operation: public VM_Operation {
< prev index next >