53 } else { |
53 } else { |
54 return buffer->allocate_aligned(word_sz, _survivor_alignment_bytes); |
54 return buffer->allocate_aligned(word_sz, _survivor_alignment_bytes); |
55 } |
55 } |
56 } |
56 } |
57 |
57 |
58 // Create the _archive_region_map which is used to identify archive objects. |
58 // Create the maps which is used to identify archive objects. |
59 inline void G1ArchiveAllocator::enable_archive_object_check() { |
59 inline void G1ArchiveAllocator::enable_archive_object_check() { |
60 assert(!_archive_check_enabled, "archive range check already enabled"); |
60 if (_archive_check_enabled) { |
|
61 return; |
|
62 } |
|
63 |
61 _archive_check_enabled = true; |
64 _archive_check_enabled = true; |
62 size_t length = Universe::heap()->max_capacity(); |
65 size_t length = Universe::heap()->max_capacity(); |
63 _archive_region_map.initialize((HeapWord*)Universe::heap()->base(), |
66 _closed_archive_region_map.initialize((HeapWord*)Universe::heap()->base(), |
64 (HeapWord*)Universe::heap()->base() + length, |
67 (HeapWord*)Universe::heap()->base() + length, |
65 HeapRegion::GrainBytes); |
68 HeapRegion::GrainBytes); |
|
69 _open_archive_region_map.initialize((HeapWord*)Universe::heap()->base(), |
|
70 (HeapWord*)Universe::heap()->base() + length, |
|
71 HeapRegion::GrainBytes); |
66 } |
72 } |
67 |
73 |
68 // Set the regions containing the specified address range as archive/non-archive. |
74 // Set the regions containing the specified address range as archive. |
69 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool is_archive) { |
75 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) { |
70 assert(_archive_check_enabled, "archive range check not enabled"); |
76 assert(_archive_check_enabled, "archive range check not enabled"); |
71 _archive_region_map.set_by_address(range, is_archive); |
77 if (open) { |
|
78 _open_archive_region_map.set_by_address(range, true); |
|
79 } else { |
|
80 _closed_archive_region_map.set_by_address(range, true); |
|
81 } |
72 } |
82 } |
73 |
83 |
74 // Check if an object is in an archive region using the _archive_region_map. |
84 // Check if an object is in a closed archive region using the _archive_region_map. |
75 inline bool G1ArchiveAllocator::in_archive_range(oop object) { |
85 inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) { |
76 // This is the out-of-line part of is_archive_object test, done separately |
86 // This is the out-of-line part of is_closed_archive_object test, done separately |
77 // to avoid additional performance impact when the check is not enabled. |
87 // to avoid additional performance impact when the check is not enabled. |
78 return _archive_region_map.get_by_address((HeapWord*)object); |
88 return _closed_archive_region_map.get_by_address((HeapWord*)object); |
79 } |
89 } |
80 |
90 |
81 // Check if archive object checking is enabled, to avoid calling in_archive_range |
91 inline bool G1ArchiveAllocator::in_open_archive_range(oop object) { |
|
92 return _open_archive_region_map.get_by_address((HeapWord*)object); |
|
93 } |
|
94 |
|
95 // Check if archive object checking is enabled, to avoid calling in_open/closed_archive_range |
82 // unnecessarily. |
96 // unnecessarily. |
83 inline bool G1ArchiveAllocator::archive_check_enabled() { |
97 inline bool G1ArchiveAllocator::archive_check_enabled() { |
84 return _archive_check_enabled; |
98 return _archive_check_enabled; |
85 } |
99 } |
86 |
100 |
|
101 inline bool G1ArchiveAllocator::is_closed_archive_object(oop object) { |
|
102 return (archive_check_enabled() && in_closed_archive_range(object)); |
|
103 } |
|
104 |
|
105 inline bool G1ArchiveAllocator::is_open_archive_object(oop object) { |
|
106 return (archive_check_enabled() && in_open_archive_range(object)); |
|
107 } |
|
108 |
87 inline bool G1ArchiveAllocator::is_archive_object(oop object) { |
109 inline bool G1ArchiveAllocator::is_archive_object(oop object) { |
88 return (archive_check_enabled() && in_archive_range(object)); |
110 return (archive_check_enabled() && (in_closed_archive_range(object) || |
|
111 in_open_archive_range(object))); |
89 } |
112 } |
90 |
113 |
91 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP |
114 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP |