annotate src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp @ 795:215f81b4d9b3

6841831: G1: assert(contains_reference(from),"We just added it!") fires Summary: During parallel rset updating we have to make sure that the worker ids of the refinement threads do not intersect with the worker ids that can be claimed by the mutator threads. Reviewed-by: tonyp
author iveresov
date Mon, 18 May 2009 11:52:46 -0700
parents d1605aabd0a1
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class GCTaskManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class GCTaskQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class OopStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class ReferenceProcessor;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class ParallelScavengeHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class PSIsAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class PSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class PSScavenge: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 friend class PSIsAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 friend class PSKeepAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 friend class PSPromotionManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 enum ScavengeSkippedCause {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 not_skipped = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 to_space_not_empty,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 promoted_too_large,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 full_follows_scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
43 };
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Saved value of to_space->top(), used to prevent objects in to_space from
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // being rescanned.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 static HeapWord* _to_space_top_before_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Number of consecutive attempts to scavenge that were skipped
a61af66fc99e Initial load
duke
parents:
diff changeset
50 static int _consecutive_skipped_scavenges;
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // Flags/counters
a61af66fc99e Initial load
duke
parents:
diff changeset
55 static ReferenceProcessor* _ref_processor; // Reference processor for scavenging.
a61af66fc99e Initial load
duke
parents:
diff changeset
56 static PSIsAliveClosure _is_alive_closure; // Closure used for reference processing
a61af66fc99e Initial load
duke
parents:
diff changeset
57 static CardTableExtension* _card_table; // We cache the card table for fast access.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 static bool _survivor_overflow; // Overflow this collection
a61af66fc99e Initial load
duke
parents:
diff changeset
59 static int _tenuring_threshold; // tenuring threshold for next scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
60 static elapsedTimer _accumulated_time; // total time spent on scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
61 static HeapWord* _young_generation_boundary; // The lowest address possible for the young_gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // This is used to decide if an oop should be scavenged,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // cards should be marked, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
64 static GrowableArray<markOop>* _preserved_mark_stack; // List of marks to be restored after failed promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static GrowableArray<oop>* _preserved_oop_stack; // List of oops that need their mark restored.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static CollectorCounters* _counters; // collector performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static void clean_up_failed_promotion();
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static bool should_attempt_scavenge();
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 static HeapWord* to_space_top_before_gc() { return _to_space_top_before_gc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 static inline void save_to_space_top_before_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Private accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static CardTableExtension* const card_table() { assert(_card_table != NULL, "Sanity"); return _card_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
80 static int tenuring_threshold() { return _tenuring_threshold; }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static elapsedTimer* accumulated_time() { return &_accumulated_time; }
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static bool promotion_failed()
a61af66fc99e Initial load
duke
parents:
diff changeset
83 { return _preserved_mark_stack != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 static int consecutive_skipped_scavenges()
a61af66fc99e Initial load
duke
parents:
diff changeset
85 { return _consecutive_skipped_scavenges; }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static CollectorCounters* counters() { return _counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Used by scavenge_contents && psMarkSweep
a61af66fc99e Initial load
duke
parents:
diff changeset
91 static ReferenceProcessor* const reference_processor() {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 assert(_ref_processor != NULL, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
93 return _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Used to add tasks
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static GCTaskManager* const gc_task_manager();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The promotion managers tell us if they encountered overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
98 static void set_survivor_overflow(bool state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _survivor_overflow = state;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Adaptive size policy support. When the young generation/old generation
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // boundary moves, _young_generation_boundary must be reset
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static void set_young_generation_boundary(HeapWord* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _young_generation_boundary = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Called by parallelScavengeHeap to init the tenuring threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Scavenge entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
111 static void invoke();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Return true is a collection was done. Return
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // false if the collection was skipped.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 static bool invoke_no_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // If an attempt to promote fails, this method is invoked
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static void oop_promotion_failed(oop obj, markOop obj_mark);
a61af66fc99e Initial load
duke
parents:
diff changeset
118
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
119 template <class T> static inline bool should_scavenge(T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // These call should_scavenge() above and, if it returns true, also check that
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // the object was not newly copied into to_space. The version with the bool
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // argument is a convenience wrapper that fetches the to_space pointer from
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // the heap and calls the other version (if the arg is true).
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
125 template <class T> static inline bool should_scavenge(T* p, MutableSpace* to_space);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
126 template <class T> static inline bool should_scavenge(T* p, bool check_to_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
128 template <class T> inline static void copy_and_push_safe_barrier(PSPromotionManager* pm, T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Is an object in the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // This assumes that the HeapWord argument is in the heap,
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // so it only checks one side of the complete predicate.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 inline static bool is_obj_in_young(HeapWord* o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 const bool result = (o >= _young_generation_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 };