< prev index next >

src/hotspot/share/gc/parallel/psYoungGen.cpp

Print this page
rev 59216 : [mq]: cleanup
rev 59217 : [mq]: remove_init_gen_size


  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     }


< prev index next >