Top


定義場所(file name)

hotspot/src/share/vm/memory/referenceProcessor.cpp

名前(function name)

void ReferenceProcessor::update_soft_ref_master_clock() {

本体部(body)

  {- -------------------------------------------
  (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.