hotspot/src/share/vm/services/lowMemoryDetector.cpp
// Only called by VMThread at GC time
void LowMemoryDetector::detect_after_gc_memory(MemoryPool* pool) {
{- -------------------------------------------
(1) もし,
* 引数で指定された MemoryPool にまだ gc usage sensor が作成されていなかったり,
* gc usage threshold が high threshold に対応していなかったり,
* high threshold の値が設定されていなかったり
という場合には,
何も通知すべきことはないので, ここでリターン.
---------------------------------------- -}
SensorInfo* sensor = pool->gc_usage_sensor();
if (sensor == NULL ||
!pool->gc_usage_threshold()->is_high_threshold_supported() ||
pool->gc_usage_threshold()->high_threshold() == 0) {
return;
}
{
{- -------------------------------------------
(1) (Service_lock に対して notify_all() を呼び出すので, Service_lock のロックを取っておく)
---------------------------------------- -}
MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag);
{- -------------------------------------------
(1) SensorInfo::set_counter_sensor_level() で,
新しい通知の発生条件を満たしたかどうかを判定する.
---------------------------------------- -}
MemoryUsage usage = pool->get_last_collection_usage();
sensor->set_counter_sensor_level(usage, pool->gc_usage_threshold());
{- -------------------------------------------
(1) もし, 新しい通知が発生していれば,
Service_lock に対して Monitor::notify_all() を呼び出して,
ServiceThread を起床させる.
---------------------------------------- -}
if (sensor->has_pending_requests()) {
// notify sensor state update
Service_lock->notify_all();
}
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.