hotspot/src/share/vm/services/management.cpp
// Returns an array of java/lang/management/MemoryPoolMXBean object
// one for each memory pool if obj == null; otherwise returns
// an array of memory pools for a given memory manager if
// it is a valid memory manager.
JVM_ENTRY(jobjectArray, jmm_GetMemoryPools(JNIEnv* env, jobject obj))
(この関数は, java/lang/management/MemoryPoolMXBean オブジェクトの配列を返す.
その際に, 引数で MemoryManager オブジェクトが指定されている場合は,
その MemoryManager に関連した MemoryPool だけを返す.
逆に指定されていない場合 (= NULL の場合) には, 全ての MemoryPool を返す)
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
ResourceMark rm(THREAD);
{- -------------------------------------------
(1) まず, 引数で MemoryManager オブジェクトが指定されているかどうかを確認しておく.
(なお, 指定されている(= NULL ではない)が正しい MemoryManager オブジェクトを指していない場合には, ここでリターン)
---------------------------------------- -}
int num_memory_pools;
MemoryManager* mgr = NULL;
if (obj == NULL) {
num_memory_pools = MemoryService::num_memory_pools();
} else {
mgr = get_memory_manager_from_jobject(obj, CHECK_NULL);
if (mgr == NULL) {
return NULL;
}
num_memory_pools = mgr->num_memory_pools();
}
{- -------------------------------------------
(1) 返値として返す MemoryPoolMXBean の配列を用意する (以下の poolArray).
---------------------------------------- -}
// Allocate the resulting MemoryPoolMXBean[] object
klassOop k = Management::java_lang_management_MemoryPoolMXBean_klass(CHECK_NULL);
instanceKlassHandle ik (THREAD, k);
objArrayOop r = oopFactory::new_objArray(ik(), num_memory_pools, CHECK_NULL);
objArrayHandle poolArray(THREAD, r);
{- -------------------------------------------
(1) mgrArray の中に, 実際の MemoryPool を表す
sun.management.MemoryPoolImpl オブジェクトを積めていく.
引数で MemoryManager オブジェクトが指定されている場合には,
MemoryManager::get_memory_pool() で
その MemoryManager に関連した MemoryPool だけを取得していく.
そうでなければ, MemoryService::get_memory_pool() で
全ての MemoryPool を取得していく.
どちらの場合も, 配列に積める前には
MemoryPool オブジェクトから sun.management.MemoryPoolImpl オブジェクトに変換するために
MemoryPool::get_memory_pool_instance() が呼び出される.
---------------------------------------- -}
if (mgr == NULL) {
// Get all memory pools
for (int i = 0; i < num_memory_pools; i++) {
MemoryPool* pool = MemoryService::get_memory_pool(i);
instanceOop p = pool->get_memory_pool_instance(CHECK_NULL);
instanceHandle ph(THREAD, p);
poolArray->obj_at_put(i, ph());
}
} else {
// Get memory pools managed by a given memory manager
for (int i = 0; i < num_memory_pools; i++) {
MemoryPool* pool = mgr->get_memory_pool(i);
instanceOop p = pool->get_memory_pool_instance(CHECK_NULL);
instanceHandle ph(THREAD, p);
poolArray->obj_at_put(i, ph());
}
}
{- -------------------------------------------
(1) 結果を JNIHandle 化してリターン
---------------------------------------- -}
return (jobjectArray) JNIHandles::make_local(env, poolArray());
JVM_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.