如何删除特定对象?

sap*_*Pro 1 java garbage-collection object garbage

如何在垃圾收集器收集之前手动删除特定对象?例如,我想删除requestToken对象.我怎样才能做到这一点 ?

Ste*_*n C 8

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

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

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

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


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

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

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