23 */
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(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(gc, ergo, heap) 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);
135 log.debug(" PS%sGen max size: " SIZE_FORMAT "K", old ? "Old" : "Young", max_size/K);
136 }
137
138 void log_after_expansion(bool old, size_t max_size) {
139 Log(gc, ergo, heap) log;
|
23 */
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,
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 // 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);
114 assert(young_gen()->gen_size_limit() == young_rs.size(),
115 "Consistency check");
116 _old_gen->initialize(old_rs, alignment, "old", 1);
117 assert(old_gen()->gen_size_limit() == old_rs.size(), "Consistency check");
118 }
119 }
120
121 AdjoiningGenerations::AdjoiningGenerations() { }
122
123 size_t AdjoiningGenerations::reserved_byte_size() {
124 return virtual_spaces()->reserved_space().size();
125 }
126
127 void log_before_expansion(bool old, size_t expand_in_bytes, size_t change_in_bytes, size_t max_size) {
128 Log(gc, ergo, heap) log;
129 if (!log.is_debug()) {
130 return;
131 }
132 log.debug("Before expansion of %s gen with boundary move", old ? "old" : "young");
133 log.debug(" Requested change: " SIZE_FORMAT_HEX " Attempted change: " SIZE_FORMAT_HEX,
134 expand_in_bytes, change_in_bytes);
135 ResourceMark rm;
136 LogStream ls(log.debug());
137 ParallelScavengeHeap::heap()->print_on(&ls);
138 log.debug(" PS%sGen max size: " SIZE_FORMAT "K", old ? "Old" : "Young", max_size/K);
139 }
140
141 void log_after_expansion(bool old, size_t max_size) {
142 Log(gc, ergo, heap) log;
|