java 调用dll内存泄露_解决Java加载dll导致Java进程内存泄露

在进行网络监控系统性能测试时遇到Java进程内存泄露问题,区别于常规的JVM内存泄露,无法通过常规工具定位。通过测试发现,加载特定dll(msimg32.dll)会导致内存持续增长,而加载其他版本dll则不会。问题可能与JNI及MFC库的使用有关,目前原因不明,可能是JDK的bug。欢迎讨论。
摘要由CSDN通过智能技术生成

解决Java加载dll导致Java进程内存泄露在做网络监控系统的性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是解决了,但是根本原因尚不明确,拿出来大家讨论下,看看能不能完美解决~  这个问题奇怪的地方在于是Java进程内存泄露,而不是平常的JVM内存泄露,用Jprofile等工具也无法看出问题所在。  测试代码如下:System.loadLibrary("test1");int threadPoolSize =

解决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的

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也没用),不知道大家有什么想法吗?欢迎大家讨论~

基于广大用户反馈,论坛附件下载策略全新上线,下载券全站通用,请放心下载 。

收藏0

打赏0

点赞0

分享至:

评论

文明留言,专业沟通

4d2a07ae94f6972507ccebf791e8f739.png

请先 登录,再评论!

全部评论

相关推荐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值