author | stefank |
Thu, 01 Sep 2011 16:18:17 +0200 | |
changeset 10524 | 6594ca81279a |
parent 7397 | 5b173b4ca846 |
child 11753 | c9e420473a11 |
permissions | -rw-r--r-- |
1 | 1 |
/* |
7397 | 2 |
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. |
1 | 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 |
* |
|
5547
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
670
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
670
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
670
diff
changeset
|
21 |
* questions. |
1 | 22 |
* |
23 |
*/ |
|
24 |
||
7397 | 25 |
#ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP |
26 |
#define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP |
|
27 |
||
28 |
#include "gc_implementation/parallelScavenge/cardTableExtension.hpp" |
|
29 |
#include "gc_implementation/parallelScavenge/psVirtualspace.hpp" |
|
30 |
#include "gc_implementation/shared/collectorCounters.hpp" |
|
31 |
#include "memory/allocation.hpp" |
|
32 |
#include "oops/oop.hpp" |
|
33 |
#include "utilities/stack.hpp" |
|
34 |
||
1 | 35 |
class GCTaskManager; |
36 |
class GCTaskQueue; |
|
37 |
class OopStack; |
|
38 |
class ReferenceProcessor; |
|
39 |
class ParallelScavengeHeap; |
|
40 |
class PSIsAliveClosure; |
|
41 |
class PSRefProcTaskExecutor; |
|
42 |
||
43 |
class PSScavenge: AllStatic { |
|
44 |
friend class PSIsAliveClosure; |
|
45 |
friend class PSKeepAliveClosure; |
|
46 |
friend class PSPromotionManager; |
|
47 |
||
48 |
enum ScavengeSkippedCause { |
|
49 |
not_skipped = 0, |
|
50 |
to_space_not_empty, |
|
51 |
promoted_too_large, |
|
52 |
full_follows_scavenge |
|
53 |
}; |
|
54 |
||
55 |
// Saved value of to_space->top(), used to prevent objects in to_space from |
|
56 |
// being rescanned. |
|
57 |
static HeapWord* _to_space_top_before_gc; |
|
58 |
||
59 |
// Number of consecutive attempts to scavenge that were skipped |
|
60 |
static int _consecutive_skipped_scavenges; |
|
61 |
||
62 |
||
63 |
protected: |
|
64 |
// Flags/counters |
|
65 |
static ReferenceProcessor* _ref_processor; // Reference processor for scavenging. |
|
66 |
static PSIsAliveClosure _is_alive_closure; // Closure used for reference processing |
|
67 |
static CardTableExtension* _card_table; // We cache the card table for fast access. |
|
68 |
static bool _survivor_overflow; // Overflow this collection |
|
69 |
static int _tenuring_threshold; // tenuring threshold for next scavenge |
|
70 |
static elapsedTimer _accumulated_time; // total time spent on scavenge |
|
71 |
static HeapWord* _young_generation_boundary; // The lowest address possible for the young_gen. |
|
72 |
// This is used to decide if an oop should be scavenged, |
|
73 |
// cards should be marked, etc. |
|
6762
f8d1b560700e
6423256: GC stacks should use a better data structure
jcoomes
parents:
5547
diff
changeset
|
74 |
static Stack<markOop> _preserved_mark_stack; // List of marks to be restored after failed promotion |
f8d1b560700e
6423256: GC stacks should use a better data structure
jcoomes
parents:
5547
diff
changeset
|
75 |
static Stack<oop> _preserved_oop_stack; // List of oops that need their mark restored. |
1 | 76 |
static CollectorCounters* _counters; // collector performance counters |
6762
f8d1b560700e
6423256: GC stacks should use a better data structure
jcoomes
parents:
5547
diff
changeset
|
77 |
static bool _promotion_failed; |
1 | 78 |
|
79 |
static void clean_up_failed_promotion(); |
|
80 |
||
81 |
static bool should_attempt_scavenge(); |
|
82 |
||
83 |
static HeapWord* to_space_top_before_gc() { return _to_space_top_before_gc; } |
|
84 |
static inline void save_to_space_top_before_gc(); |
|
85 |
||
86 |
// Private accessors |
|
87 |
static CardTableExtension* const card_table() { assert(_card_table != NULL, "Sanity"); return _card_table; } |
|
88 |
||
89 |
public: |
|
90 |
// Accessors |
|
91 |
static int tenuring_threshold() { return _tenuring_threshold; } |
|
92 |
static elapsedTimer* accumulated_time() { return &_accumulated_time; } |
|
6762
f8d1b560700e
6423256: GC stacks should use a better data structure
jcoomes
parents:
5547
diff
changeset
|
93 |
static bool promotion_failed() { return _promotion_failed; } |
1 | 94 |
static int consecutive_skipped_scavenges() |
95 |
{ return _consecutive_skipped_scavenges; } |
|
96 |
||
97 |
// Performance Counters |
|
98 |
static CollectorCounters* counters() { return _counters; } |
|
99 |
||
100 |
// Used by scavenge_contents && psMarkSweep |
|
101 |
static ReferenceProcessor* const reference_processor() { |
|
102 |
assert(_ref_processor != NULL, "Sanity"); |
|
103 |
return _ref_processor; |
|
104 |
} |
|
105 |
// Used to add tasks |
|
106 |
static GCTaskManager* const gc_task_manager(); |
|
107 |
// The promotion managers tell us if they encountered overflow |
|
108 |
static void set_survivor_overflow(bool state) { |
|
109 |
_survivor_overflow = state; |
|
110 |
} |
|
111 |
// Adaptive size policy support. When the young generation/old generation |
|
112 |
// boundary moves, _young_generation_boundary must be reset |
|
113 |
static void set_young_generation_boundary(HeapWord* v) { |
|
114 |
_young_generation_boundary = v; |
|
115 |
} |
|
116 |
||
117 |
// Called by parallelScavengeHeap to init the tenuring threshold |
|
118 |
static void initialize(); |
|
119 |
||
120 |
// Scavenge entry point |
|
121 |
static void invoke(); |
|
122 |
// Return true is a collection was done. Return |
|
123 |
// false if the collection was skipped. |
|
124 |
static bool invoke_no_policy(); |
|
125 |
||
126 |
// If an attempt to promote fails, this method is invoked |
|
127 |
static void oop_promotion_failed(oop obj, markOop obj_mark); |
|
128 |
||
360
21d113ecbf6a
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
1
diff
changeset
|
129 |
template <class T> static inline bool should_scavenge(T* p); |
1 | 130 |
|
131 |
// These call should_scavenge() above and, if it returns true, also check that |
|
132 |
// the object was not newly copied into to_space. The version with the bool |
|
133 |
// argument is a convenience wrapper that fetches the to_space pointer from |
|
134 |
// the heap and calls the other version (if the arg is true). |
|
360
21d113ecbf6a
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
1
diff
changeset
|
135 |
template <class T> static inline bool should_scavenge(T* p, MutableSpace* to_space); |
21d113ecbf6a
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
1
diff
changeset
|
136 |
template <class T> static inline bool should_scavenge(T* p, bool check_to_space); |
1 | 137 |
|
360
21d113ecbf6a
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
1
diff
changeset
|
138 |
template <class T> inline static void copy_and_push_safe_barrier(PSPromotionManager* pm, T* p); |
1 | 139 |
|
140 |
// Is an object in the young generation |
|
141 |
// This assumes that the HeapWord argument is in the heap, |
|
142 |
// so it only checks one side of the complete predicate. |
|
143 |
inline static bool is_obj_in_young(HeapWord* o) { |
|
144 |
const bool result = (o >= _young_generation_boundary); |
|
145 |
return result; |
|
146 |
} |
|
147 |
}; |
|
7397 | 148 |
|
149 |
#endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP |