hotspot/src/share/vm/services/management.cpp
// Sets the threshold of a given memory pool.
// Returns the previous threshold.
//
// Input parameters:
// pool - the MemoryPoolMXBean object
// type - threshold type
// threshold - the new threshold (must not be negative)
//
JVM_ENTRY(jlong, jmm_SetPoolThreshold(JNIEnv* env, jobject obj, jmmThresholdType type, jlong threshold))
{- -------------------------------------------
(1) 指定された閾値が負値の場合は, IllegalArgumentException.
指定された閾値が max_uintx を超えている場合は, IllegalArgumentException.
(なお, max_uintx は uintptr_t 型の最大値であって, unsigned int の最大値ではないことに注意.
32bit では 2^32-1, 64bit では 2^64-1 の値になる.)
---------------------------------------- -}
if (threshold < 0) {
THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
"Invalid threshold value",
-1);
}
if ((size_t)threshold > max_uintx) {
stringStream st;
st.print("Invalid valid threshold value. Threshold value (" UINT64_FORMAT ") > max value of size_t (" SIZE_FORMAT ")", (size_t)threshold, max_uintx);
THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), st.as_string(), -1);
}
{- -------------------------------------------
(1) 引数で指定された MemoryPool に対して,
ThresholdSupport::set_high_threshold() または ThresholdSupport::set_low_threshold() で
指定された種別の閾値を変更する.
ただし, その MemoryPool が, 指定された種別の閾値に対応していない場合には
(ThresholdSupport::is_high_threshold_supported() または
ThresholdSupport::is_low_threshold_supported() が false を返す場合),
-1 をリターンして終了.
また, 変更するのが usage threshould の場合は, 以前の閾値を覚えておく (以下の prev).
(collection usage threshould の場合は, prev の値は 0)
---------------------------------------- -}
MemoryPool* pool = get_memory_pool_from_jobject(obj, CHECK_(0L));
assert(pool != NULL, "MemoryPool should exist");
jlong prev = 0;
switch (type) {
case JMM_USAGE_THRESHOLD_HIGH:
if (!pool->usage_threshold()->is_high_threshold_supported()) {
return -1;
}
prev = pool->usage_threshold()->set_high_threshold((size_t) threshold);
break;
case JMM_USAGE_THRESHOLD_LOW:
if (!pool->usage_threshold()->is_low_threshold_supported()) {
return -1;
}
prev = pool->usage_threshold()->set_low_threshold((size_t) threshold);
break;
case JMM_COLLECTION_USAGE_THRESHOLD_HIGH:
if (!pool->gc_usage_threshold()->is_high_threshold_supported()) {
return -1;
}
// return and the new threshold is effective for the next GC
return pool->gc_usage_threshold()->set_high_threshold((size_t) threshold);
case JMM_COLLECTION_USAGE_THRESHOLD_LOW:
if (!pool->gc_usage_threshold()->is_low_threshold_supported()) {
return -1;
}
// return and the new threshold is effective for the next GC
return pool->gc_usage_threshold()->set_low_threshold((size_t) threshold);
default:
assert(false, "Unrecognized type");
return -1;
}
{- -------------------------------------------
(1) もし閾値の設定が変更された場合には,
LowMemoryDetector::recompute_enabled_for_collected_pools() で
_enabled_for_collected_pools フィールドの値を更新し,
さらに LowMemoryDetector::detect_low_memory() で
(新しい閾値を超過していれば) 通知処理を行っておく.
---------------------------------------- -}
// When the threshold is changed, reevaluate if the low memory
// detection is enabled.
if (prev != threshold) {
LowMemoryDetector::recompute_enabled_for_collected_pools();
LowMemoryDetector::detect_low_memory(pool);
}
{- -------------------------------------------
(1) prev の値をリターン
---------------------------------------- -}
return prev;
JVM_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.