src/share/vm/memory/genCollectedHeap.cpp

Print this page
rev 2869 : 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
Summary: Replaces calls to os::javaTimeMillis(), which does not guarantee montonicity, in GC code to os::javaTimeNanos() with a suitable conversion factor. os::javaTimeNanos() mostly guarantees montonicity depending on the underlying OS implementation and, as a result, a better alternative. Changes in OS files are to make use of the newly defined constants in globalDefinitions.hpp.
Reviewed-by:

*** 1458,1486 **** _time = MIN2(_time, gen->time_of_last_gc(_now)); } }; jlong GenCollectedHeap::millis_since_last_gc() { ! jlong now = os::javaTimeMillis(); GenTimeOfLastGCClosure tolgc_cl(now); // iterate over generations getting the oldest // time that a generation was collected generation_iterate(&tolgc_cl, false); tolgc_cl.do_generation(perm_gen()); ! // XXX Despite the assert above, since javaTimeMillis() ! // doesnot guarantee monotonically increasing return ! // values (note, i didn't say "strictly monotonic"), ! // we need to guard against getting back a time ! // later than now. This should be fixed by basing ! // on someting like gethrtime() which guarantees ! // monotonicity. Note that cond_wait() is susceptible ! // to a similar problem, because its interface is ! // based on absolute time in the form of the ! // system time's notion of UCT. See also 4506635 ! // for yet another problem of similar nature. XXX jlong retVal = now - tolgc_cl.time(); if (retVal < 0) { ! NOT_PRODUCT(warning("time warp: %d", retVal);) return 0; } return retVal; } --- 1458,1486 ---- _time = MIN2(_time, gen->time_of_last_gc(_now)); } }; jlong GenCollectedHeap::millis_since_last_gc() { ! // os::javaTimeMillis() does not guarantee monotonicity. ! jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC; GenTimeOfLastGCClosure tolgc_cl(now); // iterate over generations getting the oldest // time that a generation was collected generation_iterate(&tolgc_cl, false); tolgc_cl.do_generation(perm_gen()); ! // XXX Since javaTimeNanos() mostly guarantees monotonically ! // increasing return values, depending upon the underlying ! // os-dependent implementation, we still need to guard against ! // getting back a time later than now. This should be fixed ! // by basing the implementation on something like gethrtime() ! // which does guarantee monotonicity. ! // Note that cond_wait() is susceptible to a similar problem, ! // because its interface is based on absolute time in the form ! // of the system time's notion of UCT. See also 4506635 for yet ! // another problem of similar nature. XXX jlong retVal = now - tolgc_cl.time(); if (retVal < 0) { ! NOT_PRODUCT(warning("time warp: "INT64_FORMAT, retVal);) return 0; } return retVal; }