【问题标题】:How can I delete a specific object? [duplicate]如何删除特定对象? [复制]
【发布时间】:2014-04-12 02:24:49
【问题描述】:

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

【问题讨论】:

标签: java object garbage-collection garbage


【解决方案1】:

简短的回答是你不能,而且你不需要。 GC 会在需要时回收内存……而且没有理由干涉。

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

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

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


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

  • 根本不保证做任何事情。
  • 在大多数情况下,它不会做任何本来不会发生的事情。
  • 在大多数情况下,它是低效的。 JVM 比应用程序代码更能了解运行 GC 的符合人体工程学的最有效时间。 (阅读this 了解人体工程学的第一原理解释。)

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

【讨论】:

  • +1 好,彻底的答案。
  • 关于System.gc()的一个小细节:在Android上确实需要在某些情况下调用它来回收用于图像数据等的存储空间。但Android当然不是Java。
  • @HotLicks - 是的。那里正在发生的事情是,Android 平台依靠最终确定来释放与图像相关的本机资源。但这可以说是一个应用程序错误。该应用程序应该调用图像上的 dispose 或 delete 或任何方法。 (就像你应该 close() 文件一样......)
【解决方案2】:

你不能删除一个对象,你可以尝试让它在下一个循环中符合垃圾回收的条件。最好的办法是,将对象设置为null 并尝试调用System.gc();

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

【讨论】:

  • 您没有将对象设置为null,而是将引用设置为null。并且打电话给System.gc() 通常毫无价值。
  • @HotLicks 在 Java 中将对象设置为 null 或将引用设置为 null 有什么歧义?
  • “歧义”是 objectreference 之间有一个非常重要的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2023-03-24
  • 1970-01-01
  • 2018-04-17
  • 2019-10-29
  • 2014-05-19
  • 1970-01-01
相关资源
最近更新 更多