мы вызываем метод 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 МБ в каждом потоке.