`
buliedian
  • 浏览: 1223710 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

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

这个问题奇怪的地方在于是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

4
2
分享到:
评论
1 楼 langyu 2011-06-15  
如果你确定是因为load test1 dll有内存泄露,那么后面一段程序就会有影响你判断的嫌疑。单把后面一段程序拉出来运行,因为频繁地创建和销毁线程,GC忙不过来的时候就会有少量内存增长的问题,但不会长时间显现。所以如果你肯定是因为dll的问题,那么单独执行loadLibary,而不要后面的这部分,再来确定下是否真是JNI的问题。

附件在哪儿?

PS:到现在为至,程序执行了近五分钟,内存还在不断地少量增加。我怀疑是你的初衷是想让程序一直运行来测试JNI,但后面这部分线程让问题复杂化了。内存增长仅仅是来自于JNI么?

相关推荐

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    Java_JNI_获得系统进程信息实例.doc

    - **内存管理与资源释放**:虽然示例代码未明确展示,但在实际应用中,开发者应关注内存管理和资源释放,确保快照句柄等资源在使用完毕后被适当释放,避免内存泄漏或资源浪费。 通过以上分析,我们不仅理解了如何...

    Java Native Access JNA-4.5.0

    5. **内存管理**:JNA 提供了内存管理机制,自动处理本地分配和释放内存,避免了内存泄漏问题。 6. **结构体和联合体支持**:JNA 支持Java类映射到C语言的结构体和联合体,使得复杂数据结构的传递变得简单。 7. **...

    javadll.rar_Java编程_Visual_C++_

    7. **Java代码调用**:在Java端,我们声明native方法,并使用`System.loadLibrary()`加载DLL。之后,Java代码就可以像调用普通Java方法一样调用这些native方法。 8. **编译和链接**:使用Visual C++编译C++代码,并...

    释放系统内存独一无二哦

    这类脚本通常包含命令行工具,如"rundll32.exe advapi32.dll, ProcessIdleTasks"或"wmic process call terminate"来结束特定进程,或者使用"powercfg.exe /h off"来禁用休眠文件以节省内存。 总的来说,有效管理...

    SQLite数据库 sqlitedll库文件 sqlite驱动JAR包

    5. **关闭资源**:记得在完成所有操作后关闭连接和其他资源,以避免内存泄漏和资源浪费。 在Windows环境中,`sqlitedll`库文件是用于本地调用SQLite函数的,通常不需要直接在Java程序中处理,除非你打算使用特定的...

    jvm监控工具visualVM

    可以看到本地及远程服务器上的Java进程,并进行连接。你可以选择要监控的应用,获取其JVM配置信息,包括JVM参数、类路径、模块系统等。 3. **性能监视** - **内存监控**:实时显示堆内存、非堆内存、eden区、...

    jni调用c接口完整例子

    - 释放资源非常重要,特别是本地分配的内存,避免内存泄漏。 6. **应用实例**: - 图形处理:JNI可以用于调用图形库,如OpenGL,提升游戏或图像应用的性能。 - 加密解密:使用C/C++实现加密算法,通过JNI调用,...

    sigar包文件.zip

    同时,根据你的操作系统,还需要确保对应的动态链接库文件(如libsigar-x86-linux.so、sigar-amd64-winnt.dll等)被正确加载。这通常涉及到设置系统属性`java.library.path`或者使用JNA的LibraryLoader机制。 总的...

    IDEA工具jprofiler插件(JVM分析利器)

    在IntelliJ IDEA中安装JProfiler插件,开发者可以方便地在IDE内启动或附加到已运行的Java进程进行分析,无需离开开发环境。通过插件,用户可以直接触发JProfiler的各项分析功能,简化了性能调优的工作流程。 **总结...

    SWT 中嵌入Word 控件应用

    8. **资源释放**:使用完Word对象后,务必正确地关闭和释放资源,防止内存泄漏。 9. **SWT布局管理**:为了在SWT界面中合理展示Word控件,需要理解并运用SWT的布局管理器,如`FillLayout`、`GridLayout`等。 通过...

    jacob按目录拆分文档(含dll和jar),代码说明详细

    6. **释放资源**:最后,确保关闭所有打开的Word文档和终止Word进程,避免资源泄漏。 在实际开发中,为了提高效率和可维护性,可以将以上步骤封装成函数或者类,以便重复使用。此外,需要注意的是,由于Jacob依赖于...

    [文档]深入理解Andorid重难点.ppt

    Keywords.h通常包含一些预定义的宏,而DllMain函数在Windows DLL加载时会被调用,但在Android中,可能指的是初始化时的一些特定操作。 **Android常用类分析** - **RefBase、sp和wp**:RefBase是Android中用于引用...

    Jacob实现word转PDF之格式最美转化

    同时,还需要将Jacob的动态链接库(dll文件)放到系统路径下的bin目录,以便Java能够找到并加载它。 2. **初始化COM**:在Java代码中,你需要先进行COM初始化,通常使用` Jacob.AutoReleasePool`来管理COM对象的...

Global site tag (gtag.js) - Google Analytics