1

这个问题适用于 android 或 java 。假设我有一个类的实例(甚至是一个线程)。

我希望为了避免忘记处置/关闭实例(并避免任何可能的内存泄漏),如果没有更多对该实例的引用,它将自动调用特定方法,自行处置/关闭(如果是线程,它可能会自行中断)。

有可能强制执行这样的事情吗?如果需要,我不介意这种事情只会在 GC 期间发生。

4

3 回答 3

3

如果没有更多对该实例的引用,它将自动调用特定方法,自行处理/关闭(如果是线程,它可能会自行中断)

finalize()执行您在此处描述的操作。你很少看到它被使用,并且在使用它时有一些陷阱。由于您无法控制垃圾收集,因此您无法确定何时会运行 finalize,如果有的话!从api:

然而,finalize 的通常目的是在对象被不可撤销地丢弃之前执行清理操作。例如,代表输入/输出连接的对象的 finalize 方法可能会执行显式 I/O 事务以在对象被永久丢弃之前中断连接。

你不能强制垃圾收集。您只能使用System.gc()建议 JVM 这样做,但不能保证它会完成。

于 2012-05-22T14:44:11.017 回答
1

我知道这已经很晚了,但我希望有一天它会对某人有所帮助。

您可以使用我正在开发的名为gcRadar的库来接收此类事件。它在对象被孤立时和对象的实际垃圾回收之后提供事件。

欢迎对图书馆提出任何改进建议。

于 2013-12-13T05:34:00.333 回答
0

无法访问 VM 持有的引用。正如 Zavior 所建议的那样,确定一个对象或对象“岛”不可访问的唯一方法是使用该finalize方法。

请注意,您只会在 GC 运行期间收到通知。因此,它并不能真正帮助关闭/处置仍被引用但应该关闭的资源。如果您也想这样做并且不想使用诸如 之类的结构try/catch/finally,您应该为资源编写一个管理器类。

对于任何可能的情况,包括经理课程,您都不会获得一种“防弹”方式来整合您的资源。小心是最好的解决方案恕我直言。

编辑:

我发现这个线程可能有用。

于 2012-05-22T14:59:50.947 回答