annotate src/share/vm/gc_implementation/g1/heapRegionSet.cpp @ 4912:a9647476d1a4

7132029: G1: mixed GC phase lasts for longer than it should Summary: Revamp of the mechanism that chooses old regions for inclusion in the CSet. It simplifies the code and introduces min and max bounds on the number of old regions added to the CSet at each mixed GC to avoid pathological cases. It also ensures that when we do a mixed GC we'll always find old regions to add to the CSet (i.e., it eliminates the case where a mixed GC will collect no old regions which can happen today). Reviewed-by: johnc, brutisso
author tonyp
date Wed, 15 Feb 2012 13:06:53 -0500
parents 8aae2050e83e
children 720b6a76dd9d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
1 /*
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
4 *
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
7 * published by the Free Software Foundation.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
8 *
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
13 * accompanied this code).
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
14 *
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
18 *
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
21 * questions.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
22 *
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
23 */
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
24
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
25 #include "precompiled.hpp"
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
26 #include "gc_implementation/g1/heapRegionSet.inline.hpp"
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
27
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
28 size_t HeapRegionSetBase::_unrealistically_long_length = 0;
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
29 HRSPhase HeapRegionSetBase::_phase = HRSPhaseNone;
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
30
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
31 //////////////////// HeapRegionSetBase ////////////////////
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
32
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
33 void HeapRegionSetBase::set_unrealistically_long_length(size_t len) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
34 guarantee(_unrealistically_long_length == 0, "should only be set once");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
35 _unrealistically_long_length = len;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
36 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
37
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
38 size_t HeapRegionSetBase::calculate_region_num(HeapRegion* hr) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
39 assert(hr->startsHumongous(), "pre-condition");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
40 assert(hr->capacity() % HeapRegion::GrainBytes == 0, "invariant");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
41 size_t region_num = hr->capacity() >> HeapRegion::LogOfHRGrainBytes;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
42 assert(region_num > 0, "sanity");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
43 return region_num;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
44 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
45
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
46 void HeapRegionSetBase::fill_in_ext_msg(hrs_ext_msg* msg, const char* message) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
47 msg->append("[%s] %s "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
48 "ln: "SIZE_FORMAT" rn: "SIZE_FORMAT" "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
49 "cy: "SIZE_FORMAT" ud: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
50 name(), message, length(), region_num(),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
51 total_capacity_bytes(), total_used_bytes());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
52 fill_in_ext_msg_extra(msg);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
53 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
54
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
55 bool HeapRegionSetBase::verify_region(HeapRegion* hr,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
56 HeapRegionSetBase* expected_containing_set) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
57 const char* error_message = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
58
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
59 if (!regions_humongous()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
60 if (hr->isHumongous()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
61 error_message = "the region should not be humongous";
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
62 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
63 } else {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
64 if (!hr->isHumongous() || !hr->startsHumongous()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
65 error_message = "the region should be 'starts humongous'";
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
66 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
67 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
68
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
69 if (!regions_empty()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
70 if (hr->is_empty()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
71 error_message = "the region should not be empty";
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
72 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
73 } else {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
74 if (!hr->is_empty()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
75 error_message = "the region should be empty";
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
76 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
77 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
78
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
79 #ifdef ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
80 // The _containing_set field is only available when ASSERT is defined.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
81 if (hr->containing_set() != expected_containing_set) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
82 error_message = "inconsistent containing set found";
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
83 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
84 #endif // ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
85
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
86 const char* extra_error_message = verify_region_extra(hr);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
87 if (extra_error_message != NULL) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
88 error_message = extra_error_message;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
89 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
90
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
91 if (error_message != NULL) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
92 outputStream* out = tty;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
93 out->cr();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
94 out->print_cr("## [%s] %s", name(), error_message);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
95 out->print_cr("## Offending Region: "PTR_FORMAT, hr);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
96 out->print_cr(" "HR_FORMAT, HR_FORMAT_PARAMS(hr));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
97 #ifdef ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
98 out->print_cr(" containing set: "PTR_FORMAT, hr->containing_set());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
99 #endif // ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
100 out->print_cr("## Offending Region Set: "PTR_FORMAT, this);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
101 print_on(out);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
102 return false;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
103 } else {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
104 return true;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
105 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
106 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
107
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
108 void HeapRegionSetBase::verify() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
109 // It's important that we also observe the MT safety protocol even
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
110 // for the verification calls. If we do verification without the
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
111 // appropriate locks and the set changes underneath our feet
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
112 // verification might fail and send us on a wild goose chase.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
113 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
114
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
115 guarantee(( is_empty() && length() == 0 && region_num() == 0 &&
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
116 total_used_bytes() == 0 && total_capacity_bytes() == 0) ||
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
117 (!is_empty() && length() >= 0 && region_num() >= 0 &&
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
118 total_used_bytes() >= 0 && total_capacity_bytes() >= 0),
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
119 hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
120
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
121 guarantee((!regions_humongous() && region_num() == length()) ||
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
122 ( regions_humongous() && region_num() >= length()),
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
123 hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
124
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
125 guarantee(!regions_empty() || total_used_bytes() == 0,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
126 hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
127
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
128 guarantee(total_used_bytes() <= total_capacity_bytes(),
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
129 hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
130 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
131
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
132 void HeapRegionSetBase::verify_start() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
133 // See comment in verify() about MT safety and verification.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
134 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
135 assert(!_verify_in_progress,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
136 hrs_ext_msg(this, "verification should not be in progress"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
137
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
138 // Do the basic verification first before we do the checks over the regions.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
139 HeapRegionSetBase::verify();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
140
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
141 _calc_length = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
142 _calc_region_num = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
143 _calc_total_capacity_bytes = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
144 _calc_total_used_bytes = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
145 _verify_in_progress = true;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
146 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
147
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
148 void HeapRegionSetBase::verify_next_region(HeapRegion* hr) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
149 // See comment in verify() about MT safety and verification.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
150 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
151 assert(_verify_in_progress,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
152 hrs_ext_msg(this, "verification should be in progress"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
153
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
154 guarantee(verify_region(hr, this), hrs_ext_msg(this, "region verification"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
155
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
156 _calc_length += 1;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
157 if (!hr->isHumongous()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
158 _calc_region_num += 1;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
159 } else {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
160 _calc_region_num += calculate_region_num(hr);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
161 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
162 _calc_total_capacity_bytes += hr->capacity();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
163 _calc_total_used_bytes += hr->used();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
164 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
165
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
166 void HeapRegionSetBase::verify_end() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
167 // See comment in verify() about MT safety and verification.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
168 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
169 assert(_verify_in_progress,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
170 hrs_ext_msg(this, "verification should be in progress"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
171
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
172 guarantee(length() == _calc_length,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
173 hrs_err_msg("[%s] length: "SIZE_FORMAT" should be == "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
174 "calc length: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
175 name(), length(), _calc_length));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
176
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
177 guarantee(region_num() == _calc_region_num,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
178 hrs_err_msg("[%s] region num: "SIZE_FORMAT" should be == "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
179 "calc region num: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
180 name(), region_num(), _calc_region_num));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
181
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
182 guarantee(total_capacity_bytes() == _calc_total_capacity_bytes,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
183 hrs_err_msg("[%s] capacity bytes: "SIZE_FORMAT" should be == "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
184 "calc capacity bytes: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
185 name(),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
186 total_capacity_bytes(), _calc_total_capacity_bytes));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
187
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
188 guarantee(total_used_bytes() == _calc_total_used_bytes,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
189 hrs_err_msg("[%s] used bytes: "SIZE_FORMAT" should be == "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
190 "calc used bytes: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
191 name(), total_used_bytes(), _calc_total_used_bytes));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
192
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
193 _verify_in_progress = false;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
194 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
195
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
196 void HeapRegionSetBase::clear_phase() {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
197 assert(_phase != HRSPhaseNone, "pre-condition");
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
198 _phase = HRSPhaseNone;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
199 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
200
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
201 void HeapRegionSetBase::set_phase(HRSPhase phase) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
202 assert(_phase == HRSPhaseNone, "pre-condition");
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
203 assert(phase != HRSPhaseNone, "pre-condition");
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
204 _phase = phase;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
205 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 2432
diff changeset
206
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
207 void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
208 out->cr();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
209 out->print_cr("Set: %s ("PTR_FORMAT")", name(), this);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
210 out->print_cr(" Region Assumptions");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
211 out->print_cr(" humongous : %s", BOOL_TO_STR(regions_humongous()));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
212 out->print_cr(" empty : %s", BOOL_TO_STR(regions_empty()));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
213 out->print_cr(" Attributes");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
214 out->print_cr(" length : "SIZE_FORMAT_W(14), length());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
215 out->print_cr(" region num : "SIZE_FORMAT_W(14), region_num());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
216 out->print_cr(" total capacity : "SIZE_FORMAT_W(14)" bytes",
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
217 total_capacity_bytes());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
218 out->print_cr(" total used : "SIZE_FORMAT_W(14)" bytes",
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
219 total_used_bytes());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
220 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
221
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
222 void HeapRegionSetBase::clear() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
223 _length = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
224 _region_num = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
225 _total_used_bytes = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
226 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
227
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
228 HeapRegionSetBase::HeapRegionSetBase(const char* name)
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
229 : _name(name), _verify_in_progress(false),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
230 _calc_length(0), _calc_region_num(0),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
231 _calc_total_capacity_bytes(0), _calc_total_used_bytes(0) { }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
232
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
233 //////////////////// HeapRegionSet ////////////////////
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
234
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
235 void HeapRegionSet::update_from_proxy(HeapRegionSet* proxy_set) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
236 hrs_assert_mt_safety_ok(this);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
237 hrs_assert_mt_safety_ok(proxy_set);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
238 hrs_assert_sets_match(this, proxy_set);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
239
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
240 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
241 proxy_set->verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
242
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
243 if (proxy_set->is_empty()) return;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
244
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
245 assert(proxy_set->length() <= _length,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
246 hrs_err_msg("[%s] proxy set length: "SIZE_FORMAT" "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
247 "should be <= length: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
248 name(), proxy_set->length(), _length));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
249 _length -= proxy_set->length();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
250
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
251 assert(proxy_set->region_num() <= _region_num,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
252 hrs_err_msg("[%s] proxy set region num: "SIZE_FORMAT" "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
253 "should be <= region num: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
254 name(), proxy_set->region_num(), _region_num));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
255 _region_num -= proxy_set->region_num();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
256
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
257 assert(proxy_set->total_used_bytes() <= _total_used_bytes,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
258 hrs_err_msg("[%s] proxy set used bytes: "SIZE_FORMAT" "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
259 "should be <= used bytes: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
260 name(), proxy_set->total_used_bytes(),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
261 _total_used_bytes));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
262 _total_used_bytes -= proxy_set->total_used_bytes();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
263
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
264 proxy_set->clear();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
265
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
266 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
267 proxy_set->verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
268 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
269
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
270 //////////////////// HeapRegionLinkedList ////////////////////
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
271
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
272 void HeapRegionLinkedList::fill_in_ext_msg_extra(hrs_ext_msg* msg) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
273 msg->append(" hd: "PTR_FORMAT" tl: "PTR_FORMAT, head(), tail());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
274 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
275
2432
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
276 void HeapRegionLinkedList::add_as_head(HeapRegionLinkedList* from_list) {
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
277 hrs_assert_mt_safety_ok(this);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
278 hrs_assert_mt_safety_ok(from_list);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
279
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
280 verify_optional();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
281 from_list->verify_optional();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
282
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
283 if (from_list->is_empty()) return;
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
284
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
285 #ifdef ASSERT
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
286 HeapRegionLinkedListIterator iter(from_list);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
287 while (iter.more_available()) {
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
288 HeapRegion* hr = iter.get_next();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
289 // In set_containing_set() we check that we either set the value
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
290 // from NULL to non-NULL or vice versa to catch bugs. So, we have
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
291 // to NULL it first before setting it to the value.
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
292 hr->set_containing_set(NULL);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
293 hr->set_containing_set(this);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
294 }
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
295 #endif // ASSERT
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
296
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
297 if (_head != NULL) {
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
298 assert(length() > 0 && _tail != NULL, hrs_ext_msg(this, "invariant"));
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
299 from_list->_tail->set_next(_head);
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
300 } else {
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
301 assert(length() == 0 && _head == NULL, hrs_ext_msg(this, "invariant"));
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
302 _tail = from_list->_tail;
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
303 }
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
304 _head = from_list->_head;
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
305
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
306 _length += from_list->length();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
307 _region_num += from_list->region_num();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
308 _total_used_bytes += from_list->total_used_bytes();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
309 from_list->clear();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
310
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
311 verify_optional();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
312 from_list->verify_optional();
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
313 }
455328d90876 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 2361
diff changeset
314
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
315 void HeapRegionLinkedList::add_as_tail(HeapRegionLinkedList* from_list) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
316 hrs_assert_mt_safety_ok(this);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
317 hrs_assert_mt_safety_ok(from_list);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
318
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
319 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
320 from_list->verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
321
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
322 if (from_list->is_empty()) return;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
323
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
324 #ifdef ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
325 HeapRegionLinkedListIterator iter(from_list);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
326 while (iter.more_available()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
327 HeapRegion* hr = iter.get_next();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
328 // In set_containing_set() we check that we either set the value
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
329 // from NULL to non-NULL or vice versa to catch bugs. So, we have
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
330 // to NULL it first before setting it to the value.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
331 hr->set_containing_set(NULL);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
332 hr->set_containing_set(this);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
333 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
334 #endif // ASSERT
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
335
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
336 if (_tail != NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
337 assert(length() > 0 && _head != NULL, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
338 _tail->set_next(from_list->_head);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
339 } else {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
340 assert(length() == 0 && _head == NULL, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
341 _head = from_list->_head;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
342 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
343 _tail = from_list->_tail;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
344
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
345 _length += from_list->length();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
346 _region_num += from_list->region_num();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
347 _total_used_bytes += from_list->total_used_bytes();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
348 from_list->clear();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
349
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
350 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
351 from_list->verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
352 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
353
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
354 void HeapRegionLinkedList::remove_all() {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
355 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
356 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
357
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
358 HeapRegion* curr = _head;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
359 while (curr != NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
360 hrs_assert_region_ok(this, curr, this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
361
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
362 HeapRegion* next = curr->next();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
363 curr->set_next(NULL);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
364 curr->set_containing_set(NULL);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
365 curr = next;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
366 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
367 clear();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
368
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
369 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
370 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
371
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
372 void HeapRegionLinkedList::remove_all_pending(size_t target_count) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
373 hrs_assert_mt_safety_ok(this);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
374 assert(target_count > 1, hrs_ext_msg(this, "pre-condition"));
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
375 assert(!is_empty(), hrs_ext_msg(this, "pre-condition"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
376
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
377 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
378 DEBUG_ONLY(size_t old_length = length();)
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
379
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
380 HeapRegion* curr = _head;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
381 HeapRegion* prev = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
382 size_t count = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
383 while (curr != NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
384 hrs_assert_region_ok(this, curr, this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
385 HeapRegion* next = curr->next();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
386
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
387 if (curr->pending_removal()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
388 assert(count < target_count,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
389 hrs_err_msg("[%s] should not come across more regions "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
390 "pending for removal than target_count: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
391 name(), target_count));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
392
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
393 if (prev == NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
394 assert(_head == curr, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
395 _head = next;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
396 } else {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
397 assert(_head != curr, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
398 prev->set_next(next);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
399 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
400 if (next == NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
401 assert(_tail == curr, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
402 _tail = prev;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
403 } else {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
404 assert(_tail != curr, hrs_ext_msg(this, "invariant"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
405 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
406
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
407 curr->set_next(NULL);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
408 remove_internal(curr);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
409 curr->set_pending_removal(false);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
410
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
411 count += 1;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
412
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
413 // If we have come across the target number of regions we can
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
414 // just bail out. However, for debugging purposes, we can just
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
415 // carry on iterating to make sure there are not more regions
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
416 // tagged with pending removal.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
417 DEBUG_ONLY(if (count == target_count) break;)
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
418 } else {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
419 prev = curr;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
420 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
421 curr = next;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
422 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
423
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
424 assert(count == target_count,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
425 hrs_err_msg("[%s] count: "SIZE_FORMAT" should be == "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
426 "target_count: "SIZE_FORMAT, name(), count, target_count));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
427 assert(length() + target_count == old_length,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
428 hrs_err_msg("[%s] new length should be consistent "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
429 "new length: "SIZE_FORMAT" old length: "SIZE_FORMAT" "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
430 "target_count: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
431 name(), length(), old_length, target_count));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
432
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
433 verify_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
434 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
435
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
436 void HeapRegionLinkedList::verify() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
437 // See comment in HeapRegionSetBase::verify() about MT safety and
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
438 // verification.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
439 hrs_assert_mt_safety_ok(this);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
440
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
441 // This will also do the basic verification too.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
442 verify_start();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
443
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
444 HeapRegion* curr = _head;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
445 HeapRegion* prev1 = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
446 HeapRegion* prev0 = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
447 size_t count = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
448 while (curr != NULL) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
449 verify_next_region(curr);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
450
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
451 count += 1;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
452 guarantee(count < _unrealistically_long_length,
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
453 hrs_err_msg("[%s] the calculated length: "SIZE_FORMAT" "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
454 "seems very long, is there maybe a cycle? "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
455 "curr: "PTR_FORMAT" prev0: "PTR_FORMAT" "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
456 "prev1: "PTR_FORMAT" length: "SIZE_FORMAT,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
457 name(), count, curr, prev0, prev1, length()));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
458
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
459 prev1 = prev0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
460 prev0 = curr;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
461 curr = curr->next();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
462 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
463
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2152
diff changeset
464 guarantee(_tail == prev0, hrs_ext_msg(this, "post-condition"));
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
465
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
466 verify_end();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
467 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
468
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
469 void HeapRegionLinkedList::clear() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
470 HeapRegionSetBase::clear();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
471 _head = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
472 _tail = NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
473 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
474
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
475 void HeapRegionLinkedList::print_on(outputStream* out, bool print_contents) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
476 HeapRegionSetBase::print_on(out, print_contents);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
477 out->print_cr(" Linking");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
478 out->print_cr(" head : "PTR_FORMAT, _head);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
479 out->print_cr(" tail : "PTR_FORMAT, _tail);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
480
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
481 if (print_contents) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
482 out->print_cr(" Contents");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
483 HeapRegionLinkedListIterator iter(this);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
484 while (iter.more_available()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
485 HeapRegion* hr = iter.get_next();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
486 hr->print_on(out);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
487 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
488 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents:
diff changeset
489 }