annotate src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @ 3772:6747fd0512e0

7004681: G1: Extend marking verification to Full GCs Summary: Perform a heap verification after the first phase of G1's full GC using objects' mark words to determine liveness. The third parameter of the heap verification routines, which was used in G1 to determine which marking bitmap to use in liveness calculations, has been changed from a boolean to an enum with values defined for using the mark word, and the 'prev' and 'next' bitmaps. Reviewed-by: tonyp, ysr
author johnc
date Tue, 14 Jun 2011 11:01:10 -0700
parents eda9eb483d29
children 7913e93dca52
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2227
e5383553fd4e 7014851: Remove unused parallel compaction code
stefank
parents: 1972
diff changeset
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPARALLELCOMPACT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPARALLELCOMPACT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
28 #include "gc_implementation/parallelScavenge/objectStartArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
29 #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
30 #include "gc_implementation/parallelScavenge/psCompactionManager.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
31 #include "gc_implementation/shared/collectorCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
32 #include "gc_implementation/shared/markSweep.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
33 #include "gc_implementation/shared/mutableSpace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
34 #include "memory/sharedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
35 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
36
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ParallelScavengeHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class PSAdaptiveSizePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class PSYoungGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class PSOldGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class PSPermGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class ParCompactionManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class ParallelTaskTerminator;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class PSParallelCompact;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class GCTaskManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class GCTaskQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class PreGCValues;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class MoveAndUpdateClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class RefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
51 // The SplitInfo class holds the information needed to 'split' a source region
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
52 // so that the live data can be copied to two destination *spaces*. Normally,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
53 // all the live data in a region is copied to a single destination space (e.g.,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
54 // everything live in a region in eden is copied entirely into the old gen).
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
55 // However, when the heap is nearly full, all the live data in eden may not fit
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
56 // into the old gen. Copying only some of the regions from eden to old gen
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
57 // requires finding a region that does not contain a partial object (i.e., no
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
58 // live object crosses the region boundary) somewhere near the last object that
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
59 // does fit into the old gen. Since it's not always possible to find such a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
60 // region, splitting is necessary for predictable behavior.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
61 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
62 // A region is always split at the end of the partial object. This avoids
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
63 // additional tests when calculating the new location of a pointer, which is a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
64 // very hot code path. The partial object and everything to its left will be
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
65 // copied to another space (call it dest_space_1). The live data to the right
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
66 // of the partial object will be copied either within the space itself, or to a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
67 // different destination space (distinct from dest_space_1).
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
68 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
69 // Split points are identified during the summary phase, when region
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
70 // destinations are computed: data about the split, including the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
71 // partial_object_size, is recorded in a SplitInfo record and the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
72 // partial_object_size field in the summary data is set to zero. The zeroing is
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
73 // possible (and necessary) since the partial object will move to a different
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
74 // destination space than anything to its right, thus the partial object should
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
75 // not affect the locations of any objects to its right.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
76 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
77 // The recorded data is used during the compaction phase, but only rarely: when
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
78 // the partial object on the split region will be copied across a destination
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
79 // region boundary. This test is made once each time a region is filled, and is
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
80 // a simple address comparison, so the overhead is negligible (see
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
81 // PSParallelCompact::first_src_addr()).
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
82 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
83 // Notes:
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
84 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
85 // Only regions with partial objects are split; a region without a partial
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
86 // object does not need any extra bookkeeping.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
87 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
88 // At most one region is split per space, so the amount of data required is
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
89 // constant.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
90 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
91 // A region is split only when the destination space would overflow. Once that
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
92 // happens, the destination space is abandoned and no other data (even from
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
93 // other source spaces) is targeted to that destination space. Abandoning the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
94 // destination space may leave a somewhat large unused area at the end, if a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
95 // large object caused the overflow.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
96 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
97 // Future work:
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
98 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
99 // More bookkeeping would be required to continue to use the destination space.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
100 // The most general solution would allow data from regions in two different
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
101 // source spaces to be "joined" in a single destination region. At the very
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
102 // least, additional code would be required in next_src_region() to detect the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
103 // join and skip to an out-of-order source region. If the join region was also
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
104 // the last destination region to which a split region was copied (the most
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
105 // likely case), then additional work would be needed to get fill_region() to
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
106 // stop iteration and switch to a new source region at the right point. Basic
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
107 // idea would be to use a fake value for the top of the source space. It is
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
108 // doable, if a bit tricky.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
109 //
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
110 // A simpler (but less general) solution would fill the remainder of the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
111 // destination region with a dummy object and continue filling the next
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
112 // destination region.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
113
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
114 class SplitInfo
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
115 {
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
116 public:
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
117 // Return true if this split info is valid (i.e., if a split has been
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
118 // recorded). The very first region cannot have a partial object and thus is
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
119 // never split, so 0 is the 'invalid' value.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
120 bool is_valid() const { return _src_region_idx > 0; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
121
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
122 // Return true if this split holds data for the specified source region.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
123 inline bool is_split(size_t source_region) const;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
124
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
125 // The index of the split region, the size of the partial object on that
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
126 // region and the destination of the partial object.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
127 size_t src_region_idx() const { return _src_region_idx; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
128 size_t partial_obj_size() const { return _partial_obj_size; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
129 HeapWord* destination() const { return _destination; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
130
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
131 // The destination count of the partial object referenced by this split
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
132 // (either 1 or 2). This must be added to the destination count of the
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
133 // remainder of the source region.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
134 unsigned int destination_count() const { return _destination_count; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
135
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
136 // If a word within the partial object will be written to the first word of a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
137 // destination region, this is the address of the destination region;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
138 // otherwise this is NULL.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
139 HeapWord* dest_region_addr() const { return _dest_region_addr; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
140
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
141 // If a word within the partial object will be written to the first word of a
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
142 // destination region, this is the address of that word within the partial
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
143 // object; otherwise this is NULL.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
144 HeapWord* first_src_addr() const { return _first_src_addr; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
145
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
146 // Record the data necessary to split the region src_region_idx.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
147 void record(size_t src_region_idx, size_t partial_obj_size,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
148 HeapWord* destination);
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
149
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
150 void clear();
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
151
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
152 DEBUG_ONLY(void verify_clear();)
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
153
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
154 private:
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
155 size_t _src_region_idx;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
156 size_t _partial_obj_size;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
157 HeapWord* _destination;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
158 unsigned int _destination_count;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
159 HeapWord* _dest_region_addr;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
160 HeapWord* _first_src_addr;
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
161 };
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
162
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
163 inline bool SplitInfo::is_split(size_t region_idx) const
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
164 {
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
165 return _src_region_idx == region_idx && is_valid();
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
166 }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
167
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168 class SpaceInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
169 {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
171 MutableSpace* space() const { return _space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Where the free space will start after the collection. Valid only after the
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // summary phase completes.
a61af66fc99e Initial load
duke
parents:
diff changeset
175 HeapWord* new_top() const { return _new_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Allows new_top to be set.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 HeapWord** new_top_addr() { return &_new_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Where the smallest allowable dense prefix ends (used only for perm gen).
a61af66fc99e Initial load
duke
parents:
diff changeset
181 HeapWord* min_dense_prefix() const { return _min_dense_prefix; }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Where the dense prefix ends, or the compacted region begins.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 HeapWord* dense_prefix() const { return _dense_prefix; }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // The start array for the (generation containing the) space, or NULL if there
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // is no start array.
a61af66fc99e Initial load
duke
parents:
diff changeset
188 ObjectStartArray* start_array() const { return _start_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
190 SplitInfo& split_info() { return _split_info; }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
191
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 void set_space(MutableSpace* s) { _space = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void set_new_top(HeapWord* addr) { _new_top = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 void set_min_dense_prefix(HeapWord* addr) { _min_dense_prefix = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void set_dense_prefix(HeapWord* addr) { _dense_prefix = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void set_start_array(ObjectStartArray* s) { _start_array = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
198 void publish_new_top() const { _space->set_top(_new_top); }
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
199
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
201 MutableSpace* _space;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 HeapWord* _new_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 HeapWord* _min_dense_prefix;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 HeapWord* _dense_prefix;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 ObjectStartArray* _start_array;
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
206 SplitInfo _split_info;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 };
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 class ParallelCompactData
a61af66fc99e Initial load
duke
parents:
diff changeset
210 {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Sizes are in HeapWords, unless indicated otherwise.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
213 static const size_t Log2RegionSize;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
214 static const size_t RegionSize;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
215 static const size_t RegionSizeBytes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
216
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
217 // Mask for the bits in a size_t to get an offset within a region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
218 static const size_t RegionSizeOffsetMask;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
219 // Mask for the bits in a pointer to get an offset within a region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
220 static const size_t RegionAddrOffsetMask;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
221 // Mask for the bits in a pointer to get the address of the start of a region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
222 static const size_t RegionAddrMask;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
224 class RegionData
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225 {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 public:
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
227 // Destination address of the region.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 HeapWord* destination() const { return _destination; }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
230 // The first region containing data destined for this region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
231 size_t source_region() const { return _source_region; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
233 // The object (if any) starting in this region and ending in a different
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
234 // region that could not be updated during the main (parallel) compaction
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // phase. This is different from _partial_obj_addr, which is an object that
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
236 // extends onto a source region. However, the two uses do not overlap in
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // time, so the same field is used to save space.
a61af66fc99e Initial load
duke
parents:
diff changeset
238 HeapWord* deferred_obj_addr() const { return _partial_obj_addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
240 // The starting address of the partial object extending onto the region.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 HeapWord* partial_obj_addr() const { return _partial_obj_addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
243 // Size of the partial object extending onto the region (words).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
244 size_t partial_obj_size() const { return _partial_obj_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
246 // Size of live data that lies within this region due to objects that start
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
247 // in this region (words). This does not include the partial object
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
248 // extending onto the region (if any), or the part of an object that extends
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
249 // onto the next region (if any).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 size_t live_obj_size() const { return _dc_and_los & los_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
252 // Total live data that lies within the region (words).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 size_t data_size() const { return partial_obj_size() + live_obj_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
255 // The destination_count is the number of other regions to which data from
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
256 // this region will be copied. At the end of the summary phase, the valid
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // values of destination_count are
a61af66fc99e Initial load
duke
parents:
diff changeset
258 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
259 // 0 - data from the region will be compacted completely into itself, or the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
260 // region is empty. The region can be claimed and then filled.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
261 // 1 - data from the region will be compacted into 1 other region; some
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
262 // data from the region may also be compacted into the region itself.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
263 // 2 - data from the region will be copied to 2 other regions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
265 // During compaction as regions are emptied, the destination_count is
0
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // decremented (atomically) and when it reaches 0, it can be claimed and
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // then filled.
a61af66fc99e Initial load
duke
parents:
diff changeset
268 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
269 // A region is claimed for processing by atomically changing the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
270 // destination_count to the claimed value (dc_claimed). After a region has
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // been filled, the destination_count should be set to the completed value
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // (dc_completed).
a61af66fc99e Initial load
duke
parents:
diff changeset
273 inline uint destination_count() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 inline uint destination_count_raw() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
275
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
276 // The location of the java heap data that corresponds to this region.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 inline HeapWord* data_location() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
278
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
279 // The highest address referenced by objects in this region.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 inline HeapWord* highest_ref() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
281
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
282 // Whether this region is available to be claimed, has been claimed, or has
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // been completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
285 // Minor subtlety: claimed() returns true if the region is marked
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
286 // completed(), which is desirable since a region must be claimed before it
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // can be completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 bool available() const { return _dc_and_los < dc_one; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 bool claimed() const { return _dc_and_los >= dc_claimed; }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool completed() const { return _dc_and_los >= dc_completed; }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // These are not atomic.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void set_destination(HeapWord* addr) { _destination = addr; }
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
294 void set_source_region(size_t region) { _source_region = region; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void set_deferred_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void set_partial_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void set_partial_obj_size(size_t words) {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
298 _partial_obj_size = (region_sz_t) words;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 inline void set_destination_count(uint count);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 inline void set_live_obj_size(size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 inline void set_data_location(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 inline void set_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
305 inline bool claim_unsafe();
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // These are atomic.
a61af66fc99e Initial load
duke
parents:
diff changeset
308 inline void add_live_obj(size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 inline void set_highest_ref(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 inline void decrement_destination_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 inline bool claim();
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 private:
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
314 // The type used to represent object sizes within a region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
315 typedef uint region_sz_t;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Constants for manipulating the _dc_and_los field, which holds both the
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // destination count and live obj size. The live obj size lives at the
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // least significant end so no masking is necessary when adding.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
320 static const region_sz_t dc_shift; // Shift amount.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
321 static const region_sz_t dc_mask; // Mask for destination count.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
322 static const region_sz_t dc_one; // 1, shifted appropriately.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
323 static const region_sz_t dc_claimed; // Region has been claimed.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
324 static const region_sz_t dc_completed; // Region has been completed.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
325 static const region_sz_t los_mask; // Mask for live obj size.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
327 HeapWord* _destination;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
328 size_t _source_region;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
329 HeapWord* _partial_obj_addr;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
330 region_sz_t _partial_obj_size;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
331 region_sz_t volatile _dc_and_los;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // These enable optimizations that are only partially implemented. Use
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // debug builds to prevent the code fragments from breaking.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
335 HeapWord* _data_location;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
336 HeapWord* _highest_ref;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
340 public:
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
341 uint _pushed; // 0 until region is pushed onto a worker's stack
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
343 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
344 };
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
347 ParallelCompactData();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 bool initialize(MemRegion covered_region);
a61af66fc99e Initial load
duke
parents:
diff changeset
349
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
350 size_t region_count() const { return _region_count; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
352 // Convert region indices to/from RegionData pointers.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
353 inline RegionData* region(size_t region_idx) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
354 inline size_t region(const RegionData* const region_ptr) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
355
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
356 // Returns true if the given address is contained within the region
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
357 bool region_contains(size_t region_index, HeapWord* addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 void add_obj(HeapWord* addr, size_t len);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void add_obj(oop p, size_t len) { add_obj((HeapWord*)p, len); }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
362 // Fill in the regions covering [beg, end) so that no data moves; i.e., the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
363 // destination of region n is simply the start of region n. The argument beg
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
364 // must be region-aligned; end need not be.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365 void summarize_dense_prefix(HeapWord* beg, HeapWord* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
366
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
367 HeapWord* summarize_split_space(size_t src_region, SplitInfo& split_info,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
368 HeapWord* destination, HeapWord* target_end,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
369 HeapWord** target_next);
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
370 bool summarize(SplitInfo& split_info,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371 HeapWord* source_beg, HeapWord* source_end,
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
372 HeapWord** source_next,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
373 HeapWord* target_beg, HeapWord* target_end,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
374 HeapWord** target_next);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void clear();
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
377 void clear_range(size_t beg_region, size_t end_region);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
378 void clear_range(HeapWord* beg, HeapWord* end) {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
379 clear_range(addr_to_region_idx(beg), addr_to_region_idx(end));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
382 // Return the number of words between addr and the start of the region
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // containing addr.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
384 inline size_t region_offset(const HeapWord* addr) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
386 // Convert addresses to/from a region index or region pointer.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
387 inline size_t addr_to_region_idx(const HeapWord* addr) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
388 inline RegionData* addr_to_region_ptr(const HeapWord* addr) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
389 inline HeapWord* region_to_addr(size_t region) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
390 inline HeapWord* region_to_addr(size_t region, size_t offset) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
391 inline HeapWord* region_to_addr(const RegionData* region) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
393 inline HeapWord* region_align_down(HeapWord* addr) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
394 inline HeapWord* region_align_up(HeapWord* addr) const;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
395 inline bool is_region_aligned(HeapWord* addr) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Return the address one past the end of the partial object.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
398 HeapWord* partial_obj_end(size_t region_idx) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Return the new location of the object p after the
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // the compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 HeapWord* calc_new_pointer(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 HeapWord* calc_new_pointer(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 return calc_new_pointer((HeapWord*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Return the updated address for the given klass
a61af66fc99e Initial load
duke
parents:
diff changeset
409 klassOop calc_new_klass(klassOop);
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
412 void verify_clear(const PSVirtualSpace* vspace);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 void verify_clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 private:
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
417 bool initialize_region_data(size_t region_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 PSVirtualSpace* create_vspace(size_t count, size_t element_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
421 HeapWord* _region_start;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
423 HeapWord* _region_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
425
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
426 PSVirtualSpace* _region_vspace;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
427 RegionData* _region_data;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
428 size_t _region_count;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 };
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 inline uint
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
432 ParallelCompactData::RegionData::destination_count_raw() const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return _dc_and_los & dc_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 inline uint
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
438 ParallelCompactData::RegionData::destination_count() const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 return destination_count_raw() >> dc_shift;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 inline void
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
444 ParallelCompactData::RegionData::set_destination_count(uint count)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
445 {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 assert(count <= (dc_completed >> dc_shift), "count too large");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
447 const region_sz_t live_sz = (region_sz_t) live_obj_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 _dc_and_los = (count << dc_shift) | live_sz;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
450
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
451 inline void ParallelCompactData::RegionData::set_live_obj_size(size_t words)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
452 {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 assert(words <= los_mask, "would overflow");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
454 _dc_and_los = destination_count_raw() | (region_sz_t)words;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
457 inline void ParallelCompactData::RegionData::decrement_destination_count()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
458 {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 assert(_dc_and_los < dc_claimed, "already claimed");
a61af66fc99e Initial load
duke
parents:
diff changeset
460 assert(_dc_and_los >= dc_one, "count would go negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
461 Atomic::add((int)dc_mask, (volatile int*)&_dc_and_los);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
464 inline HeapWord* ParallelCompactData::RegionData::data_location() const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
465 {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 DEBUG_ONLY(return _data_location;)
a61af66fc99e Initial load
duke
parents:
diff changeset
467 NOT_DEBUG(return NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
469
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
470 inline HeapWord* ParallelCompactData::RegionData::highest_ref() const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
471 {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 DEBUG_ONLY(return _highest_ref;)
a61af66fc99e Initial load
duke
parents:
diff changeset
473 NOT_DEBUG(return NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
476 inline void ParallelCompactData::RegionData::set_data_location(HeapWord* addr)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
477 {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 DEBUG_ONLY(_data_location = addr;)
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
481 inline void ParallelCompactData::RegionData::set_completed()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
482 {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 assert(claimed(), "must be claimed first");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
484 _dc_and_los = dc_completed | (region_sz_t) live_obj_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
487 // MT-unsafe claiming of a region. Should only be used during single threaded
0
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // execution.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
489 inline bool ParallelCompactData::RegionData::claim_unsafe()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 if (available()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 _dc_and_los |= dc_claimed;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
498 inline void ParallelCompactData::RegionData::add_live_obj(size_t words)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
499 {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 assert(words <= (size_t)los_mask - live_obj_size(), "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
501 Atomic::add((int) words, (volatile int*) &_dc_and_los);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
504 inline void ParallelCompactData::RegionData::set_highest_ref(HeapWord* addr)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
507 HeapWord* tmp = _highest_ref;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 while (addr > tmp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 tmp = (HeapWord*)Atomic::cmpxchg_ptr(addr, &_highest_ref, tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
513
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
514 inline bool ParallelCompactData::RegionData::claim()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 const int los = (int) live_obj_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
517 const int old = Atomic::cmpxchg(dc_claimed | los,
a61af66fc99e Initial load
duke
parents:
diff changeset
518 (volatile int*) &_dc_and_los, los);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 return old == los;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
522 inline ParallelCompactData::RegionData*
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
523 ParallelCompactData::region(size_t region_idx) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
525 assert(region_idx <= region_count(), "bad arg");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
526 return _region_data + region_idx;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 inline size_t
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
530 ParallelCompactData::region(const RegionData* const region_ptr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
532 assert(region_ptr >= _region_data, "bad arg");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
533 assert(region_ptr <= _region_data + region_count(), "bad arg");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
534 return pointer_delta(region_ptr, _region_data, sizeof(RegionData));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 inline size_t
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
538 ParallelCompactData::region_offset(const HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 assert(addr >= _region_start, "bad addr");
a61af66fc99e Initial load
duke
parents:
diff changeset
541 assert(addr <= _region_end, "bad addr");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
542 return (size_t(addr) & RegionAddrOffsetMask) >> LogHeapWordSize;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 inline size_t
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
546 ParallelCompactData::addr_to_region_idx(const HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
547 {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 assert(addr >= _region_start, "bad addr");
a61af66fc99e Initial load
duke
parents:
diff changeset
549 assert(addr <= _region_end, "bad addr");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
550 return pointer_delta(addr, _region_start) >> Log2RegionSize;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
552
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
553 inline ParallelCompactData::RegionData*
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
554 ParallelCompactData::addr_to_region_ptr(const HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
556 return region(addr_to_region_idx(addr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 inline HeapWord*
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
560 ParallelCompactData::region_to_addr(size_t region) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
561 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
562 assert(region <= _region_count, "region out of range");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
563 return _region_start + (region << Log2RegionSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 inline HeapWord*
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
567 ParallelCompactData::region_to_addr(const RegionData* region) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
568 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
569 return region_to_addr(pointer_delta(region, _region_data,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
570 sizeof(RegionData)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 inline HeapWord*
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
574 ParallelCompactData::region_to_addr(size_t region, size_t offset) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
576 assert(region <= _region_count, "region out of range");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
577 assert(offset < RegionSize, "offset too big"); // This may be too strict.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
578 return region_to_addr(region) + offset;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 inline HeapWord*
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
582 ParallelCompactData::region_align_down(HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 assert(addr >= _region_start, "bad addr");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
585 assert(addr < _region_end + RegionSize, "bad addr");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
586 return (HeapWord*)(size_t(addr) & RegionAddrMask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 inline HeapWord*
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
590 ParallelCompactData::region_align_up(HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 assert(addr >= _region_start, "bad addr");
a61af66fc99e Initial load
duke
parents:
diff changeset
593 assert(addr <= _region_end, "bad addr");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
594 return region_align_down(addr + RegionSizeOffsetMask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 inline bool
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
598 ParallelCompactData::is_region_aligned(HeapWord* addr) const
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
600 return region_offset(addr) == 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // Abstract closure for use with ParMarkBitMap::iterate(), which will invoke the
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // do_addr() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 //
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // The closure is initialized with the number of heap words to process
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // (words_remaining()), and becomes 'full' when it reaches 0. The do_addr()
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // methods in subclasses should update the total as words are processed. Since
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // only one subclass actually uses this mechanism to terminate iteration, the
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // default initial value is > 0. The implementation is here and not in the
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // single subclass that uses it to avoid making is_full() virtual, and thus
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // adding a virtual call per live object.
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 class ParMarkBitMapClosure: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
616 typedef ParMarkBitMap::idx_t idx_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
617 typedef ParMarkBitMap::IterationStatus IterationStatus;
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 inline ParMarkBitMapClosure(ParMarkBitMap* mbm, ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
621 size_t words = max_uintx);
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 inline ParCompactionManager* compaction_manager() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 inline ParMarkBitMap* bitmap() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 inline size_t words_remaining() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 inline bool is_full() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 inline HeapWord* source() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629 inline void set_source(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 virtual IterationStatus do_addr(HeapWord* addr, size_t words) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
634 inline void decrement_words_remaining(size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
637 ParMarkBitMap* const _bitmap;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 ParCompactionManager* const _compaction_manager;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 DEBUG_ONLY(const size_t _initial_words_remaining;) // Useful in debugger.
a61af66fc99e Initial load
duke
parents:
diff changeset
640 size_t _words_remaining; // Words left to copy.
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
643 HeapWord* _source; // Next addr that would be read.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 };
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 inline
a61af66fc99e Initial load
duke
parents:
diff changeset
647 ParMarkBitMapClosure::ParMarkBitMapClosure(ParMarkBitMap* bitmap,
a61af66fc99e Initial load
duke
parents:
diff changeset
648 ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
649 size_t words):
a61af66fc99e Initial load
duke
parents:
diff changeset
650 _bitmap(bitmap), _compaction_manager(cm)
a61af66fc99e Initial load
duke
parents:
diff changeset
651 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
652 , _initial_words_remaining(words)
a61af66fc99e Initial load
duke
parents:
diff changeset
653 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
654 {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 _words_remaining = words;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 _source = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 inline ParCompactionManager* ParMarkBitMapClosure::compaction_manager() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 return _compaction_manager;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 inline ParMarkBitMap* ParMarkBitMapClosure::bitmap() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 return _bitmap;
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 inline size_t ParMarkBitMapClosure::words_remaining() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 return _words_remaining;
a61af66fc99e Initial load
duke
parents:
diff changeset
669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 inline bool ParMarkBitMapClosure::is_full() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 return words_remaining() == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 inline HeapWord* ParMarkBitMapClosure::source() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 return _source;
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 inline void ParMarkBitMapClosure::set_source(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 _source = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 inline void ParMarkBitMapClosure::decrement_words_remaining(size_t words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 assert(_words_remaining >= words, "processed too many words");
a61af66fc99e Initial load
duke
parents:
diff changeset
685 _words_remaining -= words;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
688 // The UseParallelOldGC collector is a stop-the-world garbage collector that
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
689 // does parts of the collection using parallel threads. The collection includes
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
690 // the tenured generation and the young generation. The permanent generation is
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
691 // collected at the same time as the other two generations but the permanent
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
692 // generation is collect by a single GC thread. The permanent generation is
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
693 // collected serially because of the requirement that during the processing of a
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
694 // klass AAA, any objects reference by AAA must already have been processed.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
695 // This requirement is enforced by a left (lower address) to right (higher
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
696 // address) sliding compaction.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
697 //
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
698 // There are four phases of the collection.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
699 //
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
700 // - marking phase
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
701 // - summary phase
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
702 // - compacting phase
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
703 // - clean up phase
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
704 //
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
705 // Roughly speaking these phases correspond, respectively, to
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
706 // - mark all the live objects
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
707 // - calculate the destination of each object at the end of the collection
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
708 // - move the objects to their destination
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
709 // - update some references and reinitialize some variables
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
710 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
711 // These three phases are invoked in PSParallelCompact::invoke_no_policy(). The
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
712 // marking phase is implemented in PSParallelCompact::marking_phase() and does a
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
713 // complete marking of the heap. The summary phase is implemented in
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
714 // PSParallelCompact::summary_phase(). The move and update phase is implemented
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
715 // in PSParallelCompact::compact().
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
716 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
717 // A space that is being collected is divided into regions and with each region
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
718 // is associated an object of type ParallelCompactData. Each region is of a
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
719 // fixed size and typically will contain more than 1 object and may have parts
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
720 // of objects at the front and back of the region.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
721 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
722 // region -----+---------------------+----------
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
723 // objects covered [ AAA )[ BBB )[ CCC )[ DDD )
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
724 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
725 // The marking phase does a complete marking of all live objects in the heap.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
726 // The marking also compiles the size of the data for all live objects covered
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
727 // by the region. This size includes the part of any live object spanning onto
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
728 // the region (part of AAA if it is live) from the front, all live objects
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
729 // contained in the region (BBB and/or CCC if they are live), and the part of
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
730 // any live objects covered by the region that extends off the region (part of
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
731 // DDD if it is live). The marking phase uses multiple GC threads and marking
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
732 // is done in a bit array of type ParMarkBitMap. The marking of the bit map is
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
733 // done atomically as is the accumulation of the size of the live objects
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
734 // covered by a region.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
735 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
736 // The summary phase calculates the total live data to the left of each region
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
737 // XXX. Based on that total and the bottom of the space, it can calculate the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
738 // starting location of the live data in XXX. The summary phase calculates for
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
739 // each region XXX quantites such as
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
740 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
741 // - the amount of live data at the beginning of a region from an object
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
742 // entering the region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
743 // - the location of the first live data on the region
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
744 // - a count of the number of regions receiving live data from XXX.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
745 //
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
746 // See ParallelCompactData for precise details. The summary phase also
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
747 // calculates the dense prefix for the compaction. The dense prefix is a
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
748 // portion at the beginning of the space that is not moved. The objects in the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
749 // dense prefix do need to have their object references updated. See method
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
750 // summarize_dense_prefix().
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
751 //
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
752 // The summary phase is done using 1 GC thread.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
753 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
754 // The compaction phase moves objects to their new location and updates all
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
755 // references in the object.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
756 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
757 // A current exception is that objects that cross a region boundary are moved
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
758 // but do not have their references updated. References are not updated because
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
759 // it cannot easily be determined if the klass pointer KKK for the object AAA
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
760 // has been updated. KKK likely resides in a region to the left of the region
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
761 // containing AAA. These AAA's have there references updated at the end in a
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
762 // clean up phase. See the method PSParallelCompact::update_deferred_objects().
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
763 // An alternate strategy is being investigated for this deferral of updating.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
764 //
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
765 // Compaction is done on a region basis. A region that is ready to be filled is
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
766 // put on a ready list and GC threads take region off the list and fill them. A
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
767 // region is ready to be filled if it empty of live objects. Such a region may
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
768 // have been initially empty (only contained dead objects) or may have had all
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
769 // its live objects copied out already. A region that compacts into itself is
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
770 // also ready for filling. The ready list is initially filled with empty
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
771 // regions and regions compacting into themselves. There is always at least 1
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
772 // region that can be put on the ready list. The regions are atomically added
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
773 // and removed from the ready list.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
774
0
a61af66fc99e Initial load
duke
parents:
diff changeset
775 class PSParallelCompact : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // Convenient access to type names.
a61af66fc99e Initial load
duke
parents:
diff changeset
778 typedef ParMarkBitMap::idx_t idx_t;
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
779 typedef ParallelCompactData::RegionData RegionData;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 perm_space_id, old_space_id, eden_space_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
783 from_space_id, to_space_id, last_space_id
a61af66fc99e Initial load
duke
parents:
diff changeset
784 } SpaceId;
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
787 // Inline closure decls
0
a61af66fc99e Initial load
duke
parents:
diff changeset
788 //
a61af66fc99e Initial load
duke
parents:
diff changeset
789 class IsAliveClosure: public BoolObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
791 virtual void do_object(oop p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
792 virtual bool do_object_b(oop p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
793 };
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 class KeepAliveClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
796 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
797 ParCompactionManager* _compaction_manager;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
798 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
799 template <class T> inline void do_oop_work(T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
800 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
801 KeepAliveClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
802 virtual void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
803 virtual void do_oop(narrowOop* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 };
a61af66fc99e Initial load
duke
parents:
diff changeset
805
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
806 // Current unused
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
807 class FollowRootClosure: public OopsInGenClosure {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
808 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 ParCompactionManager* _compaction_manager;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
811 FollowRootClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
812 virtual void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
813 virtual void do_oop(narrowOop* p);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
814 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 class FollowStackClosure: public VoidClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
817 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
818 ParCompactionManager* _compaction_manager;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
820 FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
821 virtual void do_void();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 };
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 class AdjustPointerClosure: public OopsInGenClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
825 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 bool _is_root;
a61af66fc99e Initial load
duke
parents:
diff changeset
827 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
828 AdjustPointerClosure(bool is_root) : _is_root(is_root) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
829 virtual void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
830 virtual void do_oop(narrowOop* p);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
831 // do not walk from thread stacks to the code cache on this phase
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 579
diff changeset
832 virtual void do_code_blob(CodeBlob* cb) const { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
833 };
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // Closure for verifying update of pointers. Does not
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // have any side effects.
a61af66fc99e Initial load
duke
parents:
diff changeset
837 class VerifyUpdateClosure: public ParMarkBitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
838 const MutableSpace* _space; // Is this ever used?
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
841 VerifyUpdateClosure(ParCompactionManager* cm, const MutableSpace* sp) :
a61af66fc99e Initial load
duke
parents:
diff changeset
842 ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm), _space(sp)
a61af66fc99e Initial load
duke
parents:
diff changeset
843 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 virtual IterationStatus do_addr(HeapWord* addr, size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 const MutableSpace* space() { return _space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
848 };
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // Closure for updating objects altered for debug checking
a61af66fc99e Initial load
duke
parents:
diff changeset
851 class ResetObjectsClosure: public ParMarkBitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
852 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
853 ResetObjectsClosure(ParCompactionManager* cm):
a61af66fc99e Initial load
duke
parents:
diff changeset
854 ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm)
a61af66fc99e Initial load
duke
parents:
diff changeset
855 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 virtual IterationStatus do_addr(HeapWord* addr, size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 };
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 friend class KeepAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 friend class FollowStackClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 friend class AdjustPointerClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 friend class FollowRootClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 friend class instanceKlassKlass;
a61af66fc99e Initial load
duke
parents:
diff changeset
865 friend class RefProcTaskProxy;
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
868 static elapsedTimer _accumulated_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
869 static unsigned int _total_invocations;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 static unsigned int _maximum_compaction_gc_num;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 static jlong _time_of_last_gc; // ms
a61af66fc99e Initial load
duke
parents:
diff changeset
872 static CollectorCounters* _counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 static ParMarkBitMap _mark_bitmap;
a61af66fc99e Initial load
duke
parents:
diff changeset
874 static ParallelCompactData _summary_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 static IsAliveClosure _is_alive_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 static SpaceInfo _space_info[last_space_id];
a61af66fc99e Initial load
duke
parents:
diff changeset
877 static bool _print_phases;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 static AdjustPointerClosure _adjust_root_pointer_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 static AdjustPointerClosure _adjust_pointer_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // Reference processing (used in ...follow_contents)
a61af66fc99e Initial load
duke
parents:
diff changeset
882 static ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Updated location of intArrayKlassObj.
a61af66fc99e Initial load
duke
parents:
diff changeset
885 static klassOop _updated_int_array_klass_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // Values computed at initialization and used by dead_wood_limiter().
a61af66fc99e Initial load
duke
parents:
diff changeset
888 static double _dwl_mean;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 static double _dwl_std_dev;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 static double _dwl_first_term;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 static double _dwl_adjustment;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
893 static bool _dwl_initialized;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // Closure accessors
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
898 static OopClosure* adjust_pointer_closure() { return (OopClosure*)&_adjust_pointer_closure; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
899 static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
900 static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&_is_alive_closure; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 static void initialize_space_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // Return true if details about individual phases should be printed.
a61af66fc99e Initial load
duke
parents:
diff changeset
905 static inline bool print_phases();
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // Clear the marking bitmap and summary data that cover the specified space.
a61af66fc99e Initial load
duke
parents:
diff changeset
908 static void clear_data_covering_space(SpaceId id);
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 static void pre_compact(PreGCValues* pre_gc_values);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 static void post_compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Mark live objects
a61af66fc99e Initial load
duke
parents:
diff changeset
914 static void marking_phase(ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 bool maximum_heap_compaction);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 579
diff changeset
916 static void follow_weak_klass_links();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 579
diff changeset
917 static void follow_mdo_weak_refs();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
918
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
919 template <class T> static inline void adjust_pointer(T* p, bool is_root);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
920 static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
921
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
922 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
923 static inline void follow_root(ParCompactionManager* cm, T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // Compute the dense prefix for the designated space. This is an experimental
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // implementation currently not used in production.
a61af66fc99e Initial load
duke
parents:
diff changeset
927 static HeapWord* compute_dense_prefix_via_density(const SpaceId id,
a61af66fc99e Initial load
duke
parents:
diff changeset
928 bool maximum_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // Methods used to compute the dense prefix.
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // Compute the value of the normal distribution at x = density. The mean and
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // standard deviation are values saved by initialize_dead_wood_limiter().
a61af66fc99e Initial load
duke
parents:
diff changeset
934 static inline double normal_distribution(double density);
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 // Initialize the static vars used by dead_wood_limiter().
a61af66fc99e Initial load
duke
parents:
diff changeset
937 static void initialize_dead_wood_limiter();
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Return the percentage of space that can be treated as "dead wood" (i.e.,
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // not reclaimed).
a61af66fc99e Initial load
duke
parents:
diff changeset
941 static double dead_wood_limiter(double density, size_t min_percent);
a61af66fc99e Initial load
duke
parents:
diff changeset
942
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
943 // Find the first (left-most) region in the range [beg, end) that has at least
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // dead_words of dead space to the left. The argument beg must be the first
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
945 // region in the space that is not completely live.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
946 static RegionData* dead_wood_limit_region(const RegionData* beg,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
947 const RegionData* end,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
948 size_t dead_words);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
949
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
950 // Return a pointer to the first region in the range [beg, end) that is not
0
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // completely full.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
952 static RegionData* first_dead_space_region(const RegionData* beg,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
953 const RegionData* end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // Return a value indicating the benefit or 'yield' if the compacted region
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // were to start (or equivalently if the dense prefix were to end) at the
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
957 // candidate region. Higher values are better.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 //
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // The value is based on the amount of space reclaimed vs. the costs of (a)
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // updating references in the dense prefix plus (b) copying objects and
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // updating references in the compacted region.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
962 static inline double reclaimed_ratio(const RegionData* const candidate,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
963 HeapWord* const bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
964 HeapWord* const top,
a61af66fc99e Initial load
duke
parents:
diff changeset
965 HeapWord* const new_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Compute the dense prefix for the designated space.
a61af66fc99e Initial load
duke
parents:
diff changeset
968 static HeapWord* compute_dense_prefix(const SpaceId id,
a61af66fc99e Initial load
duke
parents:
diff changeset
969 bool maximum_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
970
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
971 // Return true if dead space crosses onto the specified Region; bit must be
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
972 // the bit index corresponding to the first word of the Region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
973 static inline bool dead_space_crosses_boundary(const RegionData* region,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974 idx_t bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // Summary phase utility routine to fill dead space (if any) at the dense
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // prefix boundary. Should only be called if the the dense prefix is
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // non-empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
979 static void fill_dense_prefix_end(SpaceId id);
a61af66fc99e Initial load
duke
parents:
diff changeset
980
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
981 // Clear the summary data source_region field for the specified addresses.
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
982 static void clear_source_region(HeapWord* beg_addr, HeapWord* end_addr);
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
983
483
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
984 #ifndef PRODUCT
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
985 // Routines to provoke splitting a young gen space (ParallelOldGCSplitALot).
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
986
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
987 // Fill the region [start, start + words) with live object(s). Only usable
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
988 // for the old and permanent generations.
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
989 static void fill_with_live_objects(SpaceId id, HeapWord* const start,
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
990 size_t words);
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
991 // Include the new objects in the summary data.
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
992 static void summarize_new_objects(SpaceId id, HeapWord* start);
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
993
496
b27c885f75f9 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 495
diff changeset
994 // Add live objects to a survivor space since it's rare that both survivors
b27c885f75f9 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 495
diff changeset
995 // are non-empty.
b27c885f75f9 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 495
diff changeset
996 static void provoke_split_fill_survivor(SpaceId id);
b27c885f75f9 6786188: par compact - "SplitALot" stress mode should fill to_space
jcoomes
parents: 495
diff changeset
997
483
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
998 // Add live objects and/or choose the dense prefix to provoke splitting.
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
999 static void provoke_split(bool & maximum_compaction);
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
1000 #endif
0f773163217d 6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents: 482
diff changeset
1001
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 static void summarize_spaces_quick();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 static void summarize_space(SpaceId id, bool maximum_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 static void summary_phase(ParCompactionManager* cm, bool maximum_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // Adjust addresses in roots. Does not adjust addresses in heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 static void adjust_roots();
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // Serial code executed in preparation for the compaction phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 static void compact_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // Move objects to new locations.
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 static void compact_perm(ParCompactionManager* cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 static void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1016 // Add available regions to the stack and draining tasks to the task queue.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1017 static void enqueue_region_draining_tasks(GCTaskQueue* q,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1018 uint parallel_gc_threads);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // Add dense prefix update tasks to the task queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 static void enqueue_dense_prefix_tasks(GCTaskQueue* q,
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 uint parallel_gc_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1024 // Add region stealing tasks to the task queue.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1025 static void enqueue_region_stealing_tasks(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 GCTaskQueue* q,
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 ParallelTaskTerminator* terminator_ptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 uint parallel_gc_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // If objects are left in eden after a collection, try to move the boundary
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // and absorb them into the old gen. Returns true if eden was emptied.
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 PSYoungGen* young_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 PSOldGen* old_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // Reset time since last full gc
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 static void reset_millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 #ifdef VALIDATE_MARK_SWEEP
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1041 static GrowableArray<void*>* _root_refs_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 static GrowableArray<oop> * _live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 static GrowableArray<oop> * _live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 static GrowableArray<size_t>* _live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 static size_t _live_oops_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 static size_t _live_oops_index_at_perm;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1047 static GrowableArray<void*>* _other_refs_stack;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1048 static GrowableArray<void*>* _adjusted_pointers;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 static bool _pointer_tracking;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 static bool _root_tracking;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // The following arrays are saved since the time of the last GC and
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // assist in tracking down problems where someone has done an errant
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // store into the heap, usually to an oop that wasn't properly
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // handleized across a GC. If we crash or otherwise fail before the
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // next GC, we can query these arrays to find out the object we had
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // intended to do the store to (assuming it is still alive) and the
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // offset within that object. Covered under RecordMarkSweepCompaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 static GrowableArray<HeapWord*> * _cur_gc_live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 static GrowableArray<size_t>* _cur_gc_live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 static GrowableArray<HeapWord*> * _last_gc_live_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 static GrowableArray<size_t>* _last_gc_live_oops_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 class MarkAndPushClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1069 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 ParCompactionManager* _compaction_manager;
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1072 MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1073 virtual void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1074 virtual void do_oop(narrowOop* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 PSParallelCompact();
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // Convenient accessor for Universe::heap().
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 static ParallelScavengeHeap* gc_heap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 static void invoke(bool maximum_heap_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 static void invoke_no_policy(bool maximum_heap_compaction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 static void post_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Perform initialization for PSParallelCompact that requires
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // allocations. This should be called during the VM initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // at a pointer where it would be appropriate to return a JNI_ENOMEM
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // in the event of a failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 static bool initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // Public accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 static elapsedTimer* accumulated_time() { return &_accumulated_time; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 static unsigned int total_invocations() { return _total_invocations; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 static CollectorCounters* counters() { return _counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // Used to add tasks
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 static GCTaskManager* const gc_task_manager();
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 static klassOop updated_int_array_klass_obj() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 return _updated_int_array_klass_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // Marking support
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 static inline bool mark_obj(oop obj);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1107 // Check mark and maybe push on marking stack
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1108 template <class T> static inline void mark_and_push(ParCompactionManager* cm,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1109 T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1110
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // Compaction support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 // Return true if p is in the range [beg_addr, end_addr).
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // Convenience wrappers for per-space data kept in _space_info.
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 static inline MutableSpace* space(SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 static inline HeapWord* new_top(SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 static inline HeapWord* dense_prefix(SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 static inline ObjectStartArray* start_array(SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // Return true if the klass should be updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 static inline bool should_update_klass(klassOop k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // Move and update the live objects in the specified space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 static void move_and_update(ParCompactionManager* cm, SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1127
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1128 // Process the end of the given region range in the dense prefix.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // This includes saving any object not updated.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1130 static void dense_prefix_regions_epilogue(ParCompactionManager* cm,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1131 size_t region_start_index,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1132 size_t region_end_index,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1133 idx_t exiting_object_offset,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1134 idx_t region_offset_start,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1135 idx_t region_offset_end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1137 // Update a region in the dense prefix. For each live object
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1138 // in the region, update it's interior references. For each
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // dead object, fill it with deadwood. Dead space at the end
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1140 // of a region range will be filled to the start of the next
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1141 // live object regardless of the region_index_end. None of the
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // objects in the dense prefix move and dead space is dead
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // (holds only dead objects that don't need any processing), so
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // dead space can be filled in any order.
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 static void update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 SpaceId space_id,
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1147 size_t region_index_start,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1148 size_t region_index_end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1149
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // Return the address of the count + 1st live word in the range [beg, end).
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 static HeapWord* skip_live_words(HeapWord* beg, HeapWord* end, size_t count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // Return the address of the word to be copied to dest_addr, which must be
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1154 // aligned to a region boundary.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 static HeapWord* first_src_addr(HeapWord* const dest_addr,
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
1156 SpaceId src_space_id,
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1157 size_t src_region_idx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1159 // Determine the next source region, set closure.source() to the start of the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1160 // new region return the region index. Parameter end_addr is the address one
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // beyond the end of source range just processed. If necessary, switch to a
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // new source space and set src_space_id (in-out parameter) and src_space_top
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // (out parameter) accordingly.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1164 static size_t next_src_region(MoveAndUpdateClosure& closure,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1165 SpaceId& src_space_id,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1166 HeapWord*& src_space_top,
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1167 HeapWord* end_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1169 // Decrement the destination count for each non-empty source region in the
495
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1170 // range [beg_region, region(region_align_up(end_addr))). If the destination
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1171 // count for a region goes to 0 and it needs to be filled, enqueue it.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 static void decrement_destination_counts(ParCompactionManager* cm,
495
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1173 SpaceId src_space_id,
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1174 size_t beg_region,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1176
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1177 // Fill a region, copying objects from one or more source regions.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1178 static void fill_region(ParCompactionManager* cm, size_t region_idx);
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1179 static void fill_and_update_region(ParCompactionManager* cm, size_t region) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1180 fill_region(cm, region);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // Update the deferred objects in the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 static void update_deferred_objects(ParCompactionManager* cm, SpaceId id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // Mark pointer and follow contents.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1187 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1188 static inline void mark_and_follow(ParCompactionManager* cm, T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 static ParallelCompactData& summary_data() { return _summary_data; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1193 static inline void adjust_pointer(oop* p) { adjust_pointer(p, false); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1194 static inline void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1195
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // Reference Processing
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 static ReferenceProcessor* const ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1198
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // Return the SpaceId for the given address.
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 static SpaceId space_id(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Time since last full gc (in milliseconds).
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 static jlong millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 #ifdef VALIDATE_MARK_SWEEP
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1206 static void track_adjusted_pointer(void* p, bool isroot);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1207 static void check_adjust_pointer(void* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 static void track_interior_pointers(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 static void check_interior_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
1210
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 static void reset_live_oop_tracking(bool at_perm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 static void register_live_oop(oop p, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 static void validate_live_oop(oop p, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 static void compaction_complete();
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // Querying operation of RecordMarkSweepCompaction results.
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // Finds and prints the current base oop and offset for a word
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // within an oop that was live during the last GC. Helpful for
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // tracking down heap stomps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 static void print_new_location_of_heap_address(HeapWord* q);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 #endif // #ifdef VALIDATE_MARK_SWEEP
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // Call backs for class unloading
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // Update subklass/sibling/implementor links at end of marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 static void revisit_weak_klass_link(ParCompactionManager* cm, Klass* k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 579
diff changeset
1228 // Clear unmarked oops in MDOs at the end of marking.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 579
diff changeset
1229 static void revisit_mdo(ParCompactionManager* cm, DataLayout* p);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 579
diff changeset
1230
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // Debugging support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 static const char* space_names[last_space_id];
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1234 static void print_region_ranges();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 static void print_dense_prefix_stats(const char* const algorithm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 const SpaceId id,
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 const bool maximum_compaction,
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 HeapWord* const addr);
482
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
1239 static void summary_phase_msg(SpaceId dst_space_id,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
1240 HeapWord* dst_beg, HeapWord* dst_end,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
1241 SpaceId src_space_id,
7c2386d67889 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 481
diff changeset
1242 HeapWord* src_beg, HeapWord* src_end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 #endif // #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 #ifdef ASSERT
495
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1246 // Sanity check the new location of a word in the heap.
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1247 static inline void check_new_location(HeapWord* old_addr, HeapWord* new_addr);
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1248 // Verify that all the regions have been emptied.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 static void verify_complete(SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 #endif // #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1253 inline bool PSParallelCompact::mark_obj(oop obj) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 const int obj_size = obj->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 if (mark_bitmap()->mark_obj(obj, obj_size)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 _summary_data.add_obj(obj, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1263 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1264 inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1265 assert(!Universe::heap()->is_in_reserved(p),
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1266 "roots shouldn't be things within the heap");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1267 #ifdef VALIDATE_MARK_SWEEP
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1268 if (ValidateMarkSweep) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1269 guarantee(!_root_refs_stack->contains(p), "should only be in here once");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1270 _root_refs_stack->push(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1271 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1272 #endif
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1273 T heap_oop = oopDesc::load_heap_oop(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1274 if (!oopDesc::is_null(heap_oop)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1275 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1276 if (mark_bitmap()->is_unmarked(obj)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1277 if (mark_obj(obj)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1278 obj->follow_contents(cm);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1279 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1280 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1281 }
1311
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 993
diff changeset
1282 cm->follow_marking_stacks();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1283 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1284
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1285 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1286 inline void PSParallelCompact::mark_and_follow(ParCompactionManager* cm,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1287 T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1288 T heap_oop = oopDesc::load_heap_oop(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1289 if (!oopDesc::is_null(heap_oop)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1290 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1291 if (mark_bitmap()->is_unmarked(obj)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1292 if (mark_obj(obj)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1293 obj->follow_contents(cm);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1294 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1295 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1296 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1297 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1298
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1299 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1300 inline void PSParallelCompact::mark_and_push(ParCompactionManager* cm, T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1301 T heap_oop = oopDesc::load_heap_oop(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1302 if (!oopDesc::is_null(heap_oop)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1303 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
1638
b2a00dd3117c 6957084: simplify TaskQueue overflow handling
jcoomes
parents: 1579
diff changeset
1304 if (mark_bitmap()->is_unmarked(obj) && mark_obj(obj)) {
b2a00dd3117c 6957084: simplify TaskQueue overflow handling
jcoomes
parents: 1579
diff changeset
1305 cm->push(obj);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1306 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1307 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1308 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1309
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1310 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1311 inline void PSParallelCompact::adjust_pointer(T* p, bool isroot) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1312 T heap_oop = oopDesc::load_heap_oop(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1313 if (!oopDesc::is_null(heap_oop)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1314 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1315 oop new_obj = (oop)summary_data().calc_new_pointer(obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1316 assert(new_obj != NULL || // is forwarding ptr?
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1317 obj->is_shared(), // never forwarded?
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1318 "should be forwarded");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1319 // Just always do the update unconditionally?
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1320 if (new_obj != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1321 assert(Universe::heap()->is_in_reserved(new_obj),
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1322 "should be in object space");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1323 oopDesc::encode_store_heap_oop_not_null(p, new_obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1324 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1325 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1326 VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot));
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1327 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1328
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1329 template <class T>
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1330 inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1331 #ifdef VALIDATE_MARK_SWEEP
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1332 if (ValidateMarkSweep) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1333 if (!Universe::heap()->is_in_reserved(p)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1334 _root_refs_stack->push(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1335 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1336 _other_refs_stack->push(p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1337 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1338 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1339 #endif
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1340 mark_and_push(_compaction_manager, p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1341 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1342
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1343 inline bool PSParallelCompact::print_phases() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 return _print_phases;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1347 inline double PSParallelCompact::normal_distribution(double density) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 assert(_dwl_initialized, "uninitialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 const double squared_term = (density - _dwl_mean) / _dwl_std_dev;
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 return _dwl_first_term * exp(-0.5 * squared_term * squared_term);
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 inline bool
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1354 PSParallelCompact::dead_space_crosses_boundary(const RegionData* region,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 idx_t bit)
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 {
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1357 assert(bit > 0, "cannot call this for the first bit/region");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1358 assert(_summary_data.region_to_addr(region) == _mark_bitmap.bit_to_addr(bit),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // Dead space crosses the boundary if (1) a partial object does not extend
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1362 // onto the region, (2) an object does not start at the beginning of the
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1363 // region, and (3) an object does not end at the end of the prior region.
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 269
diff changeset
1364 return region->partial_obj_size() == 0 &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 !_mark_bitmap.is_obj_beg(bit) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 !_mark_bitmap.is_obj_end(bit - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 inline bool
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 PSParallelCompact::is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 return p >= beg_addr && p < end_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1373
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 inline bool
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 PSParallelCompact::is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 return is_in((HeapWord*)p, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1378
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 inline MutableSpace* PSParallelCompact::space(SpaceId id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 assert(id < last_space_id, "id out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 return _space_info[id].space();
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 inline HeapWord* PSParallelCompact::new_top(SpaceId id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 assert(id < last_space_id, "id out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 return _space_info[id].new_top();
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 inline HeapWord* PSParallelCompact::dense_prefix(SpaceId id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 assert(id < last_space_id, "id out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 return _space_info[id].dense_prefix();
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 inline ObjectStartArray* PSParallelCompact::start_array(SpaceId id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 assert(id < last_space_id, "id out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 return _space_info[id].start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1398
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 inline bool PSParallelCompact::should_update_klass(klassOop k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 return ((HeapWord*) k) >= dense_prefix(perm_space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402
495
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1403 #ifdef ASSERT
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1404 inline void
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1405 PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr)
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1406 {
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1407 assert(old_addr >= new_addr || space_id(old_addr) != space_id(new_addr),
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1408 "must move left or to a different space");
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
1409 assert(is_object_aligned((intptr_t)old_addr) && is_object_aligned((intptr_t)new_addr),
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
1410 "checking alignment");
495
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1411 }
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1412 #endif // ASSERT
234c22e54b98 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 483
diff changeset
1413
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 class MoveAndUpdateClosure: public ParMarkBitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 inline MoveAndUpdateClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 ObjectStartArray* start_array,
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 HeapWord* destination, size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 HeapWord* destination() const { return _destination; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // If the object will fit (size <= words_remaining()), copy it to the current
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 // destination, update the interior oops and the start array and return either
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 // full (if the closure is full) or incomplete. If the object will not fit,
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // return would_overflow.
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 virtual IterationStatus do_addr(HeapWord* addr, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1428
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 // Copy enough words to fill this closure, starting at source(). Interior
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 // oops and the start array are not updated. Return full.
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 IterationStatus copy_until_full();
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 // Copy enough words to fill this closure or to the end of an object,
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 // whichever is smaller, starting at source(). Interior oops and the start
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // array are not updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 void copy_partial_obj();
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // Update variables to indicate that word_count words were processed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 inline void update_state(size_t word_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1441
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 ObjectStartArray* const _start_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 HeapWord* _destination; // Next addr to be written.
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 inline
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 MoveAndUpdateClosure::MoveAndUpdateClosure(ParMarkBitMap* bitmap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 ObjectStartArray* start_array,
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 HeapWord* destination,
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 size_t words) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 ParMarkBitMapClosure(bitmap, cm, words), _start_array(start_array)
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 _destination = destination;
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 inline void MoveAndUpdateClosure::update_state(size_t words)
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 decrement_words_remaining(words);
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 _source += words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 _destination += words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1464
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 class UpdateOnlyClosure: public ParMarkBitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 const PSParallelCompact::SpaceId _space_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 ObjectStartArray* const _start_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
1469
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 UpdateOnlyClosure(ParMarkBitMap* mbm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 PSParallelCompact::SpaceId space_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1474
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 // Update the object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 virtual IterationStatus do_addr(HeapWord* addr, size_t words);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 inline void do_addr(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1481 inline void UpdateOnlyClosure::do_addr(HeapWord* addr)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1482 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 _start_array->allocate_block(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 oop(addr)->update_contents(compaction_manager());
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1487 class FillClosure: public ParMarkBitMapClosure
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1488 {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1489 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1490 FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1492 _start_array(PSParallelCompact::start_array(space_id))
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1493 {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1494 assert(space_id == PSParallelCompact::perm_space_id ||
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1495 space_id == PSParallelCompact::old_space_id,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 "cannot use FillClosure in the young gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 virtual IterationStatus do_addr(HeapWord* addr, size_t size) {
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1500 CollectedHeap::fill_with_objects(addr, size);
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1501 HeapWord* const end = addr + size;
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1502 do {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1503 _start_array->allocate_block(addr);
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1504 addr += oop(addr)->size();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1505 } while (addr < end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 return ParMarkBitMap::incomplete;
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 private:
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 376
diff changeset
1510 ObjectStartArray* const _start_array;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
1512
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1638
diff changeset
1513 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPARALLELCOMPACT_HPP