Top


定義場所(file name)

hotspot/src/share/vm/services/lowMemoryDetector.cpp

説明(description)

使用量が閾値付近で細かく振動した場合に 何度も通知が発生しないように, clear 通知 (low threshold を下回った際の通知) については 続けて出ないようになっている.

ただし, trigger 通知 (high threshold を上回った際の通知) については, そういう状況が観測される度に毎回通知する.

// When this method is used, the memory usage is monitored as a
// simple counter attribute.  The sensor will be triggered
// whenever the usage is crossing the threshold to keep track
// of the number of times the VM detects such a condition occurs.
//
// High and low thresholds are designed to provide a
// hysteresis mechanism to avoid repeated triggering
// of notifications when the attribute value makes small oscillations
// around the high or low threshold value.
//
// The sensor will be triggered if:
//   - the usage is crossing above the high threshold regardless
//     of the current sensor state.
//
// The sensor will be cleared if:
//  (1) the usage is crossing below the low threshold and
//      the sensor is currently on; or
//  (2) the usage is crossing below the low threshold and
//      the sensor will be on (i.e. sensor is currently off
//      and has pending trigger requests).

名前(function name)

void SensorInfo::set_counter_sensor_level(MemoryUsage usage, ThresholdSupport* counter_threshold) {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(counter_threshold->is_high_threshold_supported(), "just checking");

  {- -------------------------------------------
  (1) 現在の使用量が, high threshold を上回っているかどうか (以下の is_over_high), 
      及び, low threshold を下回っているかどうか (以下の is_below_low) を調べておく
      ---------------------------------------- -}

      bool is_over_high = counter_threshold->is_high_threshold_crossed(usage);
      bool is_below_low = counter_threshold->is_low_threshold_crossed(usage);

      assert(!(is_over_high && is_below_low), "Can't be both true");

  {- -------------------------------------------
  (1) もし, high threshold を上回っていれば, 
      新しい trigger 通知を生成する (_pending_trigger_count フィールドをインクリメントする).
      (なお, この時点で未通知の clear 通知があった場合, それは消しておく (trigger 通知を出す以上 sensor の状態は on になるので))
      (ついでに, _usage フィールドに現在のメモリ使用量の情報を記録しておく)
      ---------------------------------------- -}

      if (is_over_high) {
        _pending_trigger_count++;
        _usage = usage;
        _pending_clear_count = 0;

  {- -------------------------------------------
  (1) 逆に, low threshold を下回っていて, かつ
      今回 clear 通知を生成しても clear が連続しないのであれば, 
      新しい clear 通知を生成する (_pending_clear_count フィールドをインクリメントする).
      ---------------------------------------- -}

      } else if (is_below_low && (_sensor_on || _pending_trigger_count > 0)) {
        _pending_clear_count++;
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.