【发布时间】:2010-05-16 12:54:17
【问题描述】:
在大学里,我们收到了以下代码示例,并被告知运行此代码时存在内存泄漏。该示例应该证明这是垃圾收集器无法工作的情况。
就我的面向对象编程而言,唯一能够造成内存泄漏的代码线是
items=Arrays.copyOf(items,2 * size+1);
documentation 表示元素被复制。这是否意味着引用被复制(因此堆上的另一个条目被创建)或对象本身被复制?据我所知, Object 并因此 Object[] 被实现为引用类型。因此,为“项目”分配一个新值将允许垃圾收集器发现旧的“项目”不再被引用,因此可以被收集。
在我看来,这个代码示例不会产生内存泄漏。有人能证明我错了吗? =)
import java.util.Arrays;
public class Foo
{
private Object[] items;
private int size=0;
private static final int ISIZE=10;
public Foo()
{
items= new Object[ISIZE];
}
public void push(final Object o){
checkSize();
items[size++]=o;
}
public Object pop(){
if (size==0)
throw new ///...
return items[--size];
}
private void checkSize(){
if (items.length==size){
items=Arrays.copyOf(items,2 * size+1);
}
}
}
【问题讨论】:
-
你问的问题是正确的:代码是否真的泄漏内存?
-
只要 Foo 实例没有被垃圾回收,你只是浪费内存。如果 Foo 实例的寿命很长,则它接近于“真正的”内存泄漏。但无论是否真的泄漏,代码都是糟糕的并且浪费了不必要的内存。
-
@Petar:对糟糕的代码表示赞同,这些都是你必须经历的一些奇怪的扭曲才能做出无法访问的引用。这个例子太人为了,似乎没有什么指导意义。
-
这是 Stack 的新实现吗?代码类似于我的教授用于重新实现数据结构的示例。
标签: java memory-leaks garbage-collection