1 /*
2 * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
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 *
43 _virtual_spaces(old_young_rs, policy->min_old_size(),
44 policy->min_young_size(), alignment) {
45 size_t init_low_byte_size = policy->initial_old_size();
46 size_t min_low_byte_size = policy->min_old_size();
47 size_t max_low_byte_size = policy->max_old_size();
48 size_t init_high_byte_size = policy->initial_young_size();
49 size_t min_high_byte_size = policy->min_young_size();
50 size_t max_high_byte_size = policy->max_young_size();
51
52 assert(min_low_byte_size <= init_low_byte_size &&
53 init_low_byte_size <= max_low_byte_size, "Parameter check");
54 assert(min_high_byte_size <= init_high_byte_size &&
55 init_high_byte_size <= max_high_byte_size, "Parameter check");
56 // Create the generations differently based on the option to
57 // move the boundary.
58 if (UseAdaptiveGCBoundary) {
59 // Initialize the adjoining virtual spaces. Then pass the
60 // a virtual to each generation for initialization of the
61 // generation.
62
63 // Does the actual creation of the virtual spaces
64 _virtual_spaces.initialize(max_low_byte_size,
65 init_low_byte_size,
66 init_high_byte_size);
67
68 // Place the young gen at the high end. Passes in the virtual space.
69 _young_gen = new ASPSYoungGen(_virtual_spaces.high(),
70 _virtual_spaces.high()->committed_size(),
71 min_high_byte_size,
72 _virtual_spaces.high_byte_size_limit());
73
74 // Place the old gen at the low end. Passes in the virtual space.
75 _old_gen = new ASPSOldGen(_virtual_spaces.low(),
76 _virtual_spaces.low()->committed_size(),
77 min_low_byte_size,
78 _virtual_spaces.low_byte_size_limit(),
79 "old", 1);
80
81 young_gen()->initialize_work();
82 assert(young_gen()->reserved().byte_size() <= young_gen()->gen_size_limit(),
83 "Consistency check");
84 assert(old_young_rs.size() >= young_gen()->gen_size_limit(),
85 "Consistency check");
86
87 old_gen()->initialize_work("old", 1);
88 assert(old_gen()->reserved().byte_size() <= old_gen()->gen_size_limit(),
89 "Consistency check");
90 assert(old_young_rs.size() >= old_gen()->gen_size_limit(),
91 "Consistency check");
92 } else {
93
94 // Layout the reserved space for the generations.
95 ReservedSpace old_rs =
96 virtual_spaces()->reserved_space().first_part(max_low_byte_size);
97 ReservedSpace heap_rs =
98 virtual_spaces()->reserved_space().last_part(max_low_byte_size);
99 ReservedSpace young_rs = heap_rs.first_part(max_high_byte_size);
100 assert(young_rs.size() == heap_rs.size(), "Didn't reserve all of the heap");
101
102 // Create the generations. Virtual spaces are not passed in.
103 _young_gen = new PSYoungGen(init_high_byte_size,
104 min_high_byte_size,
105 max_high_byte_size);
106 _old_gen = new PSOldGen(init_low_byte_size,
107 min_low_byte_size,
108 max_low_byte_size,
109 "old", 1);
110
111 // The virtual spaces are created by the initialization of the gens.
112 _young_gen->initialize(young_rs, alignment);
113 assert(young_gen()->gen_size_limit() == young_rs.size(),
114 "Consistency check");
115 _old_gen->initialize(old_rs, alignment, "old", 1);
116 assert(old_gen()->gen_size_limit() == old_rs.size(), "Consistency check");
117 }
118 }
119
120 size_t AdjoiningGenerations::reserved_byte_size() {
121 return virtual_spaces()->reserved_space().size();
122 }
123
124 void log_before_expansion(bool old, size_t expand_in_bytes, size_t change_in_bytes, size_t max_size) {
125 Log(heap, ergo) log;
126 if (!log.is_debug()) {
127 return;
128 }
129 log.debug("Before expansion of %s gen with boundary move", old ? "old" : "young");
130 log.debug(" Requested change: " SIZE_FORMAT_HEX " Attempted change: " SIZE_FORMAT_HEX,
131 expand_in_bytes, change_in_bytes);
132 ResourceMark rm;
133 LogStream ls(log.debug());
134 ParallelScavengeHeap::heap()->print_on(&ls);
|
1 /*
2 * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
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 *
43 _virtual_spaces(old_young_rs, policy->min_old_size(),
44 policy->min_young_size(), alignment) {
45 size_t init_low_byte_size = policy->initial_old_size();
46 size_t min_low_byte_size = policy->min_old_size();
47 size_t max_low_byte_size = policy->max_old_size();
48 size_t init_high_byte_size = policy->initial_young_size();
49 size_t min_high_byte_size = policy->min_young_size();
50 size_t max_high_byte_size = policy->max_young_size();
51
52 assert(min_low_byte_size <= init_low_byte_size &&
53 init_low_byte_size <= max_low_byte_size, "Parameter check");
54 assert(min_high_byte_size <= init_high_byte_size &&
55 init_high_byte_size <= max_high_byte_size, "Parameter check");
56 // Create the generations differently based on the option to
57 // move the boundary.
58 if (UseAdaptiveGCBoundary) {
59 // Initialize the adjoining virtual spaces. Then pass the
60 // a virtual to each generation for initialization of the
61 // generation.
62
63 if (os::has_nvdimm()) {
64 _virtual_spaces.setup_fd(old_young_rs.nvdimm_fd());
65 #if defined(_WINDOWS)
66 log_info(gc, heap)("On Windows, ParallelOldGC with NVDIMM does not support adaptive sizing of OldGen. ");
67 init_low_byte_size = policy->max_old_size();
68 min_low_byte_size = policy->max_old_size();
69 max_low_byte_size = policy->max_old_size();
70 #endif
71 }
72 // Does the actual creation of the virtual spaces
73 _virtual_spaces.initialize(max_low_byte_size,
74 init_low_byte_size,
75 init_high_byte_size);
76
77 // Place the young gen at the high end. Passes in the virtual space.
78 _young_gen = new ASPSYoungGen(_virtual_spaces.high(),
79 _virtual_spaces.high()->committed_size(),
80 min_high_byte_size,
81 _virtual_spaces.high_byte_size_limit());
82
83 // Place the old gen at the low end. Passes in the virtual space.
84 _old_gen = new ASPSOldGen(_virtual_spaces.low(),
85 _virtual_spaces.low()->committed_size(),
86 min_low_byte_size,
87 _virtual_spaces.low_byte_size_limit(),
88 "old", 1);
89
90 if (os::has_nvdimm()) {
91 _old_gen->setup_fd(old_young_rs.nvdimm_fd());
92 }
93 young_gen()->initialize_work();
94 assert(young_gen()->reserved().byte_size() <= young_gen()->gen_size_limit(),
95 "Consistency check");
96 assert(old_young_rs.size() >= young_gen()->gen_size_limit(),
97 "Consistency check");
98
99 old_gen()->initialize_work("old", 1);
100 assert(old_gen()->reserved().byte_size() <= old_gen()->gen_size_limit(),
101 "Consistency check");
102 assert(old_young_rs.size() >= old_gen()->gen_size_limit(),
103 "Consistency check");
104 } else {
105
106 // Layout the reserved space for the generations.
107 ReservedSpace old_rs =
108 virtual_spaces()->reserved_space().first_part(max_low_byte_size);
109 ReservedSpace heap_rs =
110 virtual_spaces()->reserved_space().last_part(max_low_byte_size);
111 ReservedSpace young_rs = heap_rs.first_part(max_high_byte_size);
112 assert(young_rs.size() == heap_rs.size(), "Didn't reserve all of the heap");
113
114 // Create the generations. Virtual spaces are not passed in.
115 _young_gen = new PSYoungGen(init_high_byte_size,
116 min_high_byte_size,
117 max_high_byte_size);
118 _old_gen = new PSOldGen(init_low_byte_size,
119 min_low_byte_size,
120 max_low_byte_size,
121 "old", 1);
122
123 // The virtual spaces are created by the initialization of the gens.
124 _young_gen->initialize(young_rs, alignment);
125 assert(young_gen()->gen_size_limit() == young_rs.size(),
126 "Consistency check");
127 if (os::has_nvdimm()) {
128 _old_gen->setup_fd(old_young_rs.nvdimm_fd());
129 old_rs.setup_fd(old_young_rs.nvdimm_fd());
130 }
131 _old_gen->initialize(old_rs, alignment, "old", 1);
132 assert(old_gen()->gen_size_limit() == old_rs.size(), "Consistency check");
133 }
134 }
135
136 size_t AdjoiningGenerations::reserved_byte_size() {
137 return virtual_spaces()->reserved_space().size();
138 }
139
140 void log_before_expansion(bool old, size_t expand_in_bytes, size_t change_in_bytes, size_t max_size) {
141 Log(heap, ergo) log;
142 if (!log.is_debug()) {
143 return;
144 }
145 log.debug("Before expansion of %s gen with boundary move", old ? "old" : "young");
146 log.debug(" Requested change: " SIZE_FORMAT_HEX " Attempted change: " SIZE_FORMAT_HEX,
147 expand_in_bytes, change_in_bytes);
148 ResourceMark rm;
149 LogStream ls(log.debug());
150 ParallelScavengeHeap::heap()->print_on(&ls);
|