代码之家  ›  专栏  ›  技术社区  ›  Shizam

如何判断Java对象的内存何时被释放?

  •  6
  • Shizam  · 技术社区  · 14 年前

    我有一个Swing浏览器应用程序,它有一个bug,当我在GUI中添加/删除这些对象时,内存并没有被释放出来,我正在尝试跟踪它们所持有的内容。问题是我不知道如何判断什么时候某些东西已经完全从记忆中释放出来了。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Community leo1    7 年前

    你不能用Java来做。所有提到终结器的答案都不是你想要的。

    投票 直到你拿到证明。

    final ReferenceQueue rq = new ReferenceQueue();
    final PhantomReference phantom = new PhantomReference( referenceToObjectYouWantToTrack, rq );
    

    你想在这里阅读彼得·科夫勒的答案(它解释了什么是幻影参考):

    Have you ever used Phantom reference in any project?

    http://www.kdgregory.com/index.php?page=java.refobj

    基本上,我在一个项目中使用了一个PhantomReference,在这个项目中,一种非常特殊的缓存需要在安装软件时计算一次。为了有效地计算这个(基于磁盘的)缓存,需要大量的内存(越多越好)。我用一个幻影引用来跟踪“几乎准确”的内存释放时间。

        2
  •  3
  •   Johannes Wachter    14 年前

    检测内存泄漏有多种方法。我现在想到的三点是:

    1. Netbeans Eclipse TPTP 这里应该有用)
    2. 进行堆转储和分析(使用 Eclipse Memory Analyzer
    3. VisualVM 跟踪垃圾回收状态。
        3
  •  3
  •   Justin Ardini    14 年前

    编辑:

    PhantomReference 可以做终结器所能做的一切,而不存在终结器存在的问题。所以,我鼓励使用 PhantomReferences finalize() . 我保留了我原来的观点,因为我认为Java程序员至少应该知道这一点 完成()

    完成() 方法,该方法在没有其他对象持有对该类的引用时运行。您可以这样扩展此方法:

    protected void finalize() throws Throwable {
        try {
            // Do whatever you want
        } finally {
            super.finalize();
        }
    }
    

    super.finalize() 如果你用这种方法。

    http://java.sun.com/developer/technicalArticles/javase/finalization/

        4
  •  1
  •   Brian S    14 年前

    尝试 YourKit