论坛首页 Java版 企业应用

疑惑:java的内存泄漏

浏览 2523 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-09-26
我知道即使java有GC,如果代码写得太烂也会造成内存泄漏。但是我一向认为java的内存泄漏只有在一些极端情况下会出现:static 的集合类或者数组或者诸如此类的情况,或者是在类似spring的框架下的singlton的一些成员集合。
还有一种是资源泄漏,比如数据库connection没有关闭,严格来说不属于内存泄漏。

在函数体内分配的对象,出函数后不被使用总会被GC吧?有必要马上把不用的变量赋值为null么?这样对GC没有任何帮助啊。


今天偶尔看了一眼csdn首页上关于java内存泄漏的帖子,在http://java.csdn.net/page/3c63a04c-b076-423f-af69-173d33df0a67,越看越疑惑啊

   
时间:2007-09-26
没必要把局部变量不用就赋null,GC什么时候回收由JVM的策略实现,有时候我们管理一个类会有destory()方法,去释放创建的类成员对象,这样足够了
   
0 请登录后投票
时间:2007-09-26
你给的链接里有几篇文章,你是对哪篇文章的哪段内容疑惑啊?
   
0 请登录后投票
时间:2007-09-26
movingboy 写道
你给的链接里有几篇文章,你是对哪篇文章的哪段内容疑惑啊?

http://blog.csdn.net/tang08/archive/2007/05/13/1607410.aspx
引用
3.2.1 示例1
在这个例子中,循环申请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;
}//

此时,所有的Object 对象都没有被释放,因为变量v 引用这些对象。实际上无用,而还被引用的对象,GC 就无能为力了(事实上GC 认为它还有用),这一点是导致内存泄漏最重要的原因。

o = null有意义么?调用v.remove,或者v.clear才有点意义吧。不过这个的前提也是因为v没有被释放吧。

http://blog.csdn.net/JefferyLee/archive/2007/09/16/1787431.aspx
引用
1.最基本的建议是尽早释放无用对象的引用。如:
...
A a = new A();
//应用a对象
a = null; //当使用对象a之后主动将其设置为空

a = null 有意义么?

另,再想找些问题的时候,csdn无法连接了。
立此存照
2007-9-26 17:15
   
0 请登录后投票
时间:2007-09-26
1, o=null 没意义
而且就代码看来,v是局部变量,也会被回收
2, 没意义,但至少下面不会再引用到new A()
如果a=null 后接 '}' ,就完全没有意义

以上个人观点
   
0 请登录后投票
时间:2007-09-26
是哦,这样的写法是没什么意义~~~
   
0 请登录后投票
时间:2007-09-26
oxromantic 写道
1, o=null 没意义
而且就代码看来,v是局部变量,也会被回收
2, 没意义,但至少下面不会再引用到new A()
如果a=null 后接 '}' ,就完全没有意义

以上个人观点


同意。
例子中的Vector必须是类变量或实例变量(且被长期保持)
   
0 请登录后投票
时间:2007-09-26
有一个点大概可以减轻一些疑惑: GC 可能会发生在 JVM 运行期间的任何时候, 包括你的某个方法正在执行中间的某个时刻.

当然这对短小的方法来说其实没有多大差别, 但是对一些应用服务器, 框架性的代码, 有些方法是要长时间循环执行的, 甚至是跟整个应用有相同的生命周期. 在这种方法里, 尽早的null一些局部变量, 也是有防止内存泄漏的潜力的.
   
0 请登录后投票
时间:2007-09-27
如果你能保证方法代码行数小于30行(gigix说是5行,但是好像说的是ruby代码,那我们对java代码就放宽5倍),那大概不会有必要去用null清空。
   
0 请登录后投票
时间:2007-09-27
我想起了前两天的一道面试题。
public class Node
{
	private Node next;
	private String name;
	public Node(Strnig name)
	{
		this.name = name;
	}
	public setNext(Node node)
	{
		this.next = node;
	}
	public String toString()
	{
		return this.name;
	}
}

public class Test
{
	public void execute()
	{
		Node a = new Node("1");
		Node b = new Node("2");
		Node c = new Node("3");
		
		a.setNext(b);
		b.setNext(a);
		c.setNext(c);
		a = c;
		b = c;
		otherMethod();
	}
	
	public void otherMethod()
	{
		//...
	}
}

问:执行otherMethod()时,哪几个节点不会/没有可能性被回收。
---------------------------------------------------<hr>
循环引用现代GC机制一般能处理,那似乎可以忽略?
后面又重新定义了a,b的引用,看似之前定义的"1","2"失去了引用,就可能被回收?
但前后的引用实质上在同一语句块中,所以忽略后面定义的a = c; b = c; ?
执行otherMethod时,还在execute的方法体内,那么无论引用如何变化,1,2,3都不会被回收?
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐