By zhaoch
在做网络监控系统的性能测试时,出现了内存泄露的问题,困扰了很久,现在终于算是解决了,但是根本原因尚不明确,拿出来大家讨论下,看看能不能完美解决~
这个问题奇怪的地方在于是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的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也没用),不知道大家有什么想法吗?欢迎大家讨论~
- 大小: 22.5 KB
分享到:
相关推荐
### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...
- **内存管理与资源释放**:虽然示例代码未明确展示,但在实际应用中,开发者应关注内存管理和资源释放,确保快照句柄等资源在使用完毕后被适当释放,避免内存泄漏或资源浪费。 通过以上分析,我们不仅理解了如何...
5. **内存管理**:JNA 提供了内存管理机制,自动处理本地分配和释放内存,避免了内存泄漏问题。 6. **结构体和联合体支持**:JNA 支持Java类映射到C语言的结构体和联合体,使得复杂数据结构的传递变得简单。 7. **...
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"来禁用休眠文件以节省内存。 总的来说,有效管理...
5. **关闭资源**:记得在完成所有操作后关闭连接和其他资源,以避免内存泄漏和资源浪费。 在Windows环境中,`sqlitedll`库文件是用于本地调用SQLite函数的,通常不需要直接在Java程序中处理,除非你打算使用特定的...
可以看到本地及远程服务器上的Java进程,并进行连接。你可以选择要监控的应用,获取其JVM配置信息,包括JVM参数、类路径、模块系统等。 3. **性能监视** - **内存监控**:实时显示堆内存、非堆内存、eden区、...
同时,还需要将Jacob的动态链接库(dll文件)放到系统路径下的bin目录,以便Java能够找到并加载它。 2. **初始化COM**:在Java代码中,你需要先进行COM初始化,通常使用` Jacob.AutoReleasePool`来管理COM对象的...
- 释放资源非常重要,特别是本地分配的内存,避免内存泄漏。 6. **应用实例**: - 图形处理:JNI可以用于调用图形库,如OpenGL,提升游戏或图像应用的性能。 - 加密解密:使用C/C++实现加密算法,通过JNI调用,...
同时,根据你的操作系统,还需要确保对应的动态链接库文件(如libsigar-x86-linux.so、sigar-amd64-winnt.dll等)被正确加载。这通常涉及到设置系统属性`java.library.path`或者使用JNA的LibraryLoader机制。 总的...
在IntelliJ IDEA中安装JProfiler插件,开发者可以方便地在IDE内启动或附加到已运行的Java进程进行分析,无需离开开发环境。通过插件,用户可以直接触发JProfiler的各项分析功能,简化了性能调优的工作流程。 **总结...
8. **资源释放**:使用完Word对象后,务必正确地关闭和释放资源,防止内存泄漏。 9. **SWT布局管理**:为了在SWT界面中合理展示Word控件,需要理解并运用SWT的布局管理器,如`FillLayout`、`GridLayout`等。 通过...
6. **释放资源**:最后,确保关闭所有打开的Word文档和终止Word进程,避免资源泄漏。 在实际开发中,为了提高效率和可维护性,可以将以上步骤封装成函数或者类,以便重复使用。此外,需要注意的是,由于Jacob依赖于...
Keywords.h通常包含一些预定义的宏,而DllMain函数在Windows DLL加载时会被调用,但在Android中,可能指的是初始化时的一些特定操作。 **Android常用类分析** - **RefBase、sp和wp**:RefBase是Android中用于引用...