1 /* |
1 /* |
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
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. |
|
59 inline void G1ArchiveAllocator::enable_archive_object_check() { |
|
60 assert(!_archive_check_enabled, "archive range check already enabled"); |
|
61 _archive_check_enabled = true; |
|
62 size_t length = Universe::heap()->max_capacity(); |
|
63 _archive_region_map.initialize((HeapWord*)Universe::heap()->base(), |
|
64 (HeapWord*)Universe::heap()->base() + length, |
|
65 HeapRegion::GrainBytes); |
|
66 } |
|
67 |
|
68 // Set the regions containing the specified address range as archive/non-archive. |
|
69 inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool is_archive) { |
|
70 assert(_archive_check_enabled, "archive range check not enabled"); |
|
71 _archive_region_map.set_by_address(range, is_archive); |
|
72 } |
|
73 |
|
74 // Check if an object is in an archive region using the _archive_region_map. |
|
75 inline bool G1ArchiveAllocator::in_archive_range(oop object) { |
|
76 // This is the out-of-line part of is_archive_object test, done separately |
|
77 // to avoid additional performance impact when the check is not enabled. |
|
78 return _archive_region_map.get_by_address((HeapWord*)object); |
|
79 } |
|
80 |
|
81 // Check if archive object checking is enabled, to avoid calling in_archive_range |
|
82 // unnecessarily. |
|
83 inline bool G1ArchiveAllocator::archive_check_enabled() { |
|
84 return _archive_check_enabled; |
|
85 } |
|
86 |
|
87 inline bool G1ArchiveAllocator::is_archive_object(oop object) { |
|
88 return (archive_check_enabled() && in_archive_range(object)); |
|
89 } |
|
90 |
58 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP |
91 #endif // SHARE_VM_GC_G1_G1ALLOCATOR_HPP |