1 /*
2 * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
30 #include "gc/shared/gcId.hpp"
31 #include "gc/shared/gcTimer.hpp"
32 #include "gc/shared/gcTraceTime.inline.hpp"
33 #include "gc/shared/isGCActiveMark.hpp"
34 #include "memory/universe.hpp"
35 #include "runtime/interfaceSupport.inline.hpp"
36
37 void VM_G1CollectFull::doit() {
38 G1CollectedHeap* g1h = G1CollectedHeap::heap();
39 GCCauseSetter x(g1h, _gc_cause);
40 _gc_succeeded = g1h->do_full_collection(true /* explicit_gc */, false /* clear_all_soft_refs */);
41 }
42
43 VM_G1TryInitiateConcMark::VM_G1TryInitiateConcMark(uint gc_count_before,
44 GCCause::Cause gc_cause,
45 double target_pause_time_ms) :
46 VM_GC_Operation(gc_count_before, gc_cause),
47 _target_pause_time_ms(target_pause_time_ms),
48 _transient_failure(false),
49 _cycle_already_in_progress(false),
50 _gc_succeeded(false)
51 {}
52
53 bool VM_G1TryInitiateConcMark::doit_prologue() {
54 bool result = VM_GC_Operation::doit_prologue();
55 // The prologue can fail for a couple of reasons. The first is that another GC
56 // got scheduled and prevented the scheduling of the initial mark GC. The
57 // second is that the GC locker may be active and the heap can't be expanded.
58 // In both cases we want to retry the GC so that the initial mark pause is
59 // actually scheduled. In the second case, however, we should stall until
60 // until the GC locker is no longer active and then retry the initial mark GC.
61 if (!result) _transient_failure = true;
62 return result;
63 }
64
65 void VM_G1TryInitiateConcMark::doit() {
66 G1CollectedHeap* g1h = G1CollectedHeap::heap();
67
68 GCCauseSetter x(g1h, _gc_cause);
69 if (!g1h->policy()->force_initial_mark_if_outside_cycle(_gc_cause)) {
70 // Failure to force the next GC pause to be an initial mark indicates
71 // there is already a concurrent marking cycle in progress. Set flag
72 // to notify the caller and return immediately.
73 _cycle_already_in_progress = true;
74 } else if (!g1h->do_collection_pause_at_safepoint(_target_pause_time_ms)) {
75 // Failure to perform the collection at all occurs because GCLocker is
76 // active, and we have the bad luck to be the collection request that
77 // makes a later _gc_locker collection needed. (Else we would have hit
78 // the GCLocker check in the prologue.)
79 _transient_failure = true;
80 } else if (g1h->should_upgrade_to_full_gc(_gc_cause)) {
81 // GC ran, but we're still in trouble and need a full GC.
82 log_info(gc, ergo)("Attempting maximally compacting collection");
83 _gc_succeeded = g1h->do_full_collection(false, /* explicit gc */
84 true /* clear_all_soft_refs */);
85 guarantee(_gc_succeeded, "Elevated collections during the safepoint must always succeed");
86 } else {
87 _gc_succeeded = true;
88 }
89 }
|
1 /*
2 * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
30 #include "gc/shared/gcId.hpp"
31 #include "gc/shared/gcTimer.hpp"
32 #include "gc/shared/gcTraceTime.inline.hpp"
33 #include "gc/shared/isGCActiveMark.hpp"
34 #include "memory/universe.hpp"
35 #include "runtime/interfaceSupport.inline.hpp"
36
37 void VM_G1CollectFull::doit() {
38 G1CollectedHeap* g1h = G1CollectedHeap::heap();
39 GCCauseSetter x(g1h, _gc_cause);
40 _gc_succeeded = g1h->do_full_collection(true /* explicit_gc */, false /* clear_all_soft_refs */);
41 }
42
43 VM_G1TryInitiateConcMark::VM_G1TryInitiateConcMark(uint gc_count_before,
44 GCCause::Cause gc_cause,
45 double target_pause_time_ms) :
46 VM_GC_Operation(gc_count_before, gc_cause),
47 _target_pause_time_ms(target_pause_time_ms),
48 _transient_failure(false),
49 _cycle_already_in_progress(false),
50 _terminating(false),
51 _gc_succeeded(false)
52 {}
53
54 bool VM_G1TryInitiateConcMark::doit_prologue() {
55 bool result = VM_GC_Operation::doit_prologue();
56 // The prologue can fail for a couple of reasons. The first is that another GC
57 // got scheduled and prevented the scheduling of the initial mark GC. The
58 // second is that the GC locker may be active and the heap can't be expanded.
59 // In both cases we want to retry the GC so that the initial mark pause is
60 // actually scheduled. In the second case, however, we should stall until
61 // until the GC locker is no longer active and then retry the initial mark GC.
62 if (!result) _transient_failure = true;
63 return result;
64 }
65
66 void VM_G1TryInitiateConcMark::doit() {
67 G1CollectedHeap* g1h = G1CollectedHeap::heap();
68
69 GCCauseSetter x(g1h, _gc_cause);
70
71 // Record for handling by caller.
72 _terminating = g1h->_cm_thread->should_terminate();
73
74 if (_terminating && GCCause::is_user_requested_gc(_gc_cause)) {
75 // When terminating, the request to initiate a concurrent cycle will be
76 // ignored by do_collection_pause_at_safepoint; instead it will just do
77 // a young-only or mixed GC (depending on phase). For a user request
78 // there's no point in even doing that much, so done. For some non-user
79 // requests the alternative GC might still be needed.
80 } else if (!g1h->policy()->force_initial_mark_if_outside_cycle(_gc_cause)) {
81 // Failure to force the next GC pause to be an initial mark indicates
82 // there is already a concurrent marking cycle in progress. Set flag
83 // to notify the caller and return immediately.
84 _cycle_already_in_progress = true;
85 } else if (!g1h->do_collection_pause_at_safepoint(_target_pause_time_ms)) {
86 // Failure to perform the collection at all occurs because GCLocker is
87 // active, and we have the bad luck to be the collection request that
88 // makes a later _gc_locker collection needed. (Else we would have hit
89 // the GCLocker check in the prologue.)
90 _transient_failure = true;
91 } else if (g1h->should_upgrade_to_full_gc(_gc_cause)) {
92 // GC ran, but we're still in trouble and need a full GC.
93 log_info(gc, ergo)("Attempting maximally compacting collection");
94 _gc_succeeded = g1h->do_full_collection(false, /* explicit gc */
95 true /* clear_all_soft_refs */);
96 guarantee(_gc_succeeded, "Elevated collections during the safepoint must always succeed");
97 } else {
98 _gc_succeeded = true;
99 }
100 }
|