annotate src/share/vm/memory/space.hpp @ 1994:6cd6d394f280

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