24
25 #include "precompiled.hpp"
26 #include "gc/parallel/mutableNUMASpace.hpp"
27 #include "gc/parallel/parallelScavengeHeap.hpp"
28 #include "gc/parallel/psScavenge.hpp"
29 #include "gc/parallel/psYoungGen.hpp"
30 #include "gc/shared/gcUtil.hpp"
31 #include "gc/shared/genArguments.hpp"
32 #include "gc/shared/spaceDecorator.inline.hpp"
33 #include "logging/log.hpp"
34 #include "oops/oop.inline.hpp"
35 #include "runtime/java.hpp"
36 #include "utilities/align.hpp"
37
38 PSYoungGen::PSYoungGen(ReservedSpace rs, size_t initial_size, size_t min_size, size_t max_size) :
39 _reserved(),
40 _virtual_space(NULL),
41 _eden_space(NULL),
42 _from_space(NULL),
43 _to_space(NULL),
44 _init_gen_size(initial_size),
45 _min_gen_size(min_size),
46 _max_gen_size(max_size),
47 _gen_counters(NULL),
48 _eden_counters(NULL),
49 _from_counters(NULL),
50 _to_counters(NULL)
51 {
52 initialize(rs, GenAlignment);
53 }
54
55 void PSYoungGen::initialize_virtual_space(ReservedSpace rs, size_t alignment) {
56 assert(_init_gen_size != 0, "Should have a finite size");
57 _virtual_space = new PSVirtualSpace(rs, alignment);
58 if (!virtual_space()->expand_by(_init_gen_size)) {
59 vm_exit_during_initialization("Could not reserve enough space for "
60 "object heap");
61 }
62 }
63
64 void PSYoungGen::initialize(ReservedSpace rs, size_t alignment) {
65 initialize_virtual_space(rs, alignment);
66 initialize_work();
67 }
68
69 void PSYoungGen::initialize_work() {
70
71 _reserved = MemRegion((HeapWord*)virtual_space()->low_boundary(),
72 (HeapWord*)virtual_space()->high_boundary());
73 assert(_reserved.byte_size() == max_gen_size(), "invariant");
74
75 MemRegion cmr((HeapWord*)virtual_space()->low(),
76 (HeapWord*)virtual_space()->high());
77 ParallelScavengeHeap::heap()->card_table()->resize_covered_region(cmr);
78
79 if (ZapUnusedHeapArea) {
80 // Mangle newly committed space immediately because it
81 // can be done here more simply that after the new
82 // spaces have been computed.
83 SpaceMangler::mangle_region(cmr);
84 }
85
86 if (UseNUMA) {
87 _eden_space = new MutableNUMASpace(virtual_space()->alignment());
88 } else {
89 _eden_space = new MutableSpace(virtual_space()->alignment());
90 }
91 _from_space = new MutableSpace(virtual_space()->alignment());
92 _to_space = new MutableSpace(virtual_space()->alignment());
93
94 // Generation Counters - generation 0, 3 subspaces
95 _gen_counters = new PSGenerationCounters("new", 0, 3, _min_gen_size,
96 _max_gen_size, _virtual_space);
97
98 // Compute maximum space sizes for performance counters
99 size_t alignment = SpaceAlignment;
100 size_t size = virtual_space()->reserved_size();
101
102 size_t max_survivor_size;
103 size_t max_eden_size;
104
105 if (UseAdaptiveSizePolicy) {
106 max_survivor_size = size / MinSurvivorRatio;
107
108 // round the survivor space size down to the nearest alignment
109 // and make sure its size is greater than 0.
110 max_survivor_size = align_down(max_survivor_size, alignment);
111 max_survivor_size = MAX2(max_survivor_size, alignment);
112
113 // set the maximum size of eden to be the size of the young gen
114 // less two times the minimum survivor size. The minimum survivor
115 // size for UseAdaptiveSizePolicy is one alignment.
116 max_eden_size = size - 2 * alignment;
242 assert(to_top <= virtual_space()->high(), "to top");
243
244 virtual_space()->verify();
245 }
246 #endif
247
248 void PSYoungGen::resize(size_t eden_size, size_t survivor_size) {
249 // Resize the generation if needed. If the generation resize
250 // reports false, do not attempt to resize the spaces.
251 if (resize_generation(eden_size, survivor_size)) {
252 // Then we lay out the spaces inside the generation
253 resize_spaces(eden_size, survivor_size);
254
255 space_invariants();
256
257 log_trace(gc, ergo)("Young generation size: "
258 "desired eden: " SIZE_FORMAT " survivor: " SIZE_FORMAT
259 " used: " SIZE_FORMAT " capacity: " SIZE_FORMAT
260 " gen limits: " SIZE_FORMAT " / " SIZE_FORMAT,
261 eden_size, survivor_size, used_in_bytes(), capacity_in_bytes(),
262 _max_gen_size, min_gen_size());
263 }
264 }
265
266
267 bool PSYoungGen::resize_generation(size_t eden_size, size_t survivor_size) {
268 const size_t alignment = virtual_space()->alignment();
269 size_t orig_size = virtual_space()->committed_size();
270 bool size_changed = false;
271
272 // There used to be this guarantee there.
273 // guarantee ((eden_size + 2*survivor_size) <= _max_gen_size, "incorrect input arguments");
274 // Code below forces this requirement. In addition the desired eden
275 // size and desired survivor sizes are desired goals and may
276 // exceed the total generation size.
277
278 assert(min_gen_size() <= orig_size && orig_size <= max_gen_size(), "just checking");
279
280 // Adjust new generation size
281 const size_t eden_plus_survivors =
282 align_up(eden_size + 2 * survivor_size, alignment);
283 size_t desired_size = clamp(eden_plus_survivors, min_gen_size(), max_gen_size());
284 assert(desired_size <= max_gen_size(), "just checking");
285
286 if (desired_size > orig_size) {
287 // Grow the generation
288 size_t change = desired_size - orig_size;
289 assert(change % alignment == 0, "just checking");
290 HeapWord* prev_high = (HeapWord*) virtual_space()->high();
291 if (!virtual_space()->expand_by(change)) {
292 return false; // Error if we fail to resize!
293 }
|
24
25 #include "precompiled.hpp"
26 #include "gc/parallel/mutableNUMASpace.hpp"
27 #include "gc/parallel/parallelScavengeHeap.hpp"
28 #include "gc/parallel/psScavenge.hpp"
29 #include "gc/parallel/psYoungGen.hpp"
30 #include "gc/shared/gcUtil.hpp"
31 #include "gc/shared/genArguments.hpp"
32 #include "gc/shared/spaceDecorator.inline.hpp"
33 #include "logging/log.hpp"
34 #include "oops/oop.inline.hpp"
35 #include "runtime/java.hpp"
36 #include "utilities/align.hpp"
37
38 PSYoungGen::PSYoungGen(ReservedSpace rs, size_t initial_size, size_t min_size, size_t max_size) :
39 _reserved(),
40 _virtual_space(NULL),
41 _eden_space(NULL),
42 _from_space(NULL),
43 _to_space(NULL),
44 _min_gen_size(min_size),
45 _max_gen_size(max_size),
46 _gen_counters(NULL),
47 _eden_counters(NULL),
48 _from_counters(NULL),
49 _to_counters(NULL)
50 {
51 initialize(rs, initial_size, GenAlignment);
52 }
53
54 void PSYoungGen::initialize_virtual_space(ReservedSpace rs,
55 size_t initial_size,
56 size_t alignment) {
57 assert(initial_size != 0, "Should have a finite size");
58 _virtual_space = new PSVirtualSpace(rs, alignment);
59 if (!virtual_space()->expand_by(initial_size)) {
60 vm_exit_during_initialization("Could not reserve enough space for object heap");
61 }
62 }
63
64 void PSYoungGen::initialize(ReservedSpace rs, size_t initial_size, size_t alignment) {
65 initialize_virtual_space(rs, initial_size, alignment);
66 initialize_work();
67 }
68
69 void PSYoungGen::initialize_work() {
70
71 _reserved = MemRegion((HeapWord*)virtual_space()->low_boundary(),
72 (HeapWord*)virtual_space()->high_boundary());
73 assert(_reserved.byte_size() == max_gen_size(), "invariant");
74
75 MemRegion cmr((HeapWord*)virtual_space()->low(),
76 (HeapWord*)virtual_space()->high());
77 ParallelScavengeHeap::heap()->card_table()->resize_covered_region(cmr);
78
79 if (ZapUnusedHeapArea) {
80 // Mangle newly committed space immediately because it
81 // can be done here more simply that after the new
82 // spaces have been computed.
83 SpaceMangler::mangle_region(cmr);
84 }
85
86 if (UseNUMA) {
87 _eden_space = new MutableNUMASpace(virtual_space()->alignment());
88 } else {
89 _eden_space = new MutableSpace(virtual_space()->alignment());
90 }
91 _from_space = new MutableSpace(virtual_space()->alignment());
92 _to_space = new MutableSpace(virtual_space()->alignment());
93
94 // Generation Counters - generation 0, 3 subspaces
95 _gen_counters = new PSGenerationCounters("new", 0, 3, min_gen_size(),
96 max_gen_size(), virtual_space());
97
98 // Compute maximum space sizes for performance counters
99 size_t alignment = SpaceAlignment;
100 size_t size = virtual_space()->reserved_size();
101
102 size_t max_survivor_size;
103 size_t max_eden_size;
104
105 if (UseAdaptiveSizePolicy) {
106 max_survivor_size = size / MinSurvivorRatio;
107
108 // round the survivor space size down to the nearest alignment
109 // and make sure its size is greater than 0.
110 max_survivor_size = align_down(max_survivor_size, alignment);
111 max_survivor_size = MAX2(max_survivor_size, alignment);
112
113 // set the maximum size of eden to be the size of the young gen
114 // less two times the minimum survivor size. The minimum survivor
115 // size for UseAdaptiveSizePolicy is one alignment.
116 max_eden_size = size - 2 * alignment;
242 assert(to_top <= virtual_space()->high(), "to top");
243
244 virtual_space()->verify();
245 }
246 #endif
247
248 void PSYoungGen::resize(size_t eden_size, size_t survivor_size) {
249 // Resize the generation if needed. If the generation resize
250 // reports false, do not attempt to resize the spaces.
251 if (resize_generation(eden_size, survivor_size)) {
252 // Then we lay out the spaces inside the generation
253 resize_spaces(eden_size, survivor_size);
254
255 space_invariants();
256
257 log_trace(gc, ergo)("Young generation size: "
258 "desired eden: " SIZE_FORMAT " survivor: " SIZE_FORMAT
259 " used: " SIZE_FORMAT " capacity: " SIZE_FORMAT
260 " gen limits: " SIZE_FORMAT " / " SIZE_FORMAT,
261 eden_size, survivor_size, used_in_bytes(), capacity_in_bytes(),
262 max_gen_size(), min_gen_size());
263 }
264 }
265
266
267 bool PSYoungGen::resize_generation(size_t eden_size, size_t survivor_size) {
268 const size_t alignment = virtual_space()->alignment();
269 size_t orig_size = virtual_space()->committed_size();
270 bool size_changed = false;
271
272 // There used to be this guarantee there.
273 // guarantee ((eden_size + 2*survivor_size) <= max_gen_size(), "incorrect input arguments");
274 // Code below forces this requirement. In addition the desired eden
275 // size and desired survivor sizes are desired goals and may
276 // exceed the total generation size.
277
278 assert(min_gen_size() <= orig_size && orig_size <= max_gen_size(), "just checking");
279
280 // Adjust new generation size
281 const size_t eden_plus_survivors =
282 align_up(eden_size + 2 * survivor_size, alignment);
283 size_t desired_size = clamp(eden_plus_survivors, min_gen_size(), max_gen_size());
284 assert(desired_size <= max_gen_size(), "just checking");
285
286 if (desired_size > orig_size) {
287 // Grow the generation
288 size_t change = desired_size - orig_size;
289 assert(change % alignment == 0, "just checking");
290 HeapWord* prev_high = (HeapWord*) virtual_space()->high();
291 if (!virtual_space()->expand_by(change)) {
292 return false; // Error if we fail to resize!
293 }
|