【问题标题】:How to force the JVM to clear all WeakReferences / keys of a WeakHashMap如何强制 JVM 清除 WeakHashMap 的所有 WeakReferences / 键
【发布时间】:2011-12-06 07:28:48
【问题描述】:

如果常规引用不再引用它们,是否有办法强制 jvm 清除所有 WeakReferences(或 WeakHashMap 的所有键)?

触发垃圾回收将不起作用,弱引用仍然存在。 (我读到只有在内存不足时才会清除弱引用)。

【问题讨论】:

  • 为什么要这么做?可能还有其他方法可以实现您的真正目标。l
  • 我想确保我的应用程序没有泄漏。 (目前,tomcat 在停止我的应用程序后检测到“泄漏”,根据我的堆分析器,这是因为仍然持有弱引用)
  • 只有在内存不足时才会出现内存泄漏问题。如果你不这样做,那么即使是真正的内存泄漏也是完全无趣的。而且由于弱链接无论如何都不会导致 OOM 异常 - 为什么要麻烦?
  • @Voo:Memory leaks are only a problem if you run out of memory.Interesting thinking....如果您的应用程序是系统中唯一运行的应用程序,我想这是正确的......
  • @Voo - 您假设您的泄漏内存没有与已用内存共享页面。那些泄露的引用完全有可能用完部分内存页面并导致抖动。子讨论与您的一揽子声明有关,即不会导致 OOM 错误的内存泄漏无关紧要,以及它可能不真实的原因。

标签: java memory-leaks garbage-collection jvm weak-references


【解决方案1】:

SoftReferences 在内存不足时被清除。

WeakReferences 被更频繁地清除(就像一个对象只剩下弱引用的时候一样)

查看包的官方 Java 文档(包文档有助于解释): http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html

您能否引用您在关闭时从 Tomcat 看到的确切消息?你确定你没有误解它吗?对 Tomcat 来说重要的是,没有将 ClassLoader 固定为 ServletContext 的硬引用。

Re WeakHashMap:http://download.oracle.com/javase/1.5.0/docs/api/java/util/WeakHashMap.html 只有键被弱持有。你用什么作为“价值”?价值是否强烈地自我引用自己的“关键”?有了这个,我质疑您对 WeakHashMap 为您提供什么的理解(这假定它是完成这项工作的正确工具)。

根据我的经验,您可以在第一次 GC 扫描时使用 System.gc() 清除 Sun JVM 5 的 WeakReferences 对我来说 100% 可靠。但他们不能保证这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2019-08-06
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多