我该如何删除特定对象?

22 浏览
0 Comments

我该如何删除特定对象?

这个问题已经在这里有了答案:

如何在Java中强制进行垃圾回收?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

你不能直接删除一个对象,你只能尝试在下一个循环中让它成为垃圾收集的候选对象。最好的做法是将对象设置为 null,然后尝试调用 System.gc();

注意:System.gc() 方法只是请求 JVM 运行垃圾回收器,但不能强制其执行。

0
0 Comments

简短的回答是你不能,也不需要这么做。当垃圾回收器需要时,它会回收内存……没有理由去干扰它。

我只能想到一个需要更早删除对象的情况,那就是当对象包含需要被清除的信息时……出于信息安全的考虑。(经典的例子是当你正在处理用户提供的密码时,你担心它可能通过代码转储或其他方式泄露。)在这种情况下,你需要在对象上实现一个方法,覆盖它的字段以擦除对象的信息。但这需要仔细的设计,例如确保你找到并擦除所有信息的痕迹。

有时候,帮助垃圾回收器以避免潜在的内存泄漏也是必要的。一个经典的例子是ArrayList类,它使用Java数组来表示列表内容。这个数组通常比列表的逻辑大小还要大,而数组的元素可能包含指向已从列表中移除的对象的指针。ArrayList类通过将这些元素赋值为null来解决这个问题。

注意,这两个例子都不涉及实际删除对象。在这两种情况下,问题/问题都是以另一种方式得到解决的。


另外值得注意的是,通常不应该调用System.gc()

  • 不能保证它会做任何事情。
  • 在大多数情况下,它不会做任何在其他情况下不会发生的事情。
  • 在大多数情况下,它是低效的。JVM比应用程序更能知道在何时对运行GC进行优化性调整(阅读这篇文章以深入探讨调整GC优化的原理)。

只有当你试图管理GC暂停并且你知道在特定时间点接受暂停时,才建议在生产代码中运行GC。(例如,在交互式游戏中更换级别时……)

0