Как узнать, является ли это утечкой памяти, при вызове машинного кода на Java?

Я вызываю встроенную функцию в своей основной функции, и она находится внутри цикла while.

public static void main (String[] args) throws Throwable {

        testDLL test = new testDLL();
        String ar[];
        while (true){
            System.out.println("Memory before garbage collection: " + Runtime.getRuntime().freeMemory());           
            ar = test.GetSomething("###");      
            test.finalize();
            System.gc();
            Thread.sleep(5000);
            System.out.println("Memory after garbage collection: " + Runtime.getRuntime().freeMemory());
            System.out.println();
        }
}

вывод следующей программы: (работает около 1 минуты)

Memory before garbage collection: 1915288
Memory after garbage collection: 1915136

Memory before garbage collection: 1915136
Memory after garbage collection: 1914984

Memory before garbage collection: 1914984
Memory after garbage collection: 1916624

Memory before garbage collection: 1916624
Memory after garbage collection: 1916472

Memory before garbage collection: 1916472
Memory after garbage collection: 1916320

Memory before garbage collection: 1916320
Memory after garbage collection: 1916168

Memory before garbage collection: 1916168
Memory after garbage collection: 1916624

Memory before garbage collection: 1916624
Memory after garbage collection: 1916472

Я думаю, это не утечка памяти. Но когда я открываю диспетчер задач Windows, размер процесса javaw.exe продолжает увеличиваться (100 КБ на каждой итерации). Хотите знать, утечка ли это памяти или мне просто игнорировать ее? ИЛИ Означает ли это, что во встроенной функции есть утечка памяти?

К вашему сведению, я дважды проверил свою встроенную функцию на наличие утечек памяти!

Спасибо!

РЕДАКТИРОВАТЬ:

Собственная функция:

JNIEXPORT jobjectArray JNICALL Java_testDLL_GetSomething
(JNIEnv * env, jobject jobj, jstring approvedJString){

    const int num = 100;

    jboolean * isCopy;
    jobjectArray serialNumArrJobj;
    const char* approved = env->GetStringUTFChars(approvedJString, isCopy);
    string serialNumArr[num];

    //*
    *   Long lengthy code here
    *   Populates the string array "serialNumArr"
    *//

    // ========

    env->ReleaseStringUTFChars(approvedJString, approved);
    env->DeleteLocalRef(approvedJString);
    env->DeleteLocalRef(jobj);

    ////////////

    int i, sizeOfArr = 0;

    for( i = 0; i < num; i++) {
        if (serialNumArr[i].empty())
            break;
        else
            sizeOfArr++;
    }

    serialNumArrJobj = (jobjectArray)env->NewObjectArray(sizeOfArr,
         env->FindClass("java/lang/String"),
         env->NewStringUTF(""));


    for( i = 0; i < sizeOfArr; i++) {
        env->SetObjectArrayElement(serialNumArrJobj,
            i,
            env->NewStringUTF(serialNumArr[i].c_str()));
    }

    return serialNumArrJobj;
}
9
задан HashimR 23 November 2011 в 09:09
поделиться