我该如何删除特定对象?
我该如何删除特定对象?
这个问题已经在这里有了答案:
我如何在垃圾收集器收集特定对象之前手动删除特定对象?例如,我想删除requestToken
对象。我该怎么做?
admin 更改状态以发布 2023年5月22日
简短的回答是你不能,也不需要这么做。当垃圾回收器需要时,它会回收内存……没有理由去干扰它。
我只能想到一个需要更早删除对象的情况,那就是当对象包含需要被清除的信息时……出于信息安全的考虑。(经典的例子是当你正在处理用户提供的密码时,你担心它可能通过代码转储或其他方式泄露。)在这种情况下,你需要在对象上实现一个方法,覆盖它的字段以擦除对象的信息。但这需要仔细的设计,例如确保你找到并擦除所有信息的痕迹。
有时候,帮助垃圾回收器以避免潜在的内存泄漏也是必要的。一个经典的例子是ArrayList
类,它使用Java数组来表示列表内容。这个数组通常比列表的逻辑大小还要大,而数组的元素可能包含指向已从列表中移除的对象的指针。ArrayList
类通过将这些元素赋值为null
来解决这个问题。
注意,这两个例子都不涉及实际删除对象。在这两种情况下,问题/问题都是以另一种方式得到解决的。
另外值得注意的是,通常不应该调用System.gc()
:
- 不能保证它会做任何事情。
- 在大多数情况下,它不会做任何在其他情况下不会发生的事情。
- 在大多数情况下,它是低效的。JVM比应用程序更能知道在何时对运行GC进行优化性调整(阅读这篇文章以深入探讨调整GC优化的原理)。
只有当你试图管理GC暂停并且你知道在特定时间点接受暂停时,才建议在生产代码中运行GC。(例如,在交互式游戏中更换级别时……)