92
93 // Create the maps which is used to identify archive objects.
94 inline void G1ArchiveAllocator::enable_archive_object_check() {
95 if (_archive_check_enabled) {
96 return;
97 }
98
99 _archive_check_enabled = true;
100 size_t length = Universe::heap()->max_capacity();
101 _closed_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
102 (HeapWord*)Universe::heap()->base() + length,
103 HeapRegion::GrainBytes);
104 _open_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
105 (HeapWord*)Universe::heap()->base() + length,
106 HeapRegion::GrainBytes);
107 }
108
109 // Set the regions containing the specified address range as archive.
110 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
111 assert(_archive_check_enabled, "archive range check not enabled");
112 if (open) {
113 _open_archive_region_map.set_by_address(range, true);
114 } else {
115 _closed_archive_region_map.set_by_address(range, true);
116 }
117 }
118
119 // Check if an object is in a closed archive region using the _archive_region_map.
120 inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
121 // This is the out-of-line part of is_closed_archive_object test, done separately
122 // to avoid additional performance impact when the check is not enabled.
123 return _closed_archive_region_map.get_by_address((HeapWord*)object);
124 }
125
126 inline bool G1ArchiveAllocator::in_open_archive_range(oop object) {
127 return _open_archive_region_map.get_by_address((HeapWord*)object);
128 }
129
130 // Check if archive object checking is enabled, to avoid calling in_open/closed_archive_range
131 // unnecessarily.
132 inline bool G1ArchiveAllocator::archive_check_enabled() {
133 return _archive_check_enabled;
134 }
135
|
92
93 // Create the maps which is used to identify archive objects.
94 inline void G1ArchiveAllocator::enable_archive_object_check() {
95 if (_archive_check_enabled) {
96 return;
97 }
98
99 _archive_check_enabled = true;
100 size_t length = Universe::heap()->max_capacity();
101 _closed_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
102 (HeapWord*)Universe::heap()->base() + length,
103 HeapRegion::GrainBytes);
104 _open_archive_region_map.initialize((HeapWord*)Universe::heap()->base(),
105 (HeapWord*)Universe::heap()->base() + length,
106 HeapRegion::GrainBytes);
107 }
108
109 // Set the regions containing the specified address range as archive.
110 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
111 assert(_archive_check_enabled, "archive range check not enabled");
112 log_info(gc, cds)("Mark %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
113 open ? "open" : "closed",
114 p2i(range.start()),
115 p2i(range.last()));
116 if (open) {
117 _open_archive_region_map.set_by_address(range, true);
118 } else {
119 _closed_archive_region_map.set_by_address(range, true);
120 }
121 }
122
123 // Clear the archive regions map containing the specified address range.
124 inline void G1ArchiveAllocator::clear_range_archive(MemRegion range, bool open) {
125 assert(_archive_check_enabled, "archive range check not enabled");
126 log_info(gc, cds)("Clear %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
127 open ? "open" : "closed",
128 p2i(range.start()),
129 p2i(range.last()));
130 if (open) {
131 _open_archive_region_map.set_by_address(range, false);
132 } else {
133 _closed_archive_region_map.set_by_address(range, false);
134 }
135 }
136
137 // Check if an object is in a closed archive region using the _archive_region_map.
138 inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
139 // This is the out-of-line part of is_closed_archive_object test, done separately
140 // to avoid additional performance impact when the check is not enabled.
141 return _closed_archive_region_map.get_by_address((HeapWord*)object);
142 }
143
144 inline bool G1ArchiveAllocator::in_open_archive_range(oop object) {
145 return _open_archive_region_map.get_by_address((HeapWord*)object);
146 }
147
148 // Check if archive object checking is enabled, to avoid calling in_open/closed_archive_range
149 // unnecessarily.
150 inline bool G1ArchiveAllocator::archive_check_enabled() {
151 return _archive_check_enabled;
152 }
153
|