2011-11-28 60 views
0

我已經用JNI寫了一個Hello,world程序。 Java使用字符串調用c程序,c程序打印該字符串。這裏是java程序JNI內存泄漏

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

我無法專門回答你的問題。然而,我對JNI的經驗是它在內部做了很多可能會混淆valgrind的東西。如果內存丟失的地方在JNI內部,那麼無論如何你都無法做到這一點。然而,這仍然是一個諺語中的痛苦,因爲爲了讓你清理乾淨而需要的不同壓制數量可能會很大(數百)。

祝你好運。