background image

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