我用JNI编写了一个Hello,world程序。 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泄漏内存有什么问题吗?我在Ubuntu 11.10 64位机器上使用过JDK6。
答案 0 :(得分:0)
我不能具体回答你的问题。但是,我对JNI的经验是,它在内部做了很多事情,可能会混淆valgrind。无论如何,如果内存丢失的点在JNI内部,那么你就无法做很多事情。然而,它仍然是众所周知的痛苦,因为为你提供干净运行所需的不同抑制数量可能是巨大的(数百)。
祝你好运。