vm_operations_g1.hpp revision 8413:92457dfb91bd
1/*
2 * Copyright (c) 2001, 2015, 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 *
23 */
24
25#ifndef SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
26#define SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
27
28#include "gc/g1/g1AllocationContext.hpp"
29#include "gc/shared/vmGCOperations.hpp"
30
31// VM_operations for the G1 collector.
32// VM_GC_Operation:
33//   - VM_CGC_Operation
34//   - VM_G1CollectFull
35//   - VM_G1OperationWithAllocRequest
36//     - VM_G1CollectForAllocation
37//     - VM_G1IncCollectionPause
38
39class VM_G1OperationWithAllocRequest : public VM_CollectForAllocation {
40protected:
41  bool      _pause_succeeded;
42  AllocationContext_t _allocation_context;
43
44public:
45  VM_G1OperationWithAllocRequest(uint           gc_count_before,
46                                 size_t         word_size,
47                                 GCCause::Cause gc_cause)
48    : VM_CollectForAllocation(word_size, gc_count_before, gc_cause),
49      _pause_succeeded(false) {}
50  bool pause_succeeded() { return _pause_succeeded; }
51  void set_allocation_context(AllocationContext_t context) { _allocation_context = context; }
52  AllocationContext_t  allocation_context() { return _allocation_context; }
53};
54
55class VM_G1CollectFull: public VM_GC_Operation {
56public:
57  VM_G1CollectFull(uint gc_count_before,
58                   uint full_gc_count_before,
59                   GCCause::Cause cause)
60    : VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { }
61  virtual VMOp_Type type() const { return VMOp_G1CollectFull; }
62  virtual void doit();
63  virtual const char* name() const {
64    return "full garbage-first collection";
65  }
66};
67
68class VM_G1CollectForAllocation: public VM_G1OperationWithAllocRequest {
69public:
70  VM_G1CollectForAllocation(uint         gc_count_before,
71                            size_t       word_size);
72  virtual VMOp_Type type() const { return VMOp_G1CollectForAllocation; }
73  virtual void doit();
74  virtual const char* name() const {
75    return "garbage-first collection to satisfy allocation";
76  }
77};
78
79class VM_G1IncCollectionPause: public VM_G1OperationWithAllocRequest {
80private:
81  bool         _should_initiate_conc_mark;
82  bool         _should_retry_gc;
83  double       _target_pause_time_ms;
84  uint         _old_marking_cycles_completed_before;
85public:
86  VM_G1IncCollectionPause(uint           gc_count_before,
87                          size_t         word_size,
88                          bool           should_initiate_conc_mark,
89                          double         target_pause_time_ms,
90                          GCCause::Cause gc_cause);
91  virtual VMOp_Type type() const { return VMOp_G1IncCollectionPause; }
92  virtual bool doit_prologue();
93  virtual void doit();
94  virtual void doit_epilogue();
95  virtual const char* name() const {
96    return "garbage-first incremental collection pause";
97  }
98  bool should_retry_gc() const { return _should_retry_gc; }
99};
100
101// Concurrent GC stop-the-world operations such as remark and cleanup;
102// consider sharing these with CMS's counterparts.
103class VM_CGC_Operation: public VM_Operation {
104  VoidClosure* _cl;
105  const char* _printGCMessage;
106  bool _needs_pll;
107
108protected:
109  // java.lang.ref.Reference support
110  void acquire_pending_list_lock();
111  void release_and_notify_pending_list_lock();
112
113public:
114  VM_CGC_Operation(VoidClosure* cl, const char *printGCMsg, bool needs_pll)
115    : _cl(cl), _printGCMessage(printGCMsg), _needs_pll(needs_pll) { }
116  virtual VMOp_Type type() const { return VMOp_CGC_Operation; }
117  virtual void doit();
118  virtual bool doit_prologue();
119  virtual void doit_epilogue();
120  virtual const char* name() const {
121    return "concurrent gc";
122  }
123};
124
125#endif // SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
126