annotate src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents 89e0543e1737
children 2a1472c30599
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
948
89e0543e1737 6884624: Update copyright year
xdono
parents: 941
diff changeset
2 * Copyright 2005-2009 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 //
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // psPromotionManager is used by a single thread to manage object survival
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // during a scavenge. The promotion manager contains thread local data only.
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // NOTE! Be carefull when allocating the stacks on cheap. If you are going
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // to use a promotion manager in more than one thread, the stacks MUST be
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // on cheap. This can lead to memory leaks, though, as they are not auto
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // deallocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 //
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // FIX ME FIX ME Add a destructor, and don't rely on the user to drain/flush/deallocate!
a61af66fc99e Initial load
duke
parents:
diff changeset
35 //
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Move to some global location
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #define HAS_BEEN_MOVED 0x1501d01d
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // End move to some global location
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class MutableSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class PSOldGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class ParCompactionManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class ObjectStartArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class ParallelCompactData;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ParMarkBitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Move to it's own file if this works out.
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class ParCompactionManager : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 friend class ParallelTaskTerminator;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 friend class ParMarkBitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 friend class PSParallelCompact;
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
55 friend class StealRegionCompactionTask;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 friend class UpdateAndFillClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 friend class RefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // ------------------------ Don't putback if not needed
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // Actions that the compaction manager should take.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 enum Action {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 Update,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 Copy,
a61af66fc99e Initial load
duke
parents:
diff changeset
66 UpdateAndCopy,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 CopyAndUpdate,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 VerifyUpdate,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 ResetObjects,
a61af66fc99e Initial load
duke
parents:
diff changeset
70 NotValid
a61af66fc99e Initial load
duke
parents:
diff changeset
71 };
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // ------------------------ End don't putback if not needed
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 private:
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
75 static ParCompactionManager** _manager_array;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
76 static OopTaskQueueSet* _stack_array;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
77 static ObjectStartArray* _start_array;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
78 static RegionTaskQueueSet* _region_array;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
79 static PSOldGen* _old_gen;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
81 OopTaskQueue _marking_stack;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
82 GrowableArray<oop>* _overflow_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Is there a way to reuse the _marking_stack for the
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
84 // saving empty regions? For now just create a different
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // type of TaskQueue.
a61af66fc99e Initial load
duke
parents:
diff changeset
86
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
87 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
88 RegionTaskQueueWithOverflow _region_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
90 RegionTaskQueue _region_stack;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
91 GrowableArray<size_t>* _region_overflow_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 #if 1 // does this happen enough to need a per thread stack?
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
95 GrowableArray<Klass*>* _revisit_klass_stack;
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
96 GrowableArray<DataLayout*>* _revisit_mdo_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
98 static ParMarkBitMap* _mark_bitmap;
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 Action _action;
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 static PSOldGen* old_gen() { return _old_gen; }
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static ObjectStartArray* start_array() { return _start_array; }
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
104 static OopTaskQueueSet* stack_array() { return _stack_array; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static void initialize(ParMarkBitMap* mbm);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Array of tasks. Needed by the ParallelTaskTerminator.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
110 static RegionTaskQueueSet* region_array() { return _region_array; }
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
111 OopTaskQueue* marking_stack() { return &_marking_stack; }
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
112 GrowableArray<oop>* overflow_stack() { return _overflow_stack; }
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
113 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
114 RegionTaskQueueWithOverflow* region_stack() { return &_region_stack; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
116 RegionTaskQueue* region_stack() { return &_region_stack; }
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
117 GrowableArray<size_t>* region_overflow_stack() {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
118 return _region_overflow_stack;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
119 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Pushes onto the marking stack. If the marking stack is full,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // pushes onto the overflow stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void stack_push(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Do not implement an equivalent stack_pop. Deal with the
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // marking stack and overflow stack directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
127
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
128 // Pushes onto the region stack. If the region stack is full,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
129 // pushes onto the region overflow stack.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
130 void region_stack_push(size_t region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 Action action() { return _action; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void set_action(Action v) { _action = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 inline static ParCompactionManager* manager_array(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 ParCompactionManager();
a61af66fc99e Initial load
duke
parents:
diff changeset
139 ~ParCompactionManager();
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 void allocate_stacks();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void deallocate_stacks();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 ParMarkBitMap* mark_bitmap() { return _mark_bitmap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Take actions in preparation for a compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
146 static void reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // void drain_stacks();
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 bool should_update();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool should_copy();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 bool should_verify_only();
a61af66fc99e Initial load
duke
parents:
diff changeset
153 bool should_reset_only();
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #if 1
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Probably stays as a growable array
a61af66fc99e Initial load
duke
parents:
diff changeset
157 GrowableArray<Klass*>* revisit_klass_stack() { return _revisit_klass_stack; }
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
158 GrowableArray<DataLayout*>* revisit_mdo_stack() { return _revisit_mdo_stack; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Save oop for later processing. Must not fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 void save_for_scanning(oop m);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Get a oop for scanning. If returns null, no oop were found.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 oop retrieve_for_scanning();
a61af66fc99e Initial load
duke
parents:
diff changeset
165
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
166 // Save region for later processing. Must not fail.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
167 void save_for_processing(size_t region_index);
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
168 // Get a region for processing. If returns null, no region were found.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
169 bool retrieve_for_processing(size_t& region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Access function for compaction managers
a61af66fc99e Initial load
duke
parents:
diff changeset
172 static ParCompactionManager* gc_thread_compaction_manager(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 static bool steal(int queue_num, int* seed, Task& t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return stack_array()->steal(queue_num, seed, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
178 static bool steal(int queue_num, int* seed, RegionTask& t) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
179 return region_array()->steal(queue_num, seed, t);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Process tasks remaining on any stack
a61af66fc99e Initial load
duke
parents:
diff changeset
183 void drain_marking_stacks(OopClosure *blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Process tasks remaining on any stack
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
186 void drain_region_stacks();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Process tasks remaining on any stack
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
189 void drain_region_overflow_stack();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Debugging support
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
193 bool stacks_have_been_allocated();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
195 };
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 inline ParCompactionManager* ParCompactionManager::manager_array(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 assert(_manager_array != NULL, "access of NULL manager_array");
a61af66fc99e Initial load
duke
parents:
diff changeset
199 assert(index >= 0 && index <= (int)ParallelGCThreads,
a61af66fc99e Initial load
duke
parents:
diff changeset
200 "out of range manager_array access");
a61af66fc99e Initial load
duke
parents:
diff changeset
201 return _manager_array[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }