土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 解决Java加载dll导致Java进程内存泄露

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

发布于:2012-03-18 13:33:18 来自:建筑设计/CAD下载及教程 [复制转发]
解决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也没用),不知道大家有什么想法吗?欢迎大家讨论~
这个家伙什么也没有留下。。。

CAD下载及教程

返回版块

52.08 万条内容 · 658 人订阅

猜你喜欢

阅读下一篇

教你如何使用光盘刻录大师做光盘映像

教你如何使用光盘刻录大师做光盘映像将音乐、数据、影视CD/DVD(也可以为已加密的游戏光盘)制作成为可在虚拟光碟中使用的光盘映像文件。  制作的光盘映像可以被我们的软件还原到空白光盘上,也可以被我们的虚拟驱使用。  加密的游戏光盘制作的映像文件配合我们的虚拟光驱软件可以模拟真实的物理光驱,光盘刻录大师让游戏玩家可以不必使用真实的盘片就可以玩起来。 转播到腾讯微博 转播到腾讯微博

回帖成功

经验值 +10