< 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 >