Java中本地对象的内存管理

4
如果我在类中有一个方法,在该方法中创建了一个对象,那么一旦该方法结束,该对象是否会被销毁并释放其分配的内存?
例如:-
public void drawFigure(){

    Paint paint = new Paint();
    paint.setSomeProperty();

    canvas.drawLine(startPoint, finishPoint, paint);

}

那么在方法drawFigure完成后,paint对象会被销毁吗? 这与paint = null相同,但我不需要将其设置为null, 因为它是一个本地对象。我的理解正确吗?

所以,在drawFigure方法完成后,paint对象会被自动销毁,就像使用paint = null一样。但由于它是一个本地对象,你不需要显式地将其设置为null。

6个回答

6

不能保证对象在方法调用完成后立即进行垃圾回收,但对象将变为GC的可回收对象,在下一次GC运行时可能会被收集并释放内存。

编辑:

是的,您是正确的。您不需要将其设置为null。本地变量将在堆栈上创建,并且堆栈将在方法完成后被移除。因此,paint将从内存中消失,并且new Paint()对象将位于堆上而没有任何引用,这使得上述对象成为GC的可回收对象。

请参阅斯坦福教授的YouTube视频


4

这取决于您是要使用new创建一个对象还是创建一个引用。

public AnObjectType GimmeAnObject(){
    AnObjectType object = new AnObjectType ();
    return object;
}

这将销毁引用object,但所分配的内存从函数中返回,只有在调用点未将返回值分配给另一个引用时,才会被释放(标记为可进行垃圾回收)。

编辑:在您的示例中,paint引用将被销毁。如果drawLine方法不保留对paint的引用(不太可能),则当paint被销毁时,对象本身将有资格进行垃圾回收。

因此,这就像在函数的最后一行调用paint = null一样。


如果提到canvas通过drawLine()调用(或其下面的另一个对象)可以保留对paint实例的引用,则加1分。 - Frank Pavageau

1
只要对象的引用不逃逸出方法(即您不返回对象或返回引用该对象的对象),内存释放的时间由垃圾收集器决定,但被引用的对象将可供收集。

1
你是否正在返回对该创建对象的引用?如果是这样,那么在释放所有对该对象的引用后,它将成为垃圾收集器关注的主题。如果不是,则可能会在您退出该函数后立即成为GC的关注点。尽管如此,GC并不会立即清除此对象,并且您无法控制此过程。您永远不知道GC何时会销毁这样的对象。这是虚拟机问题,需要释放这些资源。

不,我没有返回对象。我只是在方法内部使用它。 - Ankit
因此,由于不应该有对该对象的引用,GC可以在下一次迭代中释放内存。但是,正如我所说,这是VM处理内存管理的情况。 - bunny1985

0

本地引用变量paint将超出作用域,然后内存中的对象没有对它的引用(它有资格进行GC),因此这个内存将在下一个GC运行周期中被GC收集。


0
是的,因为局部变量存储在堆栈上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接