- PR -

native method から java.lang.Runtime.freeMemory()

1
投稿者投稿内容
yos
常連さん
会議室デビュー日: 2004/08/24
投稿数: 27
投稿日時: 2005-02-15 12:11
現在、サーブレットで使用すビーンズから呼び出される
ネイティブ・メソッドを作成中です。
ネイティブ・メソッドの開発は初めてで、
特に Java VM のメモリ使用量を気にしています。

そこで、java.lang.Runtime.totalMemory() と freeMemory() を
呼び出して、メモリの総容量と空きメモリ量を 表示する関数を作成したところ、
totalMemory() は、適切だと思われる値(15,376,384)を取得できるのですが、
freeMemory() では、0 になります。

ネイティブ・メソッドからは、空きメモリ量は取得できないのでしょうか?


また、「DeleteLocalRef()」の使い方が理解できていません。
これは、NewObject() や CallObjectMethod() などで 返された
Java オブジェクト が不要になったときに呼び出せば良いのでしょうか?


どなたかこの問題についてお分かりになられる方、教えてください。
よろしくお願いします。


===環境====================
Windows 2000 Service Pack 4
Tomcat 4.1.12
J2SDK 1.4.1_02
===========================
yos
常連さん
会議室デビュー日: 2004/08/24
投稿数: 27
投稿日時: 2005-02-15 13:15
[追記]

下記に、メモリの総容量と空きメモリ量を 表示する関数を提示します。
何か気付いた点があれば、ご指摘ください。
よろしくお願いします。

コード:
void VM_Memory (env)
    JNIEnv  *env;   /* I JNI インターフェース・ポインタ */
{
    jclass      targetClass = NULL;
    jmethodID   mid = NULL;
    jobject     objA = NULL;

    jlong       ltotalMemory;
    jlong       lfreeMemory;

    /* java.lang.Runtime クラスをロードします。*/
    targetClass = (*env)->FindClass (env, "Ljava/lang/Runtime;");
    if (targetClass == NULL)
        {
        OutputDebugString ("java.lang.Runtime の (*env)->FindClass に失敗\n");
        return;
        }

    /* スタティック・メソッド getRuntime の ID を取得。 */
    mid = (*env)->GetStaticMethodID (env, targetClass, "getRuntime", "()Ljava/lang/Runtime;");
    if (mid == NULL)
        {
        OutputDebugString ("java.lang.Runtime の スタティック・メソッド getRuntime の ID の 取得に失敗\n");
        goto DELETE_PROC;
        }

    /* getRuntime () の呼び出し。   */
    objA = (*env)->CallStaticObjectMethod (env, targetClass, mid);
    if (objA == NULL)
        {
        OutputDebugString ("java.lang.Runtime の getRuntime() の呼び出しに失敗\n");
        goto DELETE_PROC;
        }

    /* totalMemory() のメソッドIDを取得。   */
    mid = (*env)->GetMethodID (env, targetClass, "totalMemory", "()J");
    if (mid == NULL)
        {
        OutputDebugString ("java.lang.Runtime の totalMemory() のメソッドID の 取得に失敗\n");
        goto DELETE_PROC;
        }
    /* Java 仮想マシンのメモリの総容量を取得します。    */
    ltotalMemory = (*env)->CallLongMethod (env, objA, mid);

    /* freeMemory() のメソッドIDを取得。   */
    mid = (*env)->GetMethodID (env, targetClass, "freeMemory", "()J");
    if (mid == NULL)
        {
        OutputDebugString ("java.lang.Runtime の freeMemory() のメソッドID の 取得に失敗\n");
        goto DELETE_PROC;
        }
    /* Java 仮想マシン内の空きメモリの量を取得します。  */
    lfreeMemory = (*env)->CallLongMethod (env, objA, mid);

{
    char    szMsg[512];

    wsprintf (szMsg, "Java 仮想マシンのメモリの総容量 : %20ld\tJava 仮想マシン内の空きメモリ量 : %20ld\n", ltotalMemory, lfreeMemory);
    OutputDebugString (szMsg);
}

DELETE_PROC:
    if (objA != NULL)
        {
        (*env)->DeleteLocalRef (env, objA);
        objA = NULL;
        }

    if (mid != NULL)
        {
//      (*env)->DeleteLocalRef (env, mid);
        mid = NULL;
        }

    if (targetClass != NULL)
        {
        (*env)->DeleteLocalRef (env, targetClass);
        targetClass = NULL;
        }

    return;
}


1

スキルアップ/キャリアアップ(JOB@IT)