【发布时间】:2014-04-12 02:24:49
【问题描述】:
如何在垃圾收集器收集特定对象之前手动删除它?
例如我想删除requestToken 对象。我该怎么做?
【问题讨论】:
-
您没有删除该对象。 GC 将。
标签: java object garbage-collection garbage
如何在垃圾收集器收集特定对象之前手动删除它?
例如我想删除requestToken 对象。我该怎么做?
【问题讨论】:
标签: java object garbage-collection garbage
简短的回答是你不能,而且你不需要。 GC 会在需要时回收内存……而且没有理由干涉。
我能想到需要尽快删除对象的唯一情况是对象包含需要删除的信息...出于信息安全原因。 (典型的例子是当您处理用户提供的密码并且您担心它可能会通过代码转储或其他方式泄漏)在这种情况下,您需要在对象上实现一个方法以通过覆盖擦除对象的字段他们。但这需要精心设计;例如以确保您找到并清除所有信息痕迹。
有时还需要稍微“帮助”GC 以避免潜在的内存泄漏。一个典型的例子是ArrayList 类,它使用Java 数组来表示列表内容。数组通常大于列表的逻辑大小,并且数组的元素可能包含指向已从列表中删除的对象的指针。 ArrayList 类通过将 null 分配给这些元素来处理此问题。
请注意,这些示例均不涉及实际删除对象。在这两种情况下,问题/问题都会以另一种方式解决。
另外值得注意的是,调用System.gc() 通常是个坏主意:
建议在生产代码中运行 GC 的唯一情况是您尝试管理 GC 暂停,并且您知道在特定时间点暂停是可以接受的。 (例如,当您在互动游戏中更改关卡时……)
【讨论】:
System.gc()的一个小细节:在Android上确实需要在某些情况下调用它来回收用于图像数据等的存储空间。但Android当然不是Java。
close() 文件一样......)
你不能删除一个对象,你可以尝试让它在下一个循环中符合垃圾回收的条件。最好的办法是,将对象设置为null 并尝试调用System.gc();
注意:System.gc() 调用只会请求 JVM 运行垃圾收集器,但不能强制它。
【讨论】:
null,而是将引用设置为null。并且打电话给System.gc() 通常毫无价值。