4

如果我在类中有一个方法,并且我在该方法中创建一个对象,那么该对象是否会被销毁,并且在方法完成后会释放分配给它的内存吗?

例如。-

public void drawFigure(){

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

    canvas.drawLine(startPoint, finishPoint, paint);

}

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

4

6 回答 6

6

不能保证在方法调用完成后立即对对象进行 GC,但对象将成为符合GC 条件的对象,并且在下一次 GC 运行时,它可能会被收集并且内存将是空闲的。

编辑:

是的,你是对的。您无需将其设置为null. 局部变量将在堆栈上创建,堆栈将在方法完成后立即删除。因此,绘画将从内存中消失,new Paint()对象将在没有任何引用的情况下位于堆上,这使得上述对象符合 GC 条件。

请参阅斯坦福教授的这个youtube 视频。

于 2013-01-16T06:31:30.253 回答
4

取决于您的意思是使用创建对象new还是创建引用。

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

这将破坏引用object,但分配的内存将从函数返回,并且只有在返回值未分配给调用站点的另一个引用时才会被释放(标记为符合 GC 条件)。

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

所以是的,就像你调用paint = null函数的最后一行一样。

于 2013-01-16T06:32:45.810 回答
1

只要对对象的引用不转义方法(即您不返回对象或返回引用该对象的对象。)

释放内存的时间取决于垃圾收集器,但引用的对象将可用于收集。

于 2013-01-16T06:31:37.567 回答
1

您是否返回对该创建对象的引用?如果是这样,那么在您释放对该对象的所有引用后,它将成为垃圾收集器感兴趣的主题。如果不是,那么在您退出该功能后,它可能会立即成为 GC 的兴趣点。然而 GC 并没有立即清除这个对象,你无法控制它。你永远不知道 GC 什么时候会销毁这样的对象。释放这些资源是虚拟机问题。

于 2013-01-16T06:37:23.483 回答
0

局部引用变量paint 将超出范围,然后内存中的对象没有对其的引用(它有资格进行GC),因此该内存将在下一个GC 运行周期中由GC 收集。

于 2013-01-16T07:10:14.537 回答
0

是的,先生,因为局部变量存储在堆栈中

于 2018-02-21T21:58:35.683 回答