# HG changeset patch # User anoll # Date 1387265466 -3600 # Node ID 908afcc9d1cb756260ff0d1ee44fa9b305b4531b # Parent 1e5c86da83929f10abfd5f6211e96a8938673f88 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 1e5c86da8392 -r 908afcc9d1cb src/share/vm/runtime/sweeper.cpp --- a/src/share/vm/runtime/sweeper.cpp Sat Jan 11 13:51:01 2014 -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;