hotspot/src/share/vm/memory/referenceProcessor.cpp
void ReferenceProcessor::update_soft_ref_master_clock() {
{- -------------------------------------------
(1) 現在時刻を取得する.
---------------------------------------- -}
// Update (advance) the soft ref master clock field. This must be done
// after processing the soft ref list.
jlong now = os::javaTimeMillis();
{- -------------------------------------------
(1) 現在の clock の値を取得する.
---------------------------------------- -}
jlong clock = java_lang_ref_SoftReference::clock();
{- -------------------------------------------
(1) (verify)
---------------------------------------- -}
NOT_PRODUCT(
if (now < clock) {
warning("time warp: %d to %d", clock, now);
}
)
{- -------------------------------------------
(1) システムの時間は, 何らかの理由で巻き戻る可能性も考えられる.
それをそのまま clock の値に使用してしまうと soft reference の管理がおかしなことになるので,
更新前の clock 値より現在時刻の方が大きい場合のみ clock の値を更新することにしている.
(ところで, コメントに書かれている
GenCollectedHeap::time_since_last_gc() というメソッドは
今は存在しないようだが...)
---------------------------------------- -}
// In product mode, protect ourselves from system time being adjusted
// externally and going backward; see note in the implementation of
// GenCollectedHeap::time_since_last_gc() for the right way to fix
// this uniformly throughout the VM; see bug-id 4741166. XXX
if (now > clock) {
java_lang_ref_SoftReference::set_clock(now);
}
// Else leave clock stalled at its old value until time progresses
// past clock value.
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.