Java 加载 dll 导致 Java 进程内存泄露问题解决
在做网络监控系统的性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是
解决了。
这个问题奇怪的地方在于是 Java 进程内存泄露,而不是平常的 JVM 内存泄露,用
Jprofile 等工具也无法看出问题所在。
测试代码如下:
System.loadLibrary("test1");
int threadPoolSize = 400;
ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);
for (int i = 0; i < 400; i++) {
service.submit(new Runnable() {
public void run() {
while (true) {
try {
Thread t = new Thread();
t.start();
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
说明:此段代码所做的工作就是加载一个 dll,然后不断的启动线程(线程什么也不做,
直接终止)。
注:线程池只是为了加速问题复现,无其他用处。
现象:
1.如果不加载 dll,只不断的启动线程,Java 进程内存正常,不会一直增长。
2.如果加载附件中 test1 的 dll,Java 进程内存会一直增长。
3.如果加载附件中 test2 的 dll(需要安装 C++运行环境 vcredist_x86),Java 进程内存正
常,不会一直增长。
DLL 说明:
dll 的工程源码在附件中,test1 和 test2 的区别只在于编译选项,如附件:test1 选择的
“
是 使用标准 Windows
” “
库 或 在静态库中使用 MFC”,test2
“
选择的是 在共享 DLL 中使用
MFC”
此 dll 工程的特点在于使用了 jni,并引入了 mfc 头文件【#include 】,如果不引入 mfc