我们在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的泄漏。