网站地图

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

时间:2014-03-06    来源:武汉北大青鸟武广校区
【导读】:在做网络监控系统的性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是解决了,但是根本原因尚不明确,拿出来大家讨论下,看看能不能完美解决长...

在做网络监控系统的性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是解决了,但是根本原因尚不明确,拿出来大家讨论下,看看能不能完美解决长期以来,在应用软件开发领域中,程序员在不断的Coding,不断的重复劳动;软件企业在不停的寻找新的项目,满足新的应用需求,同时不停的进行着人员流动。

这个问题奇怪的地方在于是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的msimg32.dll,Java进程内存会一直增长。

 

3.如果加载附件中test2的dll(需要安装C++运行环境vcredist_x86),Java进程内存正常,不会一直增长。

DLL说明:

dll的工程源码在附件中,test1和test2的区别只在于编译选项,如附件:test1选择的是“使用标准Windows库”或“在静态库中使用MFC”,test2选择的是“在共享DLL中使用MFC”

此dll工程的特点在于使用了jni,并引入了mfc头文件【#include 】,如果不引入mfc头文件则不会引起内存泄漏

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



免责声明:本文仅代表作者个人观点,与北大青鸟武广校区无关。其原创性及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。若有版权问题请在30个工作日内联系我们,我们自行删除。

java课程介绍 软件介绍 网络营销

北大青鸟开班信息

2014首届就业精英班8-15火爆 报名从速

关闭