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

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents 9ee9cf798b59
children cff162798819
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
337
9ee9cf798b59 6754988: Update copyright year
xdono
parents: 263
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class PSMarkSweepDecorator;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class PSOldGen : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
28 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 friend class PSPromotionManager; // Uses the cas_allocate methods
a61af66fc99e Initial load
duke
parents:
diff changeset
30 friend class ParallelScavengeHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 friend class AdjoiningGenerations;
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
34 MemRegion _reserved; // Used for simple containment tests
a61af66fc99e Initial load
duke
parents:
diff changeset
35 PSVirtualSpace* _virtual_space; // Controls mapping and unmapping of virtual mem
a61af66fc99e Initial load
duke
parents:
diff changeset
36 ObjectStartArray _start_array; // Keeps track of where objects start in a 512b block
a61af66fc99e Initial load
duke
parents:
diff changeset
37 MutableSpace* _object_space; // Where all the objects live
a61af66fc99e Initial load
duke
parents:
diff changeset
38 PSMarkSweepDecorator* _object_mark_sweep; // The mark sweep view of _object_space
a61af66fc99e Initial load
duke
parents:
diff changeset
39 const char* const _name; // Name of this generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
42 PSGenerationCounters* _gen_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 SpaceCounters* _space_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Sizing information, in bytes, set in constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
46 const size_t _init_gen_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 const size_t _min_gen_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 const size_t _max_gen_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Used when initializing the _name field.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 static inline const char* select_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 HeapWord* allocate_noexpand(size_t word_size, bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // We assume the heap lock is held here.
a61af66fc99e Initial load
duke
parents:
diff changeset
55 assert(!is_tlab, "Does not support TLAB allocation");
a61af66fc99e Initial load
duke
parents:
diff changeset
56 assert_locked_or_safepoint(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 HeapWord* res = object_space()->allocate(word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 if (res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _start_array.allocate_block(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Support for MT garbage collection. CAS allocation is lower overhead than grabbing
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // and releasing the heap lock, which is held during gc's anyway. This method is not
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // safe for use at the same time as allocate_noexpand()!
a61af66fc99e Initial load
duke
parents:
diff changeset
67 HeapWord* cas_allocate_noexpand(size_t word_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 assert(SafepointSynchronize::is_at_safepoint(), "Must only be called at safepoint")
a61af66fc99e Initial load
duke
parents:
diff changeset
69 HeapWord* res = object_space()->cas_allocate(word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 if (res != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _start_array.allocate_block(res);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // Support for MT garbage collection. See above comment.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 HeapWord* cas_allocate(size_t word_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 HeapWord* res = cas_allocate_noexpand(word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 return (res == NULL) ? expand_and_cas_allocate(word_size) : res;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 HeapWord* expand_and_allocate(size_t word_size, bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 HeapWord* expand_and_cas_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 void expand(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 bool expand_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 bool expand_to_reserved();
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void shrink(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void post_resize();
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Initialize the generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 PSOldGen(ReservedSpace rs, size_t alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
95 size_t initial_size, size_t min_size, size_t max_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
96 const char* perf_data_name, int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 PSOldGen(size_t initial_size, size_t min_size, size_t max_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
99 const char* perf_data_name, int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 void initialize(ReservedSpace rs, size_t alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
102 const char* perf_data_name, int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void initialize_virtual_space(ReservedSpace rs, size_t alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void initialize_work(const char* perf_data_name, int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 MemRegion reserved() const { return _reserved; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 virtual size_t max_gen_size() { return _max_gen_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 size_t min_gen_size() { return _min_gen_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Returns limit on the maximum size of the generation. This
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // is the same as _max_gen_size for PSOldGen but need not be
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // for a derived class.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 virtual size_t gen_size_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 bool is_in(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 return _virtual_space->contains((void *)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 bool is_in_reserved(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 return reserved().contains(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 MutableSpace* object_space() const { return _object_space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 PSMarkSweepDecorator* object_mark_sweep() const { return _object_mark_sweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 ObjectStartArray* start_array() { return &_start_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 PSVirtualSpace* virtual_space() const { return _virtual_space;}
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Has the generation been successfully allocated?
a61af66fc99e Initial load
duke
parents:
diff changeset
129 bool is_allocated();
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // MarkSweep methods
a61af66fc99e Initial load
duke
parents:
diff changeset
132 virtual void precompact();
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Parallel old
a61af66fc99e Initial load
duke
parents:
diff changeset
137 virtual void move_and_update(ParCompactionManager* cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Size info
a61af66fc99e Initial load
duke
parents:
diff changeset
140 size_t capacity_in_bytes() const { return object_space()->capacity_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 size_t used_in_bytes() const { return object_space()->used_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 size_t free_in_bytes() const { return object_space()->free_in_bytes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 size_t capacity_in_words() const { return object_space()->capacity_in_words(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 size_t used_in_words() const { return object_space()->used_in_words(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 size_t free_in_words() const { return object_space()->free_in_words(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Includes uncommitted memory
a61af66fc99e Initial load
duke
parents:
diff changeset
149 size_t contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool is_maximal_no_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return virtual_space()->uncommitted_size() == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Calculating new sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void resize(size_t desired_free_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Allocation. We report all successful allocations to the size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Note that the perm gen does not use this method, and should not!
a61af66fc99e Initial load
duke
parents:
diff changeset
160 HeapWord* allocate(size_t word_size, bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 void oop_iterate(OopClosure* cl) { object_space()->oop_iterate(cl); }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 void object_iterate(ObjectClosure* cl) { object_space()->object_iterate(cl); }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Debugging - do not use for time critical operations
a61af66fc99e Initial load
duke
parents:
diff changeset
167 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 void print_used_change(size_t prev_used) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 void verify(bool allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void verify_object_start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // These should not used
a61af66fc99e Initial load
duke
parents:
diff changeset
175 virtual void reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // These should not used
a61af66fc99e Initial load
duke
parents:
diff changeset
178 virtual size_t available_for_expansion();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 virtual size_t available_for_contraction();
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void space_invariants() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Performace Counter support
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Printing support
a61af66fc99e Initial load
duke
parents:
diff changeset
187 virtual const char* name() const { return _name; }
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
188
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
189 // Debugging support
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
190 // Save the tops of all spaces for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
191 void record_spaces_top() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 };