【发布时间】:2014-09-16 13:54:54
【问题描述】:
我发现多个帖子说明什么时候不应该使用 finalize() 并且一般不应该使用它,因为没有人保证对象会在应用程序的生命周期内被垃圾收集(除非你真的需要整个应用程序生命周期中的对象,这是我书中的内存泄漏)。但是假设我有一个 Java 类,它通过 JNI 在本机空间中初始化某些东西(进行内存分配和初始化)。就我而言,有两种方法可以实现:
1、在类中实现init()和deinit()方法,进行原生初始化和反初始化。这有一个缺点,我必须处理对象生命周期并且不能将其留给垃圾收集器(这不是很像 Java)。
2. 在构造函数中进行初始化,在 finalize() 方法中进行反初始化。这基本上使对象能够像任何其他 Java 类一样自动进行垃圾收集。
我要问的是 - 我有理由不选择 2 号吗?
谢谢,
内德
【问题讨论】:
-
所有相同的原因:特别是,不能保证何时调用它。通常,手动管理本机对象是一种惯例,
try-with-resources 使某些用途更容易。 -
使用 finalize 来确保在 JNI 代码中释放内存是 finalize 的常见用法,并且完全没问题。我会同时使用这两种方式。
-
为什么这被否决了?我认为这个问题是完全合法的......
-
@NESPowerGlove:如果我严格使用 finalize() 来释放内存,如果大量内存分配在本机空间而不是 Java 空间中,是否会调用 GC?是否保证定期调用 GC,因为我的大部分内存分配将在本机空间中完成?
标签: java android garbage-collection