cyj86

Java加载dll,导致Java进程内存泄露

By zhaoch

在做网络监控系统性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是解决了,但是根本原因尚不明确,拿出来大家讨论下,看看能不能完美解决~

这个问题奇怪的地方在于是Java进程内存泄露,而不是平常的JVM内存泄露,用Jprofile等工具也无法看出问题所在。

测试代码如下:

 1 System.loadLibrary("test1");
 2 
 3         int threadPoolSize = 400;
 4         ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);
 5 
 6         for (int i = 0; i < 400; i++) {
 7             service.submit(new Runnable() {
 8                 public void run() {
 9                     while (true) {
10                         try {
11                             Thread t = new Thread();
12                             t.start();
13                             Thread.sleep(100);
14                         } catch (Exception e) {
15                             e.printStackTrace();
16                         }
17                     }
18                 }
19             });
20         }

说明:此段代码所做的工作就是加载一个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 <afxwin.h>】,如果不引入mfc头文件则不会引起内存泄漏


目前此问题的根本原因尚不明确,怀疑是jdk的bug(使用最新的jdk1.6.0.23也没用),不知道大家有什么想法吗?欢迎大家讨论~

/Files/cyj86/dll工程.rar
/Files/cyj86/test1.rar
/Files/cyj86/test2.rar
/Files/cyj86/vcredist_x86.rar
/Files/cyj86/opt.png

posted on 2011-06-13 11:45 薛定谔的猫 阅读(1781) 评论(4)  编辑  收藏 所属分类: 典型、疑难问题

Feedback

# re: Java加载dll,导致Java进程内存泄露 2011-06-13 18:40 枫子

此段代码所做的工作就是加载一个dllhttp://www.imfeng.com/  回复  更多评论   

# re: Java加载dll,导致Java进程内存泄露 2011-06-15 13:29 懒人助手

加载一个dll文章,也看看http://www.lrtool.net  回复  更多评论   

# re: Java加载dll,导致Java进程内存泄露 2011-06-16 14:49 writegull

学习了。不错  回复  更多评论   

# re: Java加载dll,导致Java进程内存泄露 2011-06-30 22:41 FlyingFly

在MSDN看到一篇讨论,看上去就跟你的问题类似。

可能这个问题并不是java 通过jni loadlibrary的问题, 你可以试试通过C#Code load 这个dll 然后 开多个thread 是不是也有类似的问题。

Memory leaks creating threads after loading LoadLibrary

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/3bb5f18d-5484-4240-9b55-18dd50d02859/  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: