Утечка памяти JNI - PullRequest
       1

Утечка памяти JNI

0 голосов
/ 28 ноября 2011

Я написал программу Hello, world с JNI.Java вызывает программу c строкой, программа c выводит эту строку.Вот java-программа

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class JNISample {
    public native void leakMem(String str);

    static {
        System.loadLibrary("sample");
    }


    public static void main(String args[]) throws IOException {
        JNISample sample = new JNISample();
        sample.leakMem("Hello world!");
    }
}

Соответствующая c-программа

#include <stdlib.h>
#include <jni.h>
#include "JNISample.h"

JNIEXPORT void JNICALL Java_JNISample_leakMem(JNIEnv *env, jobject jobj, jstring givenStr) {
    const char *javaStr = env->GetStringUTFChars (givenStr, 0);

    printf("Received String: %s\n", javaStr);

    env->ReleaseStringUTFChars (givenStr, javaStr);
}

Когда я выполнил эту программу с помощью valgrind, с помощью следующей команды

valgrind --trace-children=yes --show-reachable=yes --leak-check=full java -Djava.library.path=. JNISample 10 2> log

я определенно наблюдалпотерянные байты в журнале, вот сумма памяти valgrind

LEAK SUMMARY:
==5385==    definitely lost: 5,246 bytes in 36 blocks
==5385==    indirectly lost: 5,072 bytes in 23 blocks
==5385==      possibly lost: 154,317 bytes in 131 blocks
==5385==    still reachable: 6,164,933 bytes in 831 blocks
==5385==         suppressed: 0 bytes in 0 blocks

Почему в такой маленькой программе определенно потеряны байты без выделения памяти?Есть ли проблемы с использованием JNI или утечки памяти JNI?Я использовал JDK6 на 64-битной машине Ubuntu 11.10.

1 Ответ

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

Я не могу ответить на ваш вопрос конкретно. Тем не менее, мой опыт работы с JNI заключается в том, что он делает много вещей внутри, что может сбить с толку valgrind. Если точка, в которой теряется память, находится внутри JNI, вы бы ничего не могли с этим поделать. Тем не менее, это все еще боль в пословице, так как количество различных подавлений, необходимых, чтобы дать вам чистую пробежку, вероятно, будет огромным (сотни).

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...