如何删除特定对象?

时间:2014-04-12 02:24:50

标签: java object garbage-collection garbage

如何在垃圾收集器收集特定对象之前手动删除它? 例如,我想删除requestToken对象。我怎么能这样做?

2 个答案:

答案 0 :(得分:8)

简短的回答是,你不能,而你不需要。当需要时,GC将回收内存......并且没有理由干扰它。

我认为需要更快删除对象的唯一情况是,当对象包含需要删除的信息时......出于信息安全原因。 (经典示例是当您处理用户提供的密码时,您担心它可能通过代码转储或其他东西泄漏)在这种情况下,您需要在对象上实现一个方法,通过覆盖来擦除对象的字段他们。但这需要精心设计;例如确保您找到并删除所有信息痕迹。

有时还需要“帮助”GC一点,以避免潜在的内存泄漏。一个典型的例子是ArrayList类,它使用Java数组来表示列表内容。该数组通常大于列表的逻辑大小,并且数组的元素可以包含指向已从列表中删除的对象的指针。 ArrayList类通过为这些元素分配null来解决此问题。

请注意,这些示例都不涉及实际删除对象。在这两种情况下,问题/问题都以另一种方式解决。


值得注意的是,调用System.gc()通常是一个坏主意:

  • 不保证可以做任何事情。
  • 在大多数情况下,它不会做任何不会发生的事情。
  • 在大多数情况下,效率低下。 JVM比应用程序代码处于更好的位置,以了解运行GC的符合人体工程学的最有效时间。 (阅读this以获得人体工程学的第一原理解释。)

建议在生产代码中运行GC的唯一情况是,当您尝试管理GC暂停时,并且知道在特定时间点可以接受暂停。 (例如,当您在交互式游戏中更改关卡时...)

答案 1 :(得分:3)

您无法删除对象,您可以尝试在下一个周期中使其符合垃圾回收的条件。您可以做的最好的事情是,将对象设置为null并尝试调用System.gc();

注意:System.gc()调用只会请求JVM运行垃圾收集器,但它不能强制它。

相关问题