jni утечка памяти в java потоках на Ubuntu - PullRequest
1 голос
/ 19 февраля 2020

мы вызываем метод jni в java пуле потоков. Метод jni загружает библиотеку so, в которой динамически запрашивает память (new, а затем delete). Обнаружено, что количество утечек памяти на самом деле связано с количеством созданных потоков. утечки памяти каждый раз, независимо от того, закрыли ли мы пул потоков. это говорит о том, что родная память вообще не будет освобождена. что-то не так мы сделали? надеюсь получить вашу помощь.

это 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;
}

запрашивает 20 МБ памяти, и он сшивается, что приводит к утечке 20 МБ в каждом потоке.

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

...