--- old/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp 2011-12-09 11:25:16.957030069 -0800 +++ new/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp 2011-12-09 11:25:16.723512987 -0800 @@ -3398,17 +3398,22 @@ } jlong PSParallelCompact::millis_since_last_gc() { - jlong ret_val = os::javaTimeMillis() - _time_of_last_gc; + // We need a montonically increasing time in ms but os::javaTimeMillis() + // does not guarantee montonicity. + jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC; + jlong ret_val = now - _time_of_last_gc; // XXX See note in genCollectedHeap::millis_since_last_gc(). if (ret_val < 0) { - NOT_PRODUCT(warning("time warp: %d", ret_val);) + NOT_PRODUCT(warning("time warp: "INT64_FORMAT, ret_val);) return 0; } return ret_val; } void PSParallelCompact::reset_millis_since_last_gc() { - _time_of_last_gc = os::javaTimeMillis(); + // We need a montonically increasing time in ms but os::javaTimeMillis() + // does not guarantee montonicity. + _time_of_last_gc = os::javaTimeNanos() / NANOSECS_PER_MILLISEC; } ParMarkBitMap::IterationStatus MoveAndUpdateClosure::copy_until_full()