hotspot/src/share/vm/services/lowMemoryDetector.cpp
使用量が閾値付近で細かく振動した場合に 何度も通知が発生しないように, clear 通知 (low threshold を下回った際の通知) については 続けて出ないようになっている.
ただし, trigger 通知 (high threshold を上回った際の通知) については, そういう状況が観測される度に毎回通知する.
観測時に high threshold を上回っていれば, (sensor の状態にかかわらず) trigger 通知を送信する. 実際に trigger 通知に送信されると, sensor は on 状態になる.
trigger が生じて以降に, 使用量が low threshold を下回ると, clear 通知が生成される 実際に clear 通知に送信されると, sensor は off 状態になる. clear が一旦生成された後は, 次に trigger が生成されるまで, low 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).
void SensorInfo::set_counter_sensor_level(MemoryUsage usage, ThresholdSupport* counter_threshold) {
{- -------------------------------------------
(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.