Как узнать, является ли это утечкой памяти или нет при вызове нативного кода в Java? - PullRequest
9 голосов
/ 23 ноября 2011

Я вызываю встроенную функцию в моем main, и она находится внутри цикла 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;
}

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Ваши ожидания неуместны. Вы не можете ожидать, что System.gc() будет больше, чем подсказка сборщику мусора, и сам вызов finalize() совершенно неверен.

0 голосов
/ 29 января 2012

Я думаю, вам нужно написать модульные тесты, которые вызывают нативный код напрямую, как Java-код, например, тесты Mock.

...