免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: puppy19761210

收集什么情况下JAVA会造成内存泄露?? [复制链接]

论坛徽章:
0
发表于 2005-10-12 02:01 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

原帖由 "sakulagi" 发表:
/agree

比较新的JVM的gc算法应该是可以识别的。

哦??从一个版本开始的??
core java 以此问题 以此问题 引出了一个特殊的collection 是否无用了。。。。

论坛徽章:
0
发表于 2005-10-12 11:22 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

jdbc 的例子我不认同 垃圾收集和你关不关资源是没有关系。
当你connection 的实例不被引用的时候。 会被垃圾收集。垃圾收集后连接是释放 如果你不关链接的。如果使用连接池的话情况就复杂了。根据不同的实现是出现不同的情况。 那是因为有resultset捣乱。我指的是释放了链接而不去释放resultset
顶多是把连接耗尽。别人无法连接数据库而已。
对于别的资源我认为也是这样的。当然如果资源太大太多的话 不即使关闭的还是会耗尽内存的。其实最简单的会出现不被收集的一种情况就是。不停的往一个集合中插入数据。比如hashmap 然后忘了 取出hashmap的中的引用这样的话集合中的元素不会被收集

论坛徽章:
0
发表于 2005-10-12 11:23 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

抱歉我写的太乱了 抱歉

论坛徽章:
0
发表于 2005-10-12 17:30 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

原帖由 "tong0245" 发表:
不停的往一个集合中插入数据。比如hashmap 然后忘了 取出hashmap的中的引用这样的话集合中的元素不会被收集


???啥意思???

论坛徽章:
0
发表于 2005-10-12 21:41 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
我写的太乱了抱歉  这是我从网上摘抄的 和我的意思一样

论坛徽章:
0
发表于 2005-10-13 10:12 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

我觉得这些都不算真正意义上的内存泄漏。
以前c语言中的内存泄漏是指内存被分配了,但程序无法访问,例如分配内存后直接将指针置空。原先分配的内存既无法回收,又没法访问,所以是内存泄漏。
上面的例子只是分配了,你程序还是可以访问vecotor中的内容,只是你不用而已,所以我觉得是内存浪费,不是泄漏。
说实话,我想不出java如何实现真正的内存泄漏。

论坛徽章:
0
发表于 2005-10-13 10:52 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

我觉得,Java中只要Heap在无限制增长,就是内存泄漏。
所以tong0245的例子是正常的。

http://www-128.ibm.com/developerworks/library/j-leaks/index.html

论坛徽章:
0
发表于 2005-10-13 10:56 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

jdbc的例子是不太对

论坛徽章:
0
发表于 2005-10-13 13:41 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

[quote]原帖由 "tong0245"]下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,..........[/quote 发表:


这并不是 内存泄漏。。。
第一 我仍然有办法从新得到方如其中的object
第二 该 Vector对象 一旦出了 作用范围则引指消失 并不会一直保持引指。换句话说,如果不是在滥用一些全局性的东西,比如静态collection或单例的东西,不太会出现问题。

论坛徽章:
0
发表于 2005-10-13 16:53 |显示全部楼层

收集什么情况下JAVA会造成内存泄露??

说说我的观点 首先 c和java是两种不同的语言。抛开对象不说java是有垃圾收集的。意思是说当一个对象不可达的时候(我认为这就是一个悬空的指针了)
垃圾收集器有义务去收集他。 这个部分不应该是java程序员去考虑的。
垃圾收集的目的再此。所以在理论上来说java不应该也不可能出现你说的c 由于悬空指针所发生的内存泄漏。如果发生了那就是jvm的bug。而不是程序员的问题。当然如果碰到了还是要避免的。
然后再说说我对内存泄漏的观点 从c的观点来看你说的是对的。 但是综合来看,也就是从java和c的观点来看,所谓内存泄漏就是在一种为预料的情况下内存没有得到适当释放 。造成了内存缺失造成不可以预料的后果(其实还是可以预料的哈哈)。是否失悬空指针不是问题的关键。毕竟c和java一个大的区别的 有和没有垃圾收集
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP