annotate src/share/vm/memory/space.hpp @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 12f651e29f6b
children de6a9e811145 bdd155477289
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
2 * Copyright (c) 1997, 2012, 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: 845
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
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: 845
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: 1552
diff changeset
25 #ifndef SHARE_VM_MEMORY_SPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_MEMORY_SPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/blockOffsetTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/cardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "memory/iterator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "memory/watermark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "oops/markOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "runtime/prefetch.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
37 #include "utilities/macros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "utilities/workgroup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 # include "os_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 # include "os_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
47 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 1972
diff changeset
48 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 1972
diff changeset
49 # include "os_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 1972
diff changeset
50 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
51
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // A space is an abstraction for the "storage units" backing
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // up the generation abstraction. It includes specific
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // implementations for keeping track of free and used space,
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // for iterating over objects and free blocks, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Here's the Space hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 //
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // - Space -- an asbtract base class describing a heap area
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // - CompactibleSpace -- a space supporting compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // - CompactibleFreeListSpace -- (used for CMS generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // - ContiguousSpace -- a compactible space in which all free space
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // is contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // - EdenSpace -- contiguous space used as nursery
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // - ConcEdenSpace -- contiguous space with a 'soft end safe' allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // - OffsetTableContigSpace -- contiguous space with a block offset array
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // that allows "fast" block_start calls
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // - TenuredSpace -- (used for TenuredGeneration)
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Forward decls.
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class BlockOffsetArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 class BlockOffsetArrayContigSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class Generation;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 class CompactibleSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 class BlockOffsetTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 class GenRemSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 class CardTableRS;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 class DirtyCardToOopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // An oop closure that is circumscribed by a filtering memory region.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
82 class SpaceMemRegionOopsIterClosure: public ExtendedOopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
83 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
84 ExtendedOopClosure* _cl;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
85 MemRegion _mr;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
86 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
87 template <class T> void do_oop_work(T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
88 if (_mr.contains(p)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
89 _cl->do_oop(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
92 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
93 SpaceMemRegionOopsIterClosure(ExtendedOopClosure* cl, MemRegion mr):
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
94 _cl(cl), _mr(mr) {}
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
95 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
96 virtual void do_oop(narrowOop* p);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
97 virtual bool do_metadata() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
98 // _cl is of type ExtendedOopClosure instead of OopClosure, so that we can check this.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
99 assert(!_cl->do_metadata(), "I've checked all call paths, this shouldn't happen.");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
100 return false;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
101 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
102 virtual void do_klass(Klass* k) { ShouldNotReachHere(); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
103 virtual void do_class_loader_data(ClassLoaderData* cld) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 };
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // A Space describes a heap area. Class Space is an abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // base class.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 //
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Space supports allocation, size computation and GC support is provided.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 //
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Invariant: bottom() and end() are on page_size boundaries and
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // bottom() <= top() <= end()
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // top() is inclusive and end() is exclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
114
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6048
diff changeset
115 class Space: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
118 HeapWord* _bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 HeapWord* _end;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Used in support of save_marks()
a61af66fc99e Initial load
duke
parents:
diff changeset
122 HeapWord* _saved_mark_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 MemRegionClosure* _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // A sequential tasks done structure. This supports
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // parallel GC, where we have threads dynamically
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // claiming sub-tasks from a larger parallel task.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 SequentialSubTasksDone _par_seq_tasks;
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 Space():
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _bottom(NULL), _end(NULL), _preconsumptionDirtyCardClosure(NULL) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
136 HeapWord* bottom() const { return _bottom; }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 HeapWord* end() const { return _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 virtual void set_bottom(HeapWord* value) { _bottom = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 virtual void set_end(HeapWord* value) { _end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
141 virtual HeapWord* saved_mark_word() const { return _saved_mark_word; }
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 579
diff changeset
142
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void set_saved_mark_word(HeapWord* p) { _saved_mark_word = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 MemRegionClosure* preconsumptionDirtyCardClosure() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 _preconsumptionDirtyCardClosure = cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Returns a subregion of the space containing all the objects in
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
154 virtual MemRegion used_region() const { return MemRegion(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Returns a region that is guaranteed to contain (at least) all objects
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // allocated at the time of the last call to "save_marks". If the space
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // initializes its DirtyCardToOopClosure's specifying the "contig" option
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // (that is, if the space is contiguous), then this region must contain only
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // such objects: the memregion will be from the bottom of the region to the
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // saved mark. Otherwise, the "obj_allocated_since_save_marks" method of
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // the space must distiguish between objects in the region allocated before
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // and after the call to save marks.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 virtual MemRegion used_region_at_save_marks() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 return MemRegion(bottom(), saved_mark_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
168 // Initialization.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
169 // "initialize" should be called once on a space, before it is used for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
170 // any purpose. The "mr" arguments gives the bounds of the space, and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
171 // the "clear_space" argument should be true unless the memory in "mr" is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
172 // known to be zeroed.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
173 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
174
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
175 // The "clear" method must be called on a region that may have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
176 // had allocation performed in it, but is now to be considered empty.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
177 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // For detecting GC bugs. Should only be called at GC boundaries, since
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // some unused space may be used as scratch space during GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Default implementation does nothing. We also call this when expanding
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // a space to satisfy an allocation request. See bug #4668531
a61af66fc99e Initial load
duke
parents:
diff changeset
183 virtual void mangle_unused_area() {}
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
184 virtual void mangle_unused_area_complete() {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 virtual void mangle_region(MemRegion mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Testers
a61af66fc99e Initial load
duke
parents:
diff changeset
188 bool is_empty() const { return used() == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 bool not_empty() const { return used() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Returns true iff the given the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // given address as part of an allocated object. For
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // ceratin kinds of spaces, this might be a potentially
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // expensive operation. To prevent performance problems
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // on account of its inadvertent use in product jvm's,
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // we restrict its use to assertion checks only.
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4091
diff changeset
197 virtual bool is_in(const void* p) const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Returns true iff the given reserved memory of the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // given address.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 bool is_in_reserved(const void* p) const { return _bottom <= p && p < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // Returns true iff the given block is not allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
204 virtual bool is_free_block(const HeapWord* p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Test whether p is double-aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
207 static bool is_aligned(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return ((intptr_t)p & (sizeof(double)-1)) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Size computations. Sizes are in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 virtual size_t used() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 virtual size_t free() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Iterate over all the ref-containing fields of all objects in the
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // space, calling "cl.do_oop" on each. Fields in objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // applications of the closure are not included in the iteration.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
219 virtual void oop_iterate(ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Same as above, restricted to the intersection of a memory region and
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // the space. Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // are not included in the iteration.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
224 virtual void oop_iterate(MemRegion mr, ExtendedOopClosure* cl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Iterate over all objects in the space, calling "cl.do_object" on
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // each. Objects allocated by applications of the closure are not
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 virtual void object_iterate(ObjectClosure* blk) = 0;
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
230 // Similar to object_iterate() except only iterates over
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
231 // objects whose internal references point to objects in the space.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
232 virtual void safe_object_iterate(ObjectClosure* blk) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Iterate over all objects that intersect with mr, calling "cl->do_object"
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // on each. There is an exception to this: if this closure has already
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // been invoked on an object, it may skip such objects in some cases. This is
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Most likely to happen in an "upwards" (ascending address) iteration of
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // MemRegions.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 virtual void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Iterate over as many initialized objects in the space as possible,
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // calling "cl.do_object_careful" on each. Return NULL if all objects
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // in the space (at the start of the iteration) were iterated over.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Return an address indicating the extent of the iteration in the
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // event that the iteration had to return because of finding an
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // uninitialized object in the space, or if the closure "cl"
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // signalled early termination.
a61af66fc99e Initial load
duke
parents:
diff changeset
248 virtual HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 virtual HeapWord* object_iterate_careful_m(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
250 ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Create and return a new dirty card to oop closure. Can be
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // overriden to return the appropriate type of closure
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // depending on the type of space in which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // operate. ResourceArea allocated.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
256 virtual DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
258 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // If "p" is in the space, returns the address of the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // "block" that contains "p". We say "block" instead of "object" since
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // some heaps may not pack objects densely; a chunk may either be an
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // object or a non-object. If "p" is not in the space, return NULL.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
264 virtual HeapWord* block_start_const(const void* p) const = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
265
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
266 // The non-const version may have benevolent side effects on the data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
267 // structure supporting these calls, possibly speeding up future calls.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
268 // The default implementation, however, is simply to call the const
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
269 // version.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
270 inline virtual HeapWord* block_start(const void* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // of the active area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 virtual size_t block_size(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // the block is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
279 virtual bool block_is_obj(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // the block is an object and the object is alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
283 virtual bool obj_is_alive(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Allocation (return NULL if full). Assumes the caller has established
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // mutually exclusive access to the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 virtual HeapWord* allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // Allocation (return NULL if full). Enforces mutual exclusion internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
290 virtual HeapWord* par_allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Returns true if this object has been allocated since a
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // generation's "save_marks" call.
a61af66fc99e Initial load
duke
parents:
diff changeset
294 virtual bool obj_allocated_since_save_marks(const oop obj) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Mark-sweep-compact support: all spaces can update pointers to objects
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // moving as a part of compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
298 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // PrintHeapAtGC support
a61af66fc99e Initial load
duke
parents:
diff changeset
301 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 virtual void print_short() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 virtual void print_short_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Accessor for parallel sequential tasks.
a61af66fc99e Initial load
duke
parents:
diff changeset
308 SequentialSubTasksDone* par_seq_tasks() { return &_par_seq_tasks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // IF "this" is a ContiguousSpace, return it, else return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
316 virtual void verify() const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 };
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // A MemRegionClosure (ResourceObj) whose "do_MemRegion" function applies an
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // OopClosure to (the addresses of) all the ref-containing fields that could
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // be modified by virtue of the given MemRegion being dirty. (Note that
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // because of the imprecise nature of the write barrier, this may iterate
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // over oops beyond the region.)
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // This base type for dirty card to oop closures handles memory regions
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // in non-contiguous spaces with no boundaries, and should be sub-classed
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // to support other space types. See ContiguousDCTOC for a sub-class
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // that works with ContiguousSpaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 class DirtyCardToOopClosure: public MemRegionClosureRO {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 protected:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
331 ExtendedOopClosure* _cl;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 Space* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 CardTableModRefBS::PrecisionStyle _precision;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 HeapWord* _boundary; // If non-NULL, process only non-NULL oops
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // pointing below boundary.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
336 HeapWord* _min_done; // ObjHeadPreciseArray precision requires
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // a downwards traversal; this is the
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // lowest location already done (or,
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // alternatively, the lowest address that
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // shouldn't be done again. NULL means infinity.)
a61af66fc99e Initial load
duke
parents:
diff changeset
341 NOT_PRODUCT(HeapWord* _last_bottom;)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
342 NOT_PRODUCT(HeapWord* _last_explicit_min_done;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Get the actual top of the area on which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // operate, given where the top is assumed to be (the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // memory region passed to do_MemRegion) and where the object
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // at the top is assumed to start. For example, an object may
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // start at the top but actually extend past the assumed top,
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // in which case the top becomes the end of the object.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 virtual HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // Walk the given memory region from bottom to (actual) top
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // looking for objects and applying the oop closure (_cl) to
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // them. The base implementation of this treats the area as
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // blocks, where a block may or may not be an object. Sub-
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // classes should override this to provide more accurate
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // or possibly more efficient walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
358 virtual void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
361 DirtyCardToOopClosure(Space* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
362 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
363 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
364 _sp(sp), _cl(cl), _precision(precision), _boundary(boundary),
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _min_done(NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
366 NOT_PRODUCT(_last_bottom = NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
367 NOT_PRODUCT(_last_explicit_min_done = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 void set_min_done(HeapWord* min_done) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 _min_done = min_done;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
374 NOT_PRODUCT(_last_explicit_min_done = _min_done);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
377 void set_last_bottom(HeapWord* last_bottom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 _last_bottom = last_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
381 };
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // A structure to represent a point at which objects are being copied
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
385 class CompactPoint : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
387 Generation* gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 CompactibleSpace* space;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 HeapWord* threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 CompactPoint(Generation* _gen, CompactibleSpace* _space,
a61af66fc99e Initial load
duke
parents:
diff changeset
391 HeapWord* _threshold) :
a61af66fc99e Initial load
duke
parents:
diff changeset
392 gen(_gen), space(_space), threshold(_threshold) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
393 };
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // A space that supports compaction operations. This is usually, but not
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // necessarily, a space that is normally contiguous. But, for example, a
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // free-list-based space whose normal collection is a mark-sweep without
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // compaction could still support compaction in full GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 class CompactibleSpace: public Space {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
405 HeapWord* _compaction_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 CompactibleSpace* _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
409 CompactibleSpace() :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
410 _compaction_top(NULL), _next_compaction_space(NULL) {}
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
411
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
412 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
413 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // Used temporarily during a compaction phase to hold the value
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // top should have when compaction is complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 HeapWord* compaction_top() const { return _compaction_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 void set_compaction_top(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 assert(value == NULL || (value >= bottom() && value <= end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
421 "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
422 _compaction_top = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Perform operations on the space needed after a compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // has been performed.
a61af66fc99e Initial load
duke
parents:
diff changeset
427 virtual void reset_after_compaction() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // Returns the next space (in the current generation) to be compacted in
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // the global compaction order. Also is used to select the next
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // space into which to compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 virtual CompactibleSpace* next_compaction_space() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 void set_next_compaction_space(CompactibleSpace* csp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 _next_compaction_space = csp;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // MarkSweep support phase2
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // Start the process of compaction of the current space: compute
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // post-compaction addresses, and insert forwarding pointers. The fields
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // "cp->gen" and "cp->compaction_space" are the generation and space into
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // which we are currently compacting. This call updates "cp" as necessary,
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // and leaves the "compaction_top" of the final value of
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // "cp->compaction_space" up-to-date. Offset tables may be updated in
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // this phase as if the final copy had occurred; if so, "cp->threshold"
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // indicates when the next such action should be taken.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 virtual void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
453 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // MarkSweep support phase4
a61af66fc99e Initial load
duke
parents:
diff changeset
455 virtual void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // The maximum percentage of objects that can be dead in the compacted
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // live part of a compacted space ("deadwood" support.)
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
459 virtual size_t allowed_dead_ratio() const { return 0; };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Some contiguous spaces may maintain some data structures that should
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // be updated whenever an allocation crosses a boundary. This function
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // returns the first such boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // (The default implementation returns the end of the space, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // boundary is never crossed.)
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual HeapWord* initialize_threshold() { return end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // "q" is an object of the given "size" that should be forwarded;
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // "cp" names the generation ("gen") and containing "this" (which must
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // also equal "cp->space"). "compact_top" is where in "this" the
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // next object should be forwarded to. If there is room in "this" for
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // the object, insert an appropriate forwarding pointer in "q".
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // If not, go to the next compaction space (there must
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // be one, since compaction must succeed -- we go to the first space of
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // the previous generation if necessary, updating "cp"), reset compact_top
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // and then forward. In either case, returns the new value of "compact_top".
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // If the forwarding crosses "cp->threshold", invokes the "cross_threhold"
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // function of the then-current compaction space, and updates "cp->threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // accordingly".
a61af66fc99e Initial load
duke
parents:
diff changeset
480 virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
481 HeapWord* compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // Return a size with adjusments as required of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
484 virtual size_t adjust_object_size_v(size_t size) const { return size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // Used during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 HeapWord* _first_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 HeapWord* _end_of_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // Minimum size of a free block.
a61af66fc99e Initial load
duke
parents:
diff changeset
492 virtual size_t minimum_free_block_size() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // This the function is invoked when an allocation of an object covering
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // "start" to "end occurs crosses the threshold; returns the next
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // threshold. (The default implementation does nothing.)
a61af66fc99e Initial load
duke
parents:
diff changeset
497 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* the_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 return end();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Requires "allowed_deadspace_words > 0", that "q" is the start of a
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // free block of the given "word_len", and that "q", were it an object,
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // would not move if forwared. If the size allows, fill the free
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // block with an object, to prevent excessive compaction. Returns "true"
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // iff the free region was made deadspace, and modifies
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // "allowed_deadspace_words" to reflect the number of available deadspace
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // words remaining after this operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
508 bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q,
a61af66fc99e Initial load
duke
parents:
diff changeset
509 size_t word_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 };
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 #define SCAN_AND_FORWARD(cp,scan_limit,block_is_obj,block_size) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
513 /* Compute the new addresses for the live objects and store it in the mark \
a61af66fc99e Initial load
duke
parents:
diff changeset
514 * Used by universe::mark_sweep_phase2() \
a61af66fc99e Initial load
duke
parents:
diff changeset
515 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
516 HeapWord* compact_top; /* This is where we are currently compacting to. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
517 \
a61af66fc99e Initial load
duke
parents:
diff changeset
518 /* We're sure to be here before any objects are compacted into this \
a61af66fc99e Initial load
duke
parents:
diff changeset
519 * space, so this is a good time to initialize this: \
a61af66fc99e Initial load
duke
parents:
diff changeset
520 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
521 set_compaction_top(bottom()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
522 \
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if (cp->space == NULL) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
524 assert(cp->gen != NULL, "need a generation"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
525 assert(cp->threshold == NULL, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
526 assert(cp->gen->first_compaction_space() == this, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
527 cp->space = cp->gen->first_compaction_space(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
528 compact_top = cp->space->bottom(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
529 cp->space->set_compaction_top(compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
530 cp->threshold = cp->space->initialize_threshold(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
531 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
532 compact_top = cp->space->compaction_top(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
533 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
534 \
a61af66fc99e Initial load
duke
parents:
diff changeset
535 /* We allow some amount of garbage towards the bottom of the space, so \
a61af66fc99e Initial load
duke
parents:
diff changeset
536 * we don't start compacting before there is a significant gain to be made.\
a61af66fc99e Initial load
duke
parents:
diff changeset
537 * Occasionally, we want to ensure a full compaction, which is determined \
a61af66fc99e Initial load
duke
parents:
diff changeset
538 * by the MarkSweepAlwaysCompactCount parameter. \
a61af66fc99e Initial load
duke
parents:
diff changeset
539 */ \
10287
12f651e29f6b 6843347: Boundary values in some public GC options cause crashes
tschatzl
parents: 8001
diff changeset
540 uint invocations = MarkSweep::total_invocations(); \
12f651e29f6b 6843347: Boundary values in some public GC options cause crashes
tschatzl
parents: 8001
diff changeset
541 bool skip_dead = ((invocations % MarkSweepAlwaysCompactCount) != 0); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542 \
a61af66fc99e Initial load
duke
parents:
diff changeset
543 size_t allowed_deadspace = 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
544 if (skip_dead) { \
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
545 const size_t ratio = allowed_dead_ratio(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 allowed_deadspace = (capacity() * ratio / 100) / HeapWordSize; \
a61af66fc99e Initial load
duke
parents:
diff changeset
547 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
548 \
a61af66fc99e Initial load
duke
parents:
diff changeset
549 HeapWord* q = bottom(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
550 HeapWord* t = scan_limit(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
551 \
a61af66fc99e Initial load
duke
parents:
diff changeset
552 HeapWord* end_of_live= q; /* One byte beyond the last byte of the last \
a61af66fc99e Initial load
duke
parents:
diff changeset
553 live object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
554 HeapWord* first_dead = end();/* The first dead object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
555 LiveRange* liveRange = NULL; /* The current live range, recorded in the \
a61af66fc99e Initial load
duke
parents:
diff changeset
556 first header of preceding free area. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
557 _first_dead = first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
558 \
a61af66fc99e Initial load
duke
parents:
diff changeset
559 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
560 \
a61af66fc99e Initial load
duke
parents:
diff changeset
561 while (q < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
562 assert(!block_is_obj(q) || \
a61af66fc99e Initial load
duke
parents:
diff changeset
563 oop(q)->mark()->is_marked() || oop(q)->mark()->is_unlocked() || \
a61af66fc99e Initial load
duke
parents:
diff changeset
564 oop(q)->mark()->has_bias_pattern(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
565 "these are the only valid states during a mark sweep"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (block_is_obj(q) && oop(q)->is_gc_marked()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
567 /* prefetch beyond q */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
568 Prefetch::write(q, interval); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
569 size_t size = block_size(q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570 compact_top = cp->space->forward(oop(q), size, cp, compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
571 q += size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
572 end_of_live = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
573 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
574 /* run over all the contiguous dead objects */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
575 HeapWord* end = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
576 do { \
a61af66fc99e Initial load
duke
parents:
diff changeset
577 /* prefetch beyond end */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
578 Prefetch::write(end, interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
579 end += block_size(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
580 } while (end < t && (!block_is_obj(end) || !oop(end)->is_gc_marked()));\
a61af66fc99e Initial load
duke
parents:
diff changeset
581 \
a61af66fc99e Initial load
duke
parents:
diff changeset
582 /* see if we might want to pretend this object is alive so that \
a61af66fc99e Initial load
duke
parents:
diff changeset
583 * we don't have to compact quite as often. \
a61af66fc99e Initial load
duke
parents:
diff changeset
584 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (allowed_deadspace > 0 && q == compact_top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
586 size_t sz = pointer_delta(end, q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (insert_deadspace(allowed_deadspace, q, sz)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
588 compact_top = cp->space->forward(oop(q), sz, cp, compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
589 q = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
590 end_of_live = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
591 continue; \
a61af66fc99e Initial load
duke
parents:
diff changeset
592 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
593 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
594 \
a61af66fc99e Initial load
duke
parents:
diff changeset
595 /* otherwise, it really is a free region. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
596 \
a61af66fc99e Initial load
duke
parents:
diff changeset
597 /* for the previous LiveRange, record the end of the live objects. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if (liveRange) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
599 liveRange->set_end(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
600 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
601 \
a61af66fc99e Initial load
duke
parents:
diff changeset
602 /* record the current LiveRange object. \
a61af66fc99e Initial load
duke
parents:
diff changeset
603 * liveRange->start() is overlaid on the mark word. \
a61af66fc99e Initial load
duke
parents:
diff changeset
604 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
605 liveRange = (LiveRange*)q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
606 liveRange->set_start(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
607 liveRange->set_end(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
608 \
a61af66fc99e Initial load
duke
parents:
diff changeset
609 /* see if this is the first dead region. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (q < first_dead) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
611 first_dead = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
612 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
613 \
a61af66fc99e Initial load
duke
parents:
diff changeset
614 /* move on to the next object */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
615 q = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
616 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
617 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
618 \
a61af66fc99e Initial load
duke
parents:
diff changeset
619 assert(q == t, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
620 if (liveRange != NULL) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
621 liveRange->set_end(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
622 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
623 _end_of_live = end_of_live; \
a61af66fc99e Initial load
duke
parents:
diff changeset
624 if (end_of_live < first_dead) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
625 first_dead = end_of_live; \
a61af66fc99e Initial load
duke
parents:
diff changeset
626 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
627 _first_dead = first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
628 \
a61af66fc99e Initial load
duke
parents:
diff changeset
629 /* save the compaction_top of the compaction space. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
630 cp->space->set_compaction_top(compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
632
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
633 #define SCAN_AND_ADJUST_POINTERS(adjust_obj_size) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
634 /* adjust all the interior pointers to point at the new locations of objects \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
635 * Used by MarkSweep::mark_sweep_phase3() */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
637 HeapWord* q = bottom(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
638 HeapWord* t = _end_of_live; /* Established by "prepare_for_compaction". */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
640 assert(_first_dead <= _end_of_live, "Stands to reason, no?"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
641 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
642 if (q < t && _first_dead > q && \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643 !oop(q)->is_gc_marked()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
644 /* we have a chunk of the space which hasn't moved and we've \
a61af66fc99e Initial load
duke
parents:
diff changeset
645 * reinitialized the mark word during the previous pass, so we can't \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
646 * use is_gc_marked for the traversal. */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647 HeapWord* end = _first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
648 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
649 while (q < end) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
650 /* I originally tried to conjoin "block_start(q) == q" to the \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
651 * assertion below, but that doesn't work, because you can't \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
652 * accurately traverse previous objects to get to the current one \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
653 * after their pointers have been \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
654 * updated, until the actual compaction is done. dld, 4/00 */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
655 assert(block_is_obj(q), \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
656 "should be at block boundaries, and should be looking at objs"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
658 /* point all the oops to the new location */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
659 size_t size = oop(q)->adjust_pointers(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
660 size = adjust_obj_size(size); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
661 \
a61af66fc99e Initial load
duke
parents:
diff changeset
662 q += size; \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
663 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
664 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
665 if (_first_dead == t) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
666 q = t; \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
667 } else { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
668 /* $$$ This is funky. Using this to read the previously written \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
669 * LiveRange. See also use below. */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 q = (HeapWord*)oop(_first_dead)->mark()->decode_pointer(); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
671 } \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
672 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
673 \
a61af66fc99e Initial load
duke
parents:
diff changeset
674 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
675 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
676 debug_only(HeapWord* prev_q = NULL); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
677 while (q < t) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
678 /* prefetch beyond q */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 Prefetch::write(q, interval); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
680 if (oop(q)->is_gc_marked()) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
681 /* q is alive */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
682 /* point all the oops to the new location */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
683 size_t size = oop(q)->adjust_pointers(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
684 size = adjust_obj_size(size); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
685 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
686 q += size; \
356
tonyp
parents: 347 269
diff changeset
687 } else { \
tonyp
parents: 347 269
diff changeset
688 /* q is not a live object, so its mark should point at the next \
tonyp
parents: 347 269
diff changeset
689 * live object */ \
tonyp
parents: 347 269
diff changeset
690 debug_only(prev_q = q); \
tonyp
parents: 347 269
diff changeset
691 q = (HeapWord*) oop(q)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
692 assert(q > prev_q, "we should be moving forward through memory"); \
tonyp
parents: 347 269
diff changeset
693 } \
tonyp
parents: 347 269
diff changeset
694 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 \
356
tonyp
parents: 347 269
diff changeset
696 assert(q == t, "just checking"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698
356
tonyp
parents: 347 269
diff changeset
699 #define SCAN_AND_COMPACT(obj_size) { \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
700 /* Copy all live objects to their new location \
356
tonyp
parents: 347 269
diff changeset
701 * Used by MarkSweep::mark_sweep_phase4() */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702 \
356
tonyp
parents: 347 269
diff changeset
703 HeapWord* q = bottom(); \
tonyp
parents: 347 269
diff changeset
704 HeapWord* const t = _end_of_live; \
tonyp
parents: 347 269
diff changeset
705 debug_only(HeapWord* prev_q = NULL); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706 \
356
tonyp
parents: 347 269
diff changeset
707 if (q < t && _first_dead > q && \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
708 !oop(q)->is_gc_marked()) { \
356
tonyp
parents: 347 269
diff changeset
709 debug_only( \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
710 /* we have a chunk of the space which hasn't moved and we've reinitialized \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
711 * the mark word during the previous pass, so we can't use is_gc_marked for \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
712 * the traversal. */ \
356
tonyp
parents: 347 269
diff changeset
713 HeapWord* const end = _first_dead; \
tonyp
parents: 347 269
diff changeset
714 \
tonyp
parents: 347 269
diff changeset
715 while (q < end) { \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
716 size_t size = obj_size(q); \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
717 assert(!oop(q)->is_gc_marked(), \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
718 "should be unmarked (special dense prefix handling)"); \
356
tonyp
parents: 347 269
diff changeset
719 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
720 q += size; \
356
tonyp
parents: 347 269
diff changeset
721 } \
tonyp
parents: 347 269
diff changeset
722 ) /* debug_only */ \
tonyp
parents: 347 269
diff changeset
723 \
tonyp
parents: 347 269
diff changeset
724 if (_first_dead == t) { \
tonyp
parents: 347 269
diff changeset
725 q = t; \
tonyp
parents: 347 269
diff changeset
726 } else { \
tonyp
parents: 347 269
diff changeset
727 /* $$$ Funky */ \
tonyp
parents: 347 269
diff changeset
728 q = (HeapWord*) oop(_first_dead)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
729 } \
tonyp
parents: 347 269
diff changeset
730 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731 \
356
tonyp
parents: 347 269
diff changeset
732 const intx scan_interval = PrefetchScanIntervalInBytes; \
tonyp
parents: 347 269
diff changeset
733 const intx copy_interval = PrefetchCopyIntervalInBytes; \
tonyp
parents: 347 269
diff changeset
734 while (q < t) { \
tonyp
parents: 347 269
diff changeset
735 if (!oop(q)->is_gc_marked()) { \
tonyp
parents: 347 269
diff changeset
736 /* mark is pointer to next marked oop */ \
tonyp
parents: 347 269
diff changeset
737 debug_only(prev_q = q); \
tonyp
parents: 347 269
diff changeset
738 q = (HeapWord*) oop(q)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
739 assert(q > prev_q, "we should be moving forward through memory"); \
tonyp
parents: 347 269
diff changeset
740 } else { \
tonyp
parents: 347 269
diff changeset
741 /* prefetch beyond q */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
742 Prefetch::read(q, scan_interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
743 \
a61af66fc99e Initial load
duke
parents:
diff changeset
744 /* size and destination */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
745 size_t size = obj_size(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
746 HeapWord* compaction_top = (HeapWord*)oop(q)->forwardee(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
747 \
356
tonyp
parents: 347 269
diff changeset
748 /* prefetch beyond compaction_top */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
749 Prefetch::write(compaction_top, copy_interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
750 \
356
tonyp
parents: 347 269
diff changeset
751 /* copy object and reinit its mark */ \
tonyp
parents: 347 269
diff changeset
752 assert(q != compaction_top, "everything in this pass should be moving"); \
tonyp
parents: 347 269
diff changeset
753 Copy::aligned_conjoint_words(q, compaction_top, size); \
tonyp
parents: 347 269
diff changeset
754 oop(compaction_top)->init_mark(); \
tonyp
parents: 347 269
diff changeset
755 assert(oop(compaction_top)->klass() != NULL, "should have a class"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
756 \
356
tonyp
parents: 347 269
diff changeset
757 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758 q += size; \
356
tonyp
parents: 347 269
diff changeset
759 } \
tonyp
parents: 347 269
diff changeset
760 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
762 /* Let's remember if we were empty before we did the compaction. */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
763 bool was_empty = used_region().is_empty(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
764 /* Reset space after compaction is complete */ \
356
tonyp
parents: 347 269
diff changeset
765 reset_after_compaction(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
766 /* We do this clear, below, since it has overloaded meanings for some */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
767 /* space subtypes. For example, OffsetTableContigSpace's that were */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
768 /* compacted into will have had their offset table thresholds updated */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
769 /* continuously, but those that weren't need to have their thresholds */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
770 /* re-initialized. Also mangles unused area for debugging. */ \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
771 if (used_region().is_empty()) { \
356
tonyp
parents: 347 269
diff changeset
772 if (!was_empty) clear(SpaceDecorator::Mangle); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
773 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
774 if (ZapUnusedHeapArea) mangle_unused_area(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
775 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
778 class GenSpaceMangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
779
0
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // A space in which the free area is contiguous. It therefore supports
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // faster allocation, and compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
782 class ContiguousSpace: public CompactibleSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 friend class OneContigSpaceCardGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
786 HeapWord* _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
787 HeapWord* _concurrent_iteration_safe_limit;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
788 // A helper for mangling the unused area of the space in debug builds.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
789 GenSpaceMangler* _mangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
790
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
791 GenSpaceMangler* mangler() { return _mangler; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // Allocation helpers (return NULL if full).
a61af66fc99e Initial load
duke
parents:
diff changeset
794 inline HeapWord* allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
795 inline HeapWord* par_allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 public:
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
798 ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
799 ~ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
800
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
801 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
802 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
805 HeapWord* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
806 void set_top(HeapWord* value) { _top = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
807
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
808 virtual void set_saved_mark() { _saved_mark_word = top(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
809 void reset_saved_mark() { _saved_mark_word = bottom(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 WaterMark bottom_mark() { return WaterMark(this, bottom()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 WaterMark top_mark() { return WaterMark(this, top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
813 WaterMark saved_mark() { return WaterMark(this, saved_mark_word()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 bool saved_mark_at_top() const { return saved_mark_word() == top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
816 // In debug mode mangle (write it with a particular bit
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
817 // pattern) the unused part of a space.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
818
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
819 // Used to save the an address in a space for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
820 void set_top_for_allocations(HeapWord* v) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
821 // Used to save the space's current top for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
822 void set_top_for_allocations() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
823
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
824 // Mangle regions in the space from the current top up to the
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
825 // previously mangled part of the space.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
826 void mangle_unused_area() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
827 // Mangle [top, end)
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
828 void mangle_unused_area_complete() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
829 // Mangle the given MemRegion.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
830 void mangle_region(MemRegion mr) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
831
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
832 // Do some sparse checking on the area that should have been mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
833 void check_mangled_unused_area(HeapWord* limit) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
834 // Check the complete area that should have been mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
835 // This code may be NULL depending on the macro DEBUG_MANGLING.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
836 void check_mangled_unused_area_complete() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // Size computations: sizes in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
839 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 size_t used() const { return byte_size(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
841 size_t free() const { return byte_size(top(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // Override from space.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 virtual bool is_free_block(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // In a contiguous space we have a more obvious bound on what parts
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // contain objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
850 MemRegion used_region() const { return MemRegion(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 MemRegion used_region_at_save_marks() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 return MemRegion(bottom(), saved_mark_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
857 virtual HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 virtual HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 virtual bool obj_allocated_since_save_marks(const oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
861 return (HeapWord*)obj >= saved_mark_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // Iteration
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
865 void oop_iterate(ExtendedOopClosure* cl);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
866 void oop_iterate(MemRegion mr, ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 void object_iterate(ObjectClosure* blk);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
868 // For contiguous spaces this method will iterate safely over objects
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
869 // in the space (i.e., between bottom and top) when at a safepoint.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
870 void safe_object_iterate(ObjectClosure* blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871 void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // iterates on objects up to the safe limit
a61af66fc99e Initial load
duke
parents:
diff changeset
873 HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
6048
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
874 HeapWord* concurrent_iteration_safe_limit() {
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
875 assert(_concurrent_iteration_safe_limit <= top(),
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
876 "_concurrent_iteration_safe_limit update missed");
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
877 return _concurrent_iteration_safe_limit;
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
878 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // changes the safe limit, all objects from bottom() to the new
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // limit should be properly initialized
6048
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
881 void set_concurrent_iteration_safe_limit(HeapWord* new_limit) {
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
882 assert(new_limit <= top(), "uninitialized objects in the safe range");
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
883 _concurrent_iteration_safe_limit = new_limit;
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
884 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
886
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
887 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // In support of parallel oop_iterate.
a61af66fc99e Initial load
duke
parents:
diff changeset
889 #define ContigSpace_PAR_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
890 void par_oop_iterate(MemRegion mr, OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
893 #undef ContigSpace_PAR_OOP_ITERATE_DECL
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
894 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // Compaction support
a61af66fc99e Initial load
duke
parents:
diff changeset
897 virtual void reset_after_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
898 assert(compaction_top() >= bottom() && compaction_top() <= end(), "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
899 set_top(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // set new iteration safe limit
a61af66fc99e Initial load
duke
parents:
diff changeset
901 set_concurrent_iteration_safe_limit(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 virtual size_t minimum_free_block_size() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // Override.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
906 DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
907 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
908 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Apply "blk->do_oop" to the addresses of all reference fields in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // starting with the _saved_mark_word, which was noted during a generation's
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // save_marks and is required to denote the head of an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // Updates _saved_mark_word to point to just after the last object
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // iterated over.
a61af66fc99e Initial load
duke
parents:
diff changeset
917 #define ContigSpace_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
918 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 ALL_SINCE_SAVE_MARKS_CLOSURES(ContigSpace_OOP_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
921 #undef ContigSpace_OOP_SINCE_SAVE_MARKS_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Same as object_iterate, but starting from "mark", which is required
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // to denote the start of an object. Objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // applications of the closure *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 virtual void object_iterate_from(WaterMark mark, ObjectClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // Very inefficient implementation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
929 virtual HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
930 size_t block_size(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // If a block is in the allocated area, it is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
932 bool block_is_obj(const HeapWord* p) const { return p < top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // Addresses for inlined allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
935 HeapWord** top_addr() { return &_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 HeapWord** end_addr() { return &_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // Overrides for more efficient compaction support.
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // PrintHeapAtGC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
942 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // Checked dynamic downcasts.
a61af66fc99e Initial load
duke
parents:
diff changeset
945 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 return this;
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
950 virtual void verify() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // Used to increase collection frequency. "factor" of 0 means entire
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 void allocate_temporary_filler(int factor);
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 };
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // A dirty card to oop closure that does filtering.
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // It knows how to filter out objects that are outside of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
961 class Filtering_DCTOC : public DirtyCardToOopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
964 void walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
965 HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Walk the given memory region, from bottom to top, applying
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // the given oop closure to (possibly) all objects found. The
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // given oop closure may or may not be the same as the oop
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // closure with which this closure was created, as it may
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // be a filtering closure which makes use of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // We offer two signatures, so the FilteringClosure static type is
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // apparent.
a61af66fc99e Initial load
duke
parents:
diff changeset
974 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
975 HeapWord* bottom, HeapWord* top,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
976 ExtendedOopClosure* cl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
978 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
979 FilteringClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
982 Filtering_DCTOC(Space* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
983 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
984 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
985 DirtyCardToOopClosure(sp, cl, precision, boundary) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
986 };
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // A dirty card to oop closure for contiguous spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // (ContiguousSpace and sub-classes).
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // It is a FilteringClosure, as defined above, and it knows:
a61af66fc99e Initial load
duke
parents:
diff changeset
991 //
a61af66fc99e Initial load
duke
parents:
diff changeset
992 // 1. That the actual top of any area in a memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // contained by the space is bounded by the end of the contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // region of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // 2. That the space is really made up of objects and not just
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 class ContiguousSpaceDCTOC : public Filtering_DCTOC {
a61af66fc99e Initial load
duke
parents:
diff changeset
999 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // Overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 HeapWord* bottom, HeapWord* top,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1005 ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 FilteringClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1011 ContiguousSpaceDCTOC(ContiguousSpace* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 Filtering_DCTOC(sp, cl, precision, boundary)
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // Class EdenSpace describes eden-space in new generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 class DefNewGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 class EdenSpace : public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 DefNewGeneration* _gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // _soft_end is used as a soft limit on allocation. As soft limits are
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // reached, the slow-path allocation code can invoke other actions and then
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // adjust _soft_end up to a new soft limit or to end().
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 HeapWord* _soft_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
1034 EdenSpace(DefNewGeneration* gen) :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
1035 _gen(gen), _soft_end(NULL) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // Get/set just the 'soft' limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 HeapWord* soft_end() { return _soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 HeapWord** soft_end_addr() { return &_soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 void set_soft_end(HeapWord* value) { _soft_end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // Override.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1043 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // Set both the 'hard' and 'soft' limits (_end and _soft_end).
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 void set_end(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 set_soft_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 ContiguousSpace::set_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // Class ConcEdenSpace extends EdenSpace for the sake of safe
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // allocation while soft-end is being modified concurrently
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 class ConcEdenSpace : public EdenSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 ConcEdenSpace(DefNewGeneration* gen) : EdenSpace(gen) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // A ContigSpace that Supports an efficient "block_start" operation via
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // a BlockOffsetArray (whose BlockOffsetSharedArray may be shared with
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 // other spaces.) This is the abstract base class for old generation
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1071 // (tenured) spaces.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 class OffsetTableContigSpace: public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 BlockOffsetArrayContigSpace _offsets;
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 Mutex _par_alloc_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 OffsetTableContigSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 void set_bottom(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 void set_end(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1087 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
1089 inline HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Add offset table update.
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 virtual inline HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 inline HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 virtual HeapWord* initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
1102 void verify() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // Class TenuredSpace is used by TenuredGeneration
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 class TenuredSpace: public OffsetTableContigSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // Mark sweep support
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
1112 size_t allowed_dead_ratio() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 TenuredSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 OffsetTableContigSpace(sharedOffsetArray, mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
1119 #endif // SHARE_VM_MEMORY_SPACE_HPP