[原创]Java的内存泄漏_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3322 | 回复: 1   主题: [原创]Java的内存泄漏        下一篇 
chong.zhang
注册用户
等级:上尉
经验:627
发帖:25
精华:0
注册:1970-1-1
状态:离线
发送短消息息给chong.zhang 加好友    发送短消息息给chong.zhang 发消息
发表于: IP:您无权察看 2014-5-13 10:08:28 | [全部帖] [楼主帖] 楼主

在C/C++中,变量(或对象)的生命周期可以由程序员通过new/malloc和delete/free自行控制,若发生内存泄漏,一般认为是程序员代码编写有漏洞,而在java中内存由系统管理,但并不表示java就不会发生内存泄漏,只是表现的形式略有不同罢了。

java中内存泄漏的原因为:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。

举个经典的例子

Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();
      v.add(o);
      o = null;
}


代码中对象o已经置null了,但依然无法被gc回收,因为变量v引用这些对象。除非将o移出v或者将v置null。

可能产生内存泄漏的几个场景
1.静态/全局集合类
像HashMap、Vector等集合类的使用容易出现内存泄露,这些静态/全局的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,最好的做法是将不需要的对象移出集合类,这里也要注意移出失败的情况,比如集合里面的对象属性被修改了。

2.各种对象池
对象池的使用可以提高系统的运行效率,因而广泛使用在java程序中,一般对象池都有申请对象和释放对象两个操作,而往往容易遗忘是就是申请了对象,却没有及时的释放,导致对象被长期占有而引起内存泄漏。

3.单例模式
单例模式的初始化之后,对象是以静态变量的形式存在,如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露。

还有哪些情况可能导致内存泄漏,我先抛砖引玉,大家可以多多跟帖,互相学习。




赞(0)    操作        顶端 
koei
版主
等级:大校
经验:4180
发帖:7
精华:0
注册:2011-7-21
状态:离线
发送短消息息给koei 加好友    发送短消息息给koei 发消息
发表于: IP:您无权察看 2014-5-14 21:03:47 | [全部帖] [楼主帖] 2  楼

还有JNI调用中,是比较容易导致JVM内存泄漏的,不过可能更容易归为C/C++的泄漏,而不是Java的泄漏 :-)



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论