|
38 | 38 | #include "utilities/powerOfTwo.hpp" |
39 | 39 |
|
40 | 40 | size_t ParallelArguments::conservative_max_heap_alignment() { |
41 | | - return compute_heap_alignment(); |
| 41 | + // The card marking array and the offset arrays for old generations are |
| 42 | + // committed in os pages as well. Make sure they are entirely full (to |
| 43 | + // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1 |
| 44 | + // byte entry and the os page size is 4096, the maximum heap size should |
| 45 | + // be 512*4096 = 2MB aligned. |
| 46 | + |
| 47 | + size_t alignment = CardTable::ct_max_alignment_constraint(); |
| 48 | + |
| 49 | + if (UseLargePages) { |
| 50 | + // In presence of large pages we have to make sure that our |
| 51 | + // alignment is large page aware. |
| 52 | + alignment = lcm(os::large_page_size(), alignment); |
| 53 | + } |
| 54 | + |
| 55 | + return alignment; |
42 | 56 | } |
43 | 57 |
|
44 | 58 | void ParallelArguments::initialize() { |
@@ -98,43 +112,53 @@ void ParallelArguments::initialize() { |
98 | 112 | FullGCForwarding::initialize_flags(heap_reserved_size_bytes()); |
99 | 113 | } |
100 | 114 |
|
| 115 | +static size_t num_young_spaces() { |
| 116 | + // When using NUMA, we create one MutableNUMASpace for each NUMA node |
| 117 | + const size_t num_eden_spaces = UseNUMA ? os::numa_get_groups_num() : 1; |
| 118 | + |
| 119 | + // The young generation must have room for eden + two survivors |
| 120 | + return num_eden_spaces + 2; |
| 121 | +} |
| 122 | + |
| 123 | +static size_t num_old_spaces() { |
| 124 | + return 1; |
| 125 | +} |
| 126 | + |
101 | 127 | void ParallelArguments::initialize_alignments() { |
102 | 128 | // Initialize card size before initializing alignments |
103 | 129 | CardTable::initialize_card_size(); |
| 130 | + const size_t card_table_alignment = CardTable::ct_max_alignment_constraint(); |
104 | 131 | SpaceAlignment = ParallelScavengeHeap::default_space_alignment(); |
105 | | - HeapAlignment = compute_heap_alignment(); |
106 | | -} |
107 | 132 |
|
108 | | -void ParallelArguments::initialize_heap_flags_and_sizes_one_pass() { |
109 | | - // Do basic sizing work |
110 | | - GenArguments::initialize_heap_flags_and_sizes(); |
111 | | -} |
| 133 | + if (UseLargePages) { |
| 134 | + const size_t total_spaces = num_young_spaces() + num_old_spaces(); |
| 135 | + const size_t page_size = os::page_size_for_region_unaligned(MaxHeapSize, total_spaces); |
| 136 | + ParallelScavengeHeap::set_desired_page_size(page_size); |
112 | 137 |
|
113 | | -void ParallelArguments::initialize_heap_flags_and_sizes() { |
114 | | - initialize_heap_flags_and_sizes_one_pass(); |
| 138 | + if (page_size == os::vm_page_size()) { |
| 139 | + log_warning(gc, heap)("MaxHeapSize (%zu) must be large enough for %zu * page-size; Disabling UseLargePages for heap", |
| 140 | + MaxHeapSize, total_spaces); |
| 141 | + } |
115 | 142 |
|
116 | | - if (!UseLargePages) { |
117 | | - ParallelScavengeHeap::set_desired_page_size(os::vm_page_size()); |
118 | | - return; |
119 | | - } |
| 143 | + if (page_size > SpaceAlignment) { |
| 144 | + SpaceAlignment = page_size; |
| 145 | + } |
120 | 146 |
|
121 | | - // If using large-page, need to update SpaceAlignment so that spaces are page-size aligned. |
122 | | - const size_t min_pages = 4; // 1 for eden + 1 for each survivor + 1 for old |
123 | | - const size_t page_sz = os::page_size_for_region_aligned(MinHeapSize, min_pages); |
124 | | - ParallelScavengeHeap::set_desired_page_size(page_sz); |
| 147 | + HeapAlignment = lcm(page_size, card_table_alignment); |
125 | 148 |
|
126 | | - if (page_sz == os::vm_page_size()) { |
127 | | - log_warning(gc, heap)("MinHeapSize (%zu) must be large enough for 4 * page-size; Disabling UseLargePages for heap", MinHeapSize); |
128 | | - return; |
| 149 | + } else { |
| 150 | + assert(is_aligned(SpaceAlignment, os::vm_page_size()), ""); |
| 151 | + ParallelScavengeHeap::set_desired_page_size(os::vm_page_size()); |
| 152 | + HeapAlignment = card_table_alignment; |
129 | 153 | } |
| 154 | +} |
130 | 155 |
|
131 | | - // Space is largepage-aligned. |
132 | | - size_t new_alignment = page_sz; |
133 | | - if (new_alignment != SpaceAlignment) { |
134 | | - SpaceAlignment = new_alignment; |
135 | | - // Redo everything from the start |
136 | | - initialize_heap_flags_and_sizes_one_pass(); |
137 | | - } |
| 156 | +size_t ParallelArguments::young_gen_size_lower_bound() { |
| 157 | + return num_young_spaces() * SpaceAlignment; |
| 158 | +} |
| 159 | + |
| 160 | +size_t ParallelArguments::old_gen_size_lower_bound() { |
| 161 | + return num_old_spaces() * SpaceAlignment; |
138 | 162 | } |
139 | 163 |
|
140 | 164 | size_t ParallelArguments::heap_reserved_size_bytes() { |
|
0 commit comments