comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 1888:a7214d79fcf1

6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data Summary: Deprecated HandlePromotionFailure, removing the ability to turn off that feature, did away with one epoch look-ahead when deciding if a scavenge is likely to fail, relying on current data. Reviewed-by: jmasa, johnc, poonam
author ysr
date Sat, 23 Oct 2010 23:03:49 -0700
parents c99c53f07c14
children f95d63e2154a
comparison
equal deleted inserted replaced
1887:cd3ef3fd20dd 1888:a7214d79fcf1
352 // the padded average size of the promotion for each 352 // the padded average size of the promotion for each
353 // young generation collection. 353 // young generation collection.
354 double CMSStats::time_until_cms_gen_full() const { 354 double CMSStats::time_until_cms_gen_full() const {
355 size_t cms_free = _cms_gen->cmsSpace()->free(); 355 size_t cms_free = _cms_gen->cmsSpace()->free();
356 GenCollectedHeap* gch = GenCollectedHeap::heap(); 356 GenCollectedHeap* gch = GenCollectedHeap::heap();
357 size_t expected_promotion = gch->get_gen(0)->capacity(); 357 size_t expected_promotion = MIN2(gch->get_gen(0)->capacity(),
358 if (HandlePromotionFailure) { 358 (size_t) _cms_gen->gc_stats()->avg_promoted()->padded_average());
359 expected_promotion = MIN2(
360 (size_t) _cms_gen->gc_stats()->avg_promoted()->padded_average(),
361 expected_promotion);
362 }
363 if (cms_free > expected_promotion) { 359 if (cms_free > expected_promotion) {
364 // Start a cms collection if there isn't enough space to promote 360 // Start a cms collection if there isn't enough space to promote
365 // for the next minor collection. Use the padded average as 361 // for the next minor collection. Use the padded average as
366 // a safety factor. 362 // a safety factor.
367 cms_free -= expected_promotion; 363 cms_free -= expected_promotion;
863 859
864 size_t ConcurrentMarkSweepGeneration::max_available() const { 860 size_t ConcurrentMarkSweepGeneration::max_available() const {
865 return free() + _virtual_space.uncommitted_size(); 861 return free() + _virtual_space.uncommitted_size();
866 } 862 }
867 863
868 bool ConcurrentMarkSweepGeneration::promotion_attempt_is_safe( 864 bool ConcurrentMarkSweepGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {
869 size_t max_promotion_in_bytes, 865 size_t available = max_available();
870 bool younger_handles_promotion_failure) const { 866 size_t av_promo = (size_t)gc_stats()->avg_promoted()->padded_average();
871 867 bool res = (available >= av_promo) || (available >= max_promotion_in_bytes);
872 // This is the most conservative test. Full promotion is 868 if (PrintGC && Verbose) {
873 // guaranteed if this is used. The multiplicative factor is to 869 gclog_or_tty->print_cr(
874 // account for the worst case "dilatation". 870 "CMS: promo attempt is%s safe: available("SIZE_FORMAT") %s av_promo("SIZE_FORMAT"),"
875 double adjusted_max_promo_bytes = _dilatation_factor * max_promotion_in_bytes; 871 "max_promo("SIZE_FORMAT")",
876 if (adjusted_max_promo_bytes > (double)max_uintx) { // larger than size_t 872 res? "":" not", available, res? ">=":"<",
877 adjusted_max_promo_bytes = (double)max_uintx; 873 av_promo, max_promotion_in_bytes);
878 } 874 }
879 bool result = (max_contiguous_available() >= (size_t)adjusted_max_promo_bytes); 875 return res;
880
881 if (younger_handles_promotion_failure && !result) {
882 // Full promotion is not guaranteed because fragmentation
883 // of the cms generation can prevent the full promotion.
884 result = (max_available() >= (size_t)adjusted_max_promo_bytes);
885
886 if (!result) {
887 // With promotion failure handling the test for the ability
888 // to support the promotion does not have to be guaranteed.
889 // Use an average of the amount promoted.
890 result = max_available() >= (size_t)
891 gc_stats()->avg_promoted()->padded_average();
892 if (PrintGC && Verbose && result) {
893 gclog_or_tty->print_cr(
894 "\nConcurrentMarkSweepGeneration::promotion_attempt_is_safe"
895 " max_available: " SIZE_FORMAT
896 " avg_promoted: " SIZE_FORMAT,
897 max_available(), (size_t)
898 gc_stats()->avg_promoted()->padded_average());
899 }
900 } else {
901 if (PrintGC && Verbose) {
902 gclog_or_tty->print_cr(
903 "\nConcurrentMarkSweepGeneration::promotion_attempt_is_safe"
904 " max_available: " SIZE_FORMAT
905 " adj_max_promo_bytes: " SIZE_FORMAT,
906 max_available(), (size_t)adjusted_max_promo_bytes);
907 }
908 }
909 } else {
910 if (PrintGC && Verbose) {
911 gclog_or_tty->print_cr(
912 "\nConcurrentMarkSweepGeneration::promotion_attempt_is_safe"
913 " contiguous_available: " SIZE_FORMAT
914 " adj_max_promo_bytes: " SIZE_FORMAT,
915 max_contiguous_available(), (size_t)adjusted_max_promo_bytes);
916 }
917 }
918 return result;
919 } 876 }
920 877
921 // At a promotion failure dump information on block layout in heap 878 // At a promotion failure dump information on block layout in heap
922 // (cms old generation). 879 // (cms old generation).
923 void ConcurrentMarkSweepGeneration::promotion_failure_occurred() { 880 void ConcurrentMarkSweepGeneration::promotion_failure_occurred() {
6089 // under the freelistLock (as is the check for whether to 6046 // under the freelistLock (as is the check for whether to
6090 // allocate-live and whether to dirty the mod-union table). 6047 // allocate-live and whether to dirty the mod-union table).
6091 assert(_collectorState == Resizing, "Change of collector state to" 6048 assert(_collectorState == Resizing, "Change of collector state to"
6092 " Resizing must be done under the freelistLocks (plural)"); 6049 " Resizing must be done under the freelistLocks (plural)");
6093 6050
6094 // Now that sweeping has been completed, if the GCH's 6051 // Now that sweeping has been completed, we clear
6095 // incremental_collection_will_fail flag is set, clear it, 6052 // the incremental_collection_failed flag,
6096 // thus inviting a younger gen collection to promote into 6053 // thus inviting a younger gen collection to promote into
6097 // this generation. If such a promotion may still fail, 6054 // this generation. If such a promotion may still fail,
6098 // the flag will be set again when a young collection is 6055 // the flag will be set again when a young collection is
6099 // attempted. 6056 // attempted.
6100 // I think the incremental_collection_will_fail flag's use
6101 // is specific to a 2 generation collection policy, so i'll
6102 // assert that that's the configuration we are operating within.
6103 // The use of the flag can and should be generalized appropriately
6104 // in the future to deal with a general n-generation system.
6105
6106 GenCollectedHeap* gch = GenCollectedHeap::heap(); 6057 GenCollectedHeap* gch = GenCollectedHeap::heap();
6107 assert(gch->collector_policy()->is_two_generation_policy(), 6058 gch->clear_incremental_collection_failed(); // Worth retrying as fresh space may have been freed up
6108 "Resetting of incremental_collection_will_fail flag"
6109 " may be incorrect otherwise");
6110 gch->clear_incremental_collection_will_fail();
6111 gch->update_full_collections_completed(_collection_count_start); 6059 gch->update_full_collections_completed(_collection_count_start);
6112 } 6060 }
6113 6061
6114 // FIX ME!!! Looks like this belongs in CFLSpace, with 6062 // FIX ME!!! Looks like this belongs in CFLSpace, with
6115 // CMSGen merely delegating to it. 6063 // CMSGen merely delegating to it.