ubuntu上Java线程中的jni内存泄漏

时间:2020-02-19 16:45:31

标签: java memory java-native-interface

我们在Java线程池中调用jni方法。 jni方法加载一个so库,它在其中动态请求内存(新建然后删除)。发现内存泄漏的数量实际上与创建的线程数量有关。每当我们关闭线程池时,内存都会每次泄漏。它表明本机内存根本不会被释放。我们做错了什么吗?希望得到您的帮助。

这是Java代码:

// create a thread pool
ExecutorService getExecutorService = Executors.newFixedThreadPool(20);

// do jobs in threads
for (int i = 0 ; i < jobCount ; i++ ) {
    // do job through threadpool
    // create a TaskWithResult object, in which jni method Generate(...) is called
    TaskWithResult execute = new TaskWithResult(inputDir, outputDir, jsonFilePath);
    // summit
    Future<String> future = getExecutorService.submit((execute));
} 

// shut down threadpool
try {
    getExecutorService.shutdown(); 

    if(!getExecutorService.awaitTermination(60,TimeUnit.SECONDS)){
       getExecutorService.shutdownNow();  
    }
} catch (Throwable e) {
    // TODO Auto-generated catch block
    getExecutorService.shutdownNow();
    e.printStackTrace();
}

这是jni代码:

JNIEXPORT jint JNICALL Java_com_jniso_CppSvr_Generate
(JNIEnv *env, jobject obj, jstring inputDir, jstring outputDir, jstring jsonFilePath)
{
    // test memory leak
    DataTest dt;
    // request a large amount of memory, for instance 20MB, in c++ method Gen()
    dt.Gen();

    return 1;
}

在此处添加c ++代码

void DataTest::Gen()
{
    char *big_data = new char[1024 * 1024 * 20];
    for (int i = 0; i < 1024 * 1024 * 20; ++i) {
        big_data[i] = 0;
    }
    delete[] big_data;
}

请求20mb的内存,它的接缝会导致每个线程20mb的泄漏。

use pmap -x to watch memory. there's ten 20MB still resident in memory after the thread pool is shut down

0 个答案:

没有答案