59 size_t alignment) { 60 assert(_init_gen_size != 0, "Should have a finite size"); 61 _virtual_space = new PSVirtualSpaceHighToLow(rs, alignment); 62 if (!_virtual_space->expand_by(_init_gen_size)) { 63 vm_exit_during_initialization("Could not reserve enough space for " 64 "object heap"); 65 } 66 } 67 68 void ASPSYoungGen::initialize(ReservedSpace rs, size_t alignment) { 69 initialize_virtual_space(rs, alignment); 70 initialize_work(); 71 } 72 73 size_t ASPSYoungGen::available_for_expansion() { 74 size_t current_committed_size = virtual_space()->committed_size(); 75 assert((gen_size_limit() >= current_committed_size), 76 "generation size limit is wrong"); 77 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); 78 size_t result = gen_size_limit() - current_committed_size; 79 size_t result_aligned = align_down(result, heap->generation_alignment()); 80 return result_aligned; 81 } 82 83 // Return the number of bytes the young gen is willing give up. 84 // 85 // Future implementations could check the survivors and if to_space is in the 86 // right place (below from_space), take a chunk from to_space. 87 size_t ASPSYoungGen::available_for_contraction() { 88 size_t uncommitted_bytes = virtual_space()->uncommitted_size(); 89 if (uncommitted_bytes != 0) { 90 return uncommitted_bytes; 91 } 92 93 if (eden_space()->is_empty()) { 94 // Respect the minimum size for eden and for the young gen as a whole. 95 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); 96 const size_t eden_alignment = heap->space_alignment(); 97 const size_t gen_alignment = heap->generation_alignment(); 98 99 assert(eden_space()->capacity_in_bytes() >= eden_alignment, 100 "Alignment is wrong"); 101 size_t eden_avail = eden_space()->capacity_in_bytes() - eden_alignment; 102 eden_avail = align_down(eden_avail, gen_alignment); 103 104 assert(virtual_space()->committed_size() >= min_gen_size(), 105 "minimum gen size is wrong"); 106 size_t gen_avail = virtual_space()->committed_size() - min_gen_size(); 107 assert(virtual_space()->is_aligned(gen_avail), "not aligned"); 108 109 const size_t max_contraction = MIN2(eden_avail, gen_avail); 110 // See comment for ASPSOldGen::available_for_contraction() 111 // for reasons the "increment" fraction is used. 112 PSAdaptiveSizePolicy* policy = heap->size_policy(); 113 size_t result = policy->eden_increment_aligned_down(max_contraction); 114 size_t result_aligned = align_down(result, gen_alignment); 115 116 log_trace(gc, ergo)("ASPSYoungGen::available_for_contraction: " SIZE_FORMAT " K", result_aligned/K); 117 log_trace(gc, ergo)(" max_contraction " SIZE_FORMAT " K", max_contraction/K); | 59 size_t alignment) { 60 assert(_init_gen_size != 0, "Should have a finite size"); 61 _virtual_space = new PSVirtualSpaceHighToLow(rs, alignment); 62 if (!_virtual_space->expand_by(_init_gen_size)) { 63 vm_exit_during_initialization("Could not reserve enough space for " 64 "object heap"); 65 } 66 } 67 68 void ASPSYoungGen::initialize(ReservedSpace rs, size_t alignment) { 69 initialize_virtual_space(rs, alignment); 70 initialize_work(); 71 } 72 73 size_t ASPSYoungGen::available_for_expansion() { 74 size_t current_committed_size = virtual_space()->committed_size(); 75 assert((gen_size_limit() >= current_committed_size), 76 "generation size limit is wrong"); 77 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); 78 size_t result = gen_size_limit() - current_committed_size; 79 size_t result_aligned = align_down(result, heap->gen_alignment()); 80 return result_aligned; 81 } 82 83 // Return the number of bytes the young gen is willing give up. 84 // 85 // Future implementations could check the survivors and if to_space is in the 86 // right place (below from_space), take a chunk from to_space. 87 size_t ASPSYoungGen::available_for_contraction() { 88 size_t uncommitted_bytes = virtual_space()->uncommitted_size(); 89 if (uncommitted_bytes != 0) { 90 return uncommitted_bytes; 91 } 92 93 if (eden_space()->is_empty()) { 94 // Respect the minimum size for eden and for the young gen as a whole. 95 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); 96 const size_t eden_alignment = heap->space_alignment(); 97 const size_t gen_alignment = heap->gen_alignment(); 98 99 assert(eden_space()->capacity_in_bytes() >= eden_alignment, 100 "Alignment is wrong"); 101 size_t eden_avail = eden_space()->capacity_in_bytes() - eden_alignment; 102 eden_avail = align_down(eden_avail, gen_alignment); 103 104 assert(virtual_space()->committed_size() >= min_gen_size(), 105 "minimum gen size is wrong"); 106 size_t gen_avail = virtual_space()->committed_size() - min_gen_size(); 107 assert(virtual_space()->is_aligned(gen_avail), "not aligned"); 108 109 const size_t max_contraction = MIN2(eden_avail, gen_avail); 110 // See comment for ASPSOldGen::available_for_contraction() 111 // for reasons the "increment" fraction is used. 112 PSAdaptiveSizePolicy* policy = heap->size_policy(); 113 size_t result = policy->eden_increment_aligned_down(max_contraction); 114 size_t result_aligned = align_down(result, gen_alignment); 115 116 log_trace(gc, ergo)("ASPSYoungGen::available_for_contraction: " SIZE_FORMAT " K", result_aligned/K); 117 log_trace(gc, ergo)(" max_contraction " SIZE_FORMAT " K", max_contraction/K); |