【问题标题】:JNI Memory LeakJNI 内存泄漏
【发布时间】:2011-11-28 07:23:35
【问题描述】:

我用 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。

【问题讨论】:

  • valgrind可以运行java程序吗??谢谢!!

标签: java-native-interface


【解决方案1】:

我无法具体回答您的问题。然而,我对 JNI 的经验是,它在内部做了很多可能会混淆 valgrind 的事情。如果内存丢失的点在 JNI 内部,那么无论如何您都无能为力。但是,众所周知,这仍然是一种痛苦,因为要让您顺利运行所需的不同压制的数量可能是巨大的(数百个)。

祝你好运。

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2013-11-01
    • 2014-07-30
    相关资源
    最近更新 更多