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 *
24
25 #include "precompiled.hpp"
26 #include "gc/parallel/adjoiningGenerations.hpp"
27 #include "gc/parallel/adjoiningVirtualSpaces.hpp"
28 #include "gc/parallel/generationSizer.hpp"
29 #include "gc/parallel/parallelScavengeHeap.hpp"
30 #include "logging/log.hpp"
31 #include "logging/logStream.hpp"
32 #include "memory/resourceArea.hpp"
33 #include "utilities/align.hpp"
34 #include "utilities/ostream.hpp"
35
36 // If boundary moving is being used, create the young gen and old
37 // gen with ASPSYoungGen and ASPSOldGen, respectively. Revert to
38 // the old behavior otherwise (with PSYoungGen and PSOldGen).
39
40 AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs,
41 GenerationSizer* policy,
42 size_t alignment) :
43 _virtual_spaces(new AdjoiningVirtualSpaces(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,
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 // Layout the reserved space for the generations.
94 // If OldGen is allocated on nv-dimm, we need to split the reservation (this is required for windows).
95 ReservedSpace old_rs =
96 virtual_spaces()->reserved_space().first_part(max_low_byte_size, AllocateOldGenAt != NULL /* split */);
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);
|
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 *
24
25 #include "precompiled.hpp"
26 #include "gc/parallel/adjoiningGenerations.hpp"
27 #include "gc/parallel/adjoiningVirtualSpaces.hpp"
28 #include "gc/parallel/generationSizer.hpp"
29 #include "gc/parallel/parallelScavengeHeap.hpp"
30 #include "logging/log.hpp"
31 #include "logging/logStream.hpp"
32 #include "memory/resourceArea.hpp"
33 #include "utilities/align.hpp"
34 #include "utilities/ostream.hpp"
35
36 // If boundary moving is being used, create the young gen and old
37 // gen with ASPSYoungGen and ASPSOldGen, respectively. Revert to
38 // the old behavior otherwise (with PSYoungGen and PSOldGen).
39
40 AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs,
41 GenerationSizer* policy,
42 size_t alignment) :
43 _virtual_spaces(new AdjoiningVirtualSpaces(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,
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 // If OldGen is allocated on nv-dimm, we need to split the reservation (this is required for windows).
96 ReservedSpace old_rs =
97 virtual_spaces()->reserved_space().first_part(max_low_byte_size, AllocateOldGenAt != NULL /* split */);
98 ReservedSpace heap_rs =
99 virtual_spaces()->reserved_space().last_part(max_low_byte_size);
100 ReservedSpace young_rs = heap_rs.first_part(max_high_byte_size);
101 assert(young_rs.size() == heap_rs.size(), "Didn't reserve all of the heap");
102
103 // Create the generations. Virtual spaces are not passed in.
104 _young_gen = new PSYoungGen(init_high_byte_size,
105 min_high_byte_size,
106 max_high_byte_size);
107 _old_gen = new PSOldGen(init_low_byte_size,
108 min_low_byte_size,
109 max_low_byte_size,
110 "old", 1);
111
112 // The virtual spaces are created by the initialization of the gens.
113 _young_gen->initialize(young_rs, alignment);
|