annotate src/share/vm/memory/cardTableRS.hpp @ 2368:dde920245681

6896099: Integrate CMS heap ergo with default heap sizing ergo 6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m 7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification 7027529: CMS: retire CMSUseOldDefaults flag Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago. Reviewed-by: brutisso, poonam
author ysr
date Wed, 16 Mar 2011 10:37:08 -0700
parents f95d63e2154a
children c48ad6ab8bdf
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) 2001, 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: 356
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 356
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: 356
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_CARDTABLERS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_MEMORY_CARDTABLERS_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/cardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/genRemSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class OopsInGenClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class DirtyCardToOopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // This kind of "GenRemSet" uses a card table both as shared data structure
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // for a mod ref barrier set and for the rem set information.
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class CardTableRS: public GenRemSet {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Below are private classes used in impl.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 friend class VerifyCTSpaceClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 friend class ClearNoncleanCardWrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 static jbyte clean_card_val() {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 return CardTableModRefBS::clean_card;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 }
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 static bool
a61af66fc99e Initial load
duke
parents:
diff changeset
50 card_is_dirty_wrt_gen_iter(jbyte cv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 return CardTableModRefBS::card_is_dirty_wrt_gen_iter(cv);
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
54 CardTableModRefBSForCTRS* _ct_bs;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 virtual void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 void verify_space(Space* s, HeapWord* gen_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 enum ExtendedCardValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 youngergen_card = CardTableModRefBS::CT_MR_BS_last_reserved + 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // These are for parallel collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // There are three P (parallel) youngergen card values. In general, this
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // needs to be more than the number of generations (including the perm
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // gen) that might have younger_refs_do invoked on them separately. So
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // if we add more gens, we have to add more values.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 youngergenP1_card = CardTableModRefBS::CT_MR_BS_last_reserved + 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 youngergenP2_card = CardTableModRefBS::CT_MR_BS_last_reserved + 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 youngergenP3_card = CardTableModRefBS::CT_MR_BS_last_reserved + 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
70 cur_youngergen_and_prev_nonclean_card =
a61af66fc99e Initial load
duke
parents:
diff changeset
71 CardTableModRefBS::CT_MR_BS_last_reserved + 5
a61af66fc99e Initial load
duke
parents:
diff changeset
72 };
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // An array that contains, for each generation, the card table value last
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // used as the current value for a younger_refs_do iteration of that
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // portion of the table. (The perm gen is index 0; other gens are at
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // their level plus 1. They youngest gen is in the table, but will
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // always have the value "clean_card".)
a61af66fc99e Initial load
duke
parents:
diff changeset
79 jbyte* _last_cur_val_in_gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 jbyte _cur_youngergen_card_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
83 int _regions_to_iterate;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
84
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85 jbyte cur_youngergen_card_val() {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return _cur_youngergen_card_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void set_cur_youngergen_card_val(jbyte v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _cur_youngergen_card_val = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 bool is_prev_youngergen_card_val(jbyte v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 return
a61af66fc99e Initial load
duke
parents:
diff changeset
93 youngergen_card <= v &&
a61af66fc99e Initial load
duke
parents:
diff changeset
94 v < cur_youngergen_and_prev_nonclean_card &&
a61af66fc99e Initial load
duke
parents:
diff changeset
95 v != _cur_youngergen_card_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Return a youngergen_card_value that is not currently in use.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 jbyte find_unused_youngergenP_card_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
101 CardTableRS(MemRegion whole_heap, int max_covered_regions);
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // *** GenRemSet functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 GenRemSet::Name rs_kind() { return GenRemSet::CardTable; }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 CardTableRS* as_CardTableRS() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
108 CardTableModRefBS* ct_bs() { return _ct_bs; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void prepare_for_younger_refs_iterate(bool parallel);
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Card table entries are cleared before application; "blk" is
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // responsible for dirtying if the oop is still older-to-younger after
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // closure application.
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void younger_refs_iterate(Generation* g, OopsInGenClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 6
diff changeset
118 void inline_write_ref_field_gc(void* field, oop new_val) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
119 jbyte* byte = _ct_bs->byte_for(field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 *byte = youngergen_card;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 6
diff changeset
122 void write_ref_field_gc_work(void* field, oop new_val) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 inline_write_ref_field_gc(field, new_val);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Override. Might want to devirtualize this in the same fashion as
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // above. Ensures that the value of the card for field says that it's
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // a younger card in the current collection.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 6
diff changeset
129 virtual void write_ref_field_gc_par(void* field, oop new_val);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void resize_covered_region(MemRegion new_region);
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 bool is_aligned(HeapWord* addr) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
134 return _ct_bs->is_card_aligned(addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 void verify();
6
73e96e5c30df 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 0
diff changeset
138 void verify_aligned_region_empty(MemRegion mr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
140 void clear(MemRegion mr) { _ct_bs->clear(mr); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 void clear_into_younger(Generation* gen, bool clear_perm);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
143 void invalidate(MemRegion mr, bool whole_heap = false) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
144 _ct_bs->invalidate(mr, whole_heap);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
145 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void invalidate_or_clear(Generation* gen, bool younger, bool perm);
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 static uintx ct_max_alignment_constraint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return CardTableModRefBS::ct_max_alignment_constraint();
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
152 jbyte* byte_for(void* p) { return _ct_bs->byte_for(p); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
153 jbyte* byte_after(void* p) { return _ct_bs->byte_after(p); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
154 HeapWord* addr_for(jbyte* p) { return _ct_bs->addr_for(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 bool is_prev_nonclean_card_val(jbyte v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return
a61af66fc99e Initial load
duke
parents:
diff changeset
158 youngergen_card <= v &&
a61af66fc99e Initial load
duke
parents:
diff changeset
159 v <= cur_youngergen_and_prev_nonclean_card &&
a61af66fc99e Initial load
duke
parents:
diff changeset
160 v != _cur_youngergen_card_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 static bool youngergen_may_have_been_dirty(jbyte cv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 return cv == CardTableRS::cur_youngergen_and_prev_nonclean_card;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
168
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
169 #endif // SHARE_VM_MEMORY_CARDTABLERS_HPP