hotspot/src/share/vm/memory/generation.cpp
changeset 28031 10aec24d2b61
parent 27904 d606512952cc
child 28217 57791914628c
equal deleted inserted replaced
28030:c36c6703366d 28031:10aec24d2b61
   359   while (sp != NULL) {
   359   while (sp != NULL) {
   360     sp->compact();
   360     sp->compact();
   361     sp = sp->next_compaction_space();
   361     sp = sp->next_compaction_space();
   362   }
   362   }
   363 }
   363 }
   364 
       
   365 CardGeneration::CardGeneration(ReservedSpace rs, size_t initial_byte_size,
       
   366                                int level,
       
   367                                GenRemSet* remset) :
       
   368   Generation(rs, initial_byte_size, level), _rs(remset),
       
   369   _shrink_factor(0), _min_heap_delta_bytes(), _capacity_at_prologue(),
       
   370   _used_at_prologue()
       
   371 {
       
   372   HeapWord* start = (HeapWord*)rs.base();
       
   373   size_t reserved_byte_size = rs.size();
       
   374   assert((uintptr_t(start) & 3) == 0, "bad alignment");
       
   375   assert((reserved_byte_size & 3) == 0, "bad alignment");
       
   376   MemRegion reserved_mr(start, heap_word_size(reserved_byte_size));
       
   377   _bts = new BlockOffsetSharedArray(reserved_mr,
       
   378                                     heap_word_size(initial_byte_size));
       
   379   MemRegion committed_mr(start, heap_word_size(initial_byte_size));
       
   380   _rs->resize_covered_region(committed_mr);
       
   381   if (_bts == NULL)
       
   382     vm_exit_during_initialization("Could not allocate a BlockOffsetArray");
       
   383 
       
   384   // Verify that the start and end of this generation is the start of a card.
       
   385   // If this wasn't true, a single card could span more than on generation,
       
   386   // which would cause problems when we commit/uncommit memory, and when we
       
   387   // clear and dirty cards.
       
   388   guarantee(_rs->is_aligned(reserved_mr.start()), "generation must be card aligned");
       
   389   if (reserved_mr.end() != Universe::heap()->reserved_region().end()) {
       
   390     // Don't check at the very end of the heap as we'll assert that we're probing off
       
   391     // the end if we try.
       
   392     guarantee(_rs->is_aligned(reserved_mr.end()), "generation must be card aligned");
       
   393   }
       
   394   _min_heap_delta_bytes = MinHeapDeltaBytes;
       
   395   _capacity_at_prologue = initial_byte_size;
       
   396   _used_at_prologue = 0;
       
   397 }
       
   398 
       
   399 bool CardGeneration::expand(size_t bytes, size_t expand_bytes) {
       
   400   assert_locked_or_safepoint(Heap_lock);
       
   401   if (bytes == 0) {
       
   402     return true;  // That's what grow_by(0) would return
       
   403   }
       
   404   size_t aligned_bytes  = ReservedSpace::page_align_size_up(bytes);
       
   405   if (aligned_bytes == 0){
       
   406     // The alignment caused the number of bytes to wrap.  An expand_by(0) will
       
   407     // return true with the implication that an expansion was done when it
       
   408     // was not.  A call to expand implies a best effort to expand by "bytes"
       
   409     // but not a guarantee.  Align down to give a best effort.  This is likely
       
   410     // the most that the generation can expand since it has some capacity to
       
   411     // start with.
       
   412     aligned_bytes = ReservedSpace::page_align_size_down(bytes);
       
   413   }
       
   414   size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
       
   415   bool success = false;
       
   416   if (aligned_expand_bytes > aligned_bytes) {
       
   417     success = grow_by(aligned_expand_bytes);
       
   418   }
       
   419   if (!success) {
       
   420     success = grow_by(aligned_bytes);
       
   421   }
       
   422   if (!success) {
       
   423     success = grow_to_reserved();
       
   424   }
       
   425   if (PrintGC && Verbose) {
       
   426     if (success && GC_locker::is_active_and_needs_gc()) {
       
   427       gclog_or_tty->print_cr("Garbage collection disabled, expanded heap instead");
       
   428     }
       
   429   }
       
   430 
       
   431   return success;
       
   432 }
       
   433 
       
   434 
       
   435 // No young generation references, clear this generation's cards.
       
   436 void CardGeneration::clear_remembered_set() {
       
   437   _rs->clear(reserved());
       
   438 }
       
   439 
       
   440 
       
   441 // Objects in this generation may have moved, invalidate this
       
   442 // generation's cards.
       
   443 void CardGeneration::invalidate_remembered_set() {
       
   444   _rs->invalidate(used_region());
       
   445 }
       
   446 
       
   447 
       
   448 void CardGeneration::compute_new_size() {
       
   449   assert(_shrink_factor <= 100, "invalid shrink factor");
       
   450   size_t current_shrink_factor = _shrink_factor;
       
   451   _shrink_factor = 0;
       
   452 
       
   453   // We don't have floating point command-line arguments
       
   454   // Note:  argument processing ensures that MinHeapFreeRatio < 100.
       
   455   const double minimum_free_percentage = MinHeapFreeRatio / 100.0;
       
   456   const double maximum_used_percentage = 1.0 - minimum_free_percentage;
       
   457 
       
   458   // Compute some numbers about the state of the heap.
       
   459   const size_t used_after_gc = used();
       
   460   const size_t capacity_after_gc = capacity();
       
   461 
       
   462   const double min_tmp = used_after_gc / maximum_used_percentage;
       
   463   size_t minimum_desired_capacity = (size_t)MIN2(min_tmp, double(max_uintx));
       
   464   // Don't shrink less than the initial generation size
       
   465   minimum_desired_capacity = MAX2(minimum_desired_capacity,
       
   466                                   spec()->init_size());
       
   467   assert(used_after_gc <= minimum_desired_capacity, "sanity check");
       
   468 
       
   469   if (PrintGC && Verbose) {
       
   470     const size_t free_after_gc = free();
       
   471     const double free_percentage = ((double)free_after_gc) / capacity_after_gc;
       
   472     gclog_or_tty->print_cr("TenuredGeneration::compute_new_size: ");
       
   473     gclog_or_tty->print_cr("  "
       
   474                   "  minimum_free_percentage: %6.2f"
       
   475                   "  maximum_used_percentage: %6.2f",
       
   476                   minimum_free_percentage,
       
   477                   maximum_used_percentage);
       
   478     gclog_or_tty->print_cr("  "
       
   479                   "   free_after_gc   : %6.1fK"
       
   480                   "   used_after_gc   : %6.1fK"
       
   481                   "   capacity_after_gc   : %6.1fK",
       
   482                   free_after_gc / (double) K,
       
   483                   used_after_gc / (double) K,
       
   484                   capacity_after_gc / (double) K);
       
   485     gclog_or_tty->print_cr("  "
       
   486                   "   free_percentage: %6.2f",
       
   487                   free_percentage);
       
   488   }
       
   489 
       
   490   if (capacity_after_gc < minimum_desired_capacity) {
       
   491     // If we have less free space than we want then expand
       
   492     size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
       
   493     // Don't expand unless it's significant
       
   494     if (expand_bytes >= _min_heap_delta_bytes) {
       
   495       expand(expand_bytes, 0); // safe if expansion fails
       
   496     }
       
   497     if (PrintGC && Verbose) {
       
   498       gclog_or_tty->print_cr("    expanding:"
       
   499                     "  minimum_desired_capacity: %6.1fK"
       
   500                     "  expand_bytes: %6.1fK"
       
   501                     "  _min_heap_delta_bytes: %6.1fK",
       
   502                     minimum_desired_capacity / (double) K,
       
   503                     expand_bytes / (double) K,
       
   504                     _min_heap_delta_bytes / (double) K);
       
   505     }
       
   506     return;
       
   507   }
       
   508 
       
   509   // No expansion, now see if we want to shrink
       
   510   size_t shrink_bytes = 0;
       
   511   // We would never want to shrink more than this
       
   512   size_t max_shrink_bytes = capacity_after_gc - minimum_desired_capacity;
       
   513 
       
   514   if (MaxHeapFreeRatio < 100) {
       
   515     const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
       
   516     const double minimum_used_percentage = 1.0 - maximum_free_percentage;
       
   517     const double max_tmp = used_after_gc / minimum_used_percentage;
       
   518     size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
       
   519     maximum_desired_capacity = MAX2(maximum_desired_capacity,
       
   520                                     spec()->init_size());
       
   521     if (PrintGC && Verbose) {
       
   522       gclog_or_tty->print_cr("  "
       
   523                              "  maximum_free_percentage: %6.2f"
       
   524                              "  minimum_used_percentage: %6.2f",
       
   525                              maximum_free_percentage,
       
   526                              minimum_used_percentage);
       
   527       gclog_or_tty->print_cr("  "
       
   528                              "  _capacity_at_prologue: %6.1fK"
       
   529                              "  minimum_desired_capacity: %6.1fK"
       
   530                              "  maximum_desired_capacity: %6.1fK",
       
   531                              _capacity_at_prologue / (double) K,
       
   532                              minimum_desired_capacity / (double) K,
       
   533                              maximum_desired_capacity / (double) K);
       
   534     }
       
   535     assert(minimum_desired_capacity <= maximum_desired_capacity,
       
   536            "sanity check");
       
   537 
       
   538     if (capacity_after_gc > maximum_desired_capacity) {
       
   539       // Capacity too large, compute shrinking size
       
   540       shrink_bytes = capacity_after_gc - maximum_desired_capacity;
       
   541       // We don't want shrink all the way back to initSize if people call
       
   542       // System.gc(), because some programs do that between "phases" and then
       
   543       // we'd just have to grow the heap up again for the next phase.  So we
       
   544       // damp the shrinking: 0% on the first call, 10% on the second call, 40%
       
   545       // on the third call, and 100% by the fourth call.  But if we recompute
       
   546       // size without shrinking, it goes back to 0%.
       
   547       shrink_bytes = shrink_bytes / 100 * current_shrink_factor;
       
   548       assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
       
   549       if (current_shrink_factor == 0) {
       
   550         _shrink_factor = 10;
       
   551       } else {
       
   552         _shrink_factor = MIN2(current_shrink_factor * 4, (size_t) 100);
       
   553       }
       
   554       if (PrintGC && Verbose) {
       
   555         gclog_or_tty->print_cr("  "
       
   556                       "  shrinking:"
       
   557                       "  initSize: %.1fK"
       
   558                       "  maximum_desired_capacity: %.1fK",
       
   559                       spec()->init_size() / (double) K,
       
   560                       maximum_desired_capacity / (double) K);
       
   561         gclog_or_tty->print_cr("  "
       
   562                       "  shrink_bytes: %.1fK"
       
   563                       "  current_shrink_factor: " SIZE_FORMAT
       
   564                       "  new shrink factor: " SIZE_FORMAT
       
   565                       "  _min_heap_delta_bytes: %.1fK",
       
   566                       shrink_bytes / (double) K,
       
   567                       current_shrink_factor,
       
   568                       _shrink_factor,
       
   569                       _min_heap_delta_bytes / (double) K);
       
   570       }
       
   571     }
       
   572   }
       
   573 
       
   574   if (capacity_after_gc > _capacity_at_prologue) {
       
   575     // We might have expanded for promotions, in which case we might want to
       
   576     // take back that expansion if there's room after GC.  That keeps us from
       
   577     // stretching the heap with promotions when there's plenty of room.
       
   578     size_t expansion_for_promotion = capacity_after_gc - _capacity_at_prologue;
       
   579     expansion_for_promotion = MIN2(expansion_for_promotion, max_shrink_bytes);
       
   580     // We have two shrinking computations, take the largest
       
   581     shrink_bytes = MAX2(shrink_bytes, expansion_for_promotion);
       
   582     assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
       
   583     if (PrintGC && Verbose) {
       
   584       gclog_or_tty->print_cr("  "
       
   585                              "  aggressive shrinking:"
       
   586                              "  _capacity_at_prologue: %.1fK"
       
   587                              "  capacity_after_gc: %.1fK"
       
   588                              "  expansion_for_promotion: %.1fK"
       
   589                              "  shrink_bytes: %.1fK",
       
   590                              capacity_after_gc / (double) K,
       
   591                              _capacity_at_prologue / (double) K,
       
   592                              expansion_for_promotion / (double) K,
       
   593                              shrink_bytes / (double) K);
       
   594     }
       
   595   }
       
   596   // Don't shrink unless it's significant
       
   597   if (shrink_bytes >= _min_heap_delta_bytes) {
       
   598     shrink(shrink_bytes);
       
   599   }
       
   600 }
       
   601 
       
   602 // Currently nothing to do.
       
   603 void CardGeneration::prepare_for_verify() {}
       
   604