# HG changeset patch # User anoll # Date 1387265466 -3600 # Node ID d49557091d1829599d67ef620efa96c6479c1e2a # Parent 050a626a88951140df874f7b163e304d07b6c296 8029091: Bug in calculation of code cache sweeping interval Summary: Use signed data type so that no underflow can happen Reviewed-by: kvn, roland diff -r 050a626a8895 -r d49557091d18 src/share/vm/runtime/sweeper.cpp --- a/src/share/vm/runtime/sweeper.cpp Fri Dec 13 09:35:12 2013 -0800 +++ b/src/share/vm/runtime/sweeper.cpp Tue Dec 17 08:31:06 2013 +0100 @@ -257,9 +257,14 @@ // Large ReservedCodeCacheSize: (e.g., 256M + code Cache is 90% full). The formula // computes: (256 / 16) - 10 = 6. if (!_should_sweep) { - int time_since_last_sweep = _time_counter - _last_sweep; - double wait_until_next_sweep = (ReservedCodeCacheSize / (16 * M)) - time_since_last_sweep - - CodeCache::reverse_free_ratio(); + const int time_since_last_sweep = _time_counter - _last_sweep; + // ReservedCodeCacheSize has an 'unsigned' type. We need a 'signed' type for max_wait_time, + // since 'time_since_last_sweep' can be larger than 'max_wait_time'. If that happens using + // an unsigned type would cause an underflow (wait_until_next_sweep becomes a large positive + // value) that disables the intended periodic sweeps. + const int max_wait_time = ReservedCodeCacheSize / (16 * M); + double wait_until_next_sweep = max_wait_time - time_since_last_sweep - CodeCache::reverse_free_ratio(); + assert(wait_until_next_sweep <= (double)max_wait_time, "Calculation of code cache sweeper interval is incorrect"); if ((wait_until_next_sweep <= 0.0) || !CompileBroker::should_compile_new_jobs()) { _should_sweep = true;