Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/g1/heapRegionSet.inline.hpp @ 12233:40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation.
Reviewed-by: stefank, dholmes
author | tschatzl |
---|---|
date | Wed, 11 Sep 2013 16:25:02 +0200 |
parents | a2f7274eb6ef |
children | 992f62c457b0 58fc1b1523dc |
rev | line source |
---|---|
2152 | 1 /* |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3860
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
2152 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP | |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP | |
27 | |
28 #include "gc_implementation/g1/heapRegionSet.hpp" | |
29 | |
30 //////////////////// HeapRegionSetBase //////////////////// | |
31 | |
32 inline void HeapRegionSetBase::update_for_addition(HeapRegion* hr) { | |
33 // Assumes the caller has already verified the region. | |
34 | |
35 _length += 1; | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6010
diff
changeset
|
36 _region_num += hr->region_num(); |
2152 | 37 _total_used_bytes += hr->used(); |
38 } | |
39 | |
40 inline void HeapRegionSetBase::add_internal(HeapRegion* hr) { | |
2361 | 41 hrs_assert_region_ok(this, hr, NULL); |
42 assert(hr->next() == NULL, hrs_ext_msg(this, "should not already be linked")); | |
2152 | 43 |
44 update_for_addition(hr); | |
45 hr->set_containing_set(this); | |
46 } | |
47 | |
48 inline void HeapRegionSetBase::update_for_removal(HeapRegion* hr) { | |
49 // Assumes the caller has already verified the region. | |
2361 | 50 assert(_length > 0, hrs_ext_msg(this, "pre-condition")); |
2152 | 51 _length -= 1; |
52 | |
6254
a2f7274eb6ef
7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents:
6010
diff
changeset
|
53 uint region_num_diff = hr->region_num(); |
2152 | 54 assert(region_num_diff <= _region_num, |
6010
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3860
diff
changeset
|
55 hrs_err_msg("[%s] region's region num: %u " |
720b6a76dd9d
7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents:
3860
diff
changeset
|
56 "should be <= region num: %u", |
2152 | 57 name(), region_num_diff, _region_num)); |
58 _region_num -= region_num_diff; | |
59 | |
60 size_t used_bytes = hr->used(); | |
61 assert(used_bytes <= _total_used_bytes, | |
2361 | 62 hrs_err_msg("[%s] region's used bytes: "SIZE_FORMAT" " |
2152 | 63 "should be <= used bytes: "SIZE_FORMAT, |
64 name(), used_bytes, _total_used_bytes)); | |
65 _total_used_bytes -= used_bytes; | |
66 } | |
67 | |
68 inline void HeapRegionSetBase::remove_internal(HeapRegion* hr) { | |
2361 | 69 hrs_assert_region_ok(this, hr, this); |
70 assert(hr->next() == NULL, hrs_ext_msg(this, "should already be unlinked")); | |
2152 | 71 |
72 hr->set_containing_set(NULL); | |
73 update_for_removal(hr); | |
74 } | |
75 | |
76 //////////////////// HeapRegionSet //////////////////// | |
77 | |
78 inline void HeapRegionSet::add(HeapRegion* hr) { | |
2361 | 79 hrs_assert_mt_safety_ok(this); |
2152 | 80 // add_internal() will verify the region. |
81 add_internal(hr); | |
82 } | |
83 | |
84 inline void HeapRegionSet::remove(HeapRegion* hr) { | |
2361 | 85 hrs_assert_mt_safety_ok(this); |
2152 | 86 // remove_internal() will verify the region. |
87 remove_internal(hr); | |
88 } | |
89 | |
90 inline void HeapRegionSet::remove_with_proxy(HeapRegion* hr, | |
91 HeapRegionSet* proxy_set) { | |
92 // No need to fo the MT safety check here given that this method | |
93 // does not update the contents of the set but instead accumulates | |
94 // the changes in proxy_set which is assumed to be thread-local. | |
2361 | 95 hrs_assert_sets_match(this, proxy_set); |
96 hrs_assert_region_ok(this, hr, this); | |
2152 | 97 |
98 hr->set_containing_set(NULL); | |
99 proxy_set->update_for_addition(hr); | |
100 } | |
101 | |
102 //////////////////// HeapRegionLinkedList //////////////////// | |
103 | |
2432
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
104 inline void HeapRegionLinkedList::add_as_head(HeapRegion* hr) { |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
105 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
|
106 assert((length() == 0 && _head == NULL && _tail == NULL) || |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
107 (length() > 0 && _head != NULL && _tail != NULL), |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
108 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
|
109 // add_internal() will verify the region. |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
110 add_internal(hr); |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
111 |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
112 // Now link the region. |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
113 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
|
114 hr->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
|
115 } else { |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
116 _tail = hr; |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
117 } |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
118 _head = hr; |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
119 } |
455328d90876
7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents:
2361
diff
changeset
|
120 |
2152 | 121 inline void HeapRegionLinkedList::add_as_tail(HeapRegion* hr) { |
2361 | 122 hrs_assert_mt_safety_ok(this); |
2152 | 123 assert((length() == 0 && _head == NULL && _tail == NULL) || |
124 (length() > 0 && _head != NULL && _tail != NULL), | |
2361 | 125 hrs_ext_msg(this, "invariant")); |
2152 | 126 // add_internal() will verify the region. |
127 add_internal(hr); | |
128 | |
129 // Now link the region. | |
130 if (_tail != NULL) { | |
131 _tail->set_next(hr); | |
132 } else { | |
133 _head = hr; | |
134 } | |
135 _tail = hr; | |
136 } | |
137 | |
138 inline HeapRegion* HeapRegionLinkedList::remove_head() { | |
2361 | 139 hrs_assert_mt_safety_ok(this); |
140 assert(!is_empty(), hrs_ext_msg(this, "the list should not be empty")); | |
2152 | 141 assert(length() > 0 && _head != NULL && _tail != NULL, |
2361 | 142 hrs_ext_msg(this, "invariant")); |
2152 | 143 |
144 // We need to unlink it first. | |
145 HeapRegion* hr = _head; | |
146 _head = hr->next(); | |
147 if (_head == NULL) { | |
148 _tail = NULL; | |
149 } | |
150 hr->set_next(NULL); | |
151 | |
152 // remove_internal() will verify the region. | |
153 remove_internal(hr); | |
154 return hr; | |
155 } | |
156 | |
157 inline HeapRegion* HeapRegionLinkedList::remove_head_or_null() { | |
2361 | 158 hrs_assert_mt_safety_ok(this); |
2152 | 159 |
160 if (!is_empty()) { | |
161 return remove_head(); | |
162 } else { | |
163 return NULL; | |
164 } | |
165 } | |
166 | |
167 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP |