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 *
23 */
24
25#ifndef SHARE_GC_PARALLEL_PSMARKSWEEP_HPP
26#define SHARE_GC_PARALLEL_PSMARKSWEEP_HPP
27
28#include "gc/serial/markSweep.hpp"
29#include "gc/shared/collectorCounters.hpp"
30#include "gc/shared/referenceProcessor.hpp"
31#include "utilities/stack.hpp"
32
33class PSAdaptiveSizePolicy;
34class PSYoungGen;
35class PSOldGen;
36
37class PSMarkSweep : public MarkSweep {
38 private:
39 static elapsedTimer _accumulated_time;
40 static jlong _time_of_last_gc; // ms
41 static CollectorCounters* _counters;
42
43 static SpanSubjectToDiscoveryClosure _span_based_discoverer;
44
45 // Closure accessors
46 static OopClosure* mark_and_push_closure() { return &MarkSweep::mark_and_push_closure; }
47 static VoidClosure* follow_stack_closure() { return &MarkSweep::follow_stack_closure; }
48 static CLDClosure* follow_cld_closure() { return &MarkSweep::follow_cld_closure; }
49 static OopClosure* adjust_pointer_closure() { return &MarkSweep::adjust_pointer_closure; }
50 static CLDClosure* adjust_cld_closure() { return &MarkSweep::adjust_cld_closure; }
51 static BoolObjectClosure* is_alive_closure() { return &MarkSweep::is_alive; }
52
53 // Mark live objects
54 static void mark_sweep_phase1(bool clear_all_softrefs);
55 // Calculate new addresses
56 static void mark_sweep_phase2();
57 // Update pointers
58 static void mark_sweep_phase3();
59 // Move objects to new positions
60 static void mark_sweep_phase4();
61
62 // Temporary data structures for traversal and storing/restoring marks
63 static void allocate_stacks();
64 static void deallocate_stacks();
65
66 // If objects are left in eden after a collection, try to move the boundary
67 // and absorb them into the old gen. Returns true if eden was emptied.
68 static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
69 PSYoungGen* young_gen,
70 PSOldGen* old_gen);
71
72 // Reset time since last full gc
73 static void reset_millis_since_last_gc();
74
75 public:
76 static void invoke(bool clear_all_softrefs);
77 static bool invoke_no_policy(bool clear_all_softrefs);
78
79 static void initialize();
80
81 // Public accessors
82 static elapsedTimer* accumulated_time() { return &_accumulated_time; }
83 static CollectorCounters* counters() { return _counters; }
84
85 // Time since last full gc (in milliseconds)
86 static jlong millis_since_last_gc();
87};
88
89#endif // SHARE_GC_PARALLEL_PSMARKSWEEP_HPP
90