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

如何找到不再使用的对象?

  •  3
  • Benj  · 技术社区  · 15 年前

    我正在研究一个大型Java项目,它已经存在了一段时间(即在我的时间之前)。程序在几个阶段中运行,许多对象保留在早期阶段中,并在后期使用。我已经找到了几个组/类别的对象,这些对象没有任何好的理由被保留,但我怀疑还有更多的对象。

    所以我的问题是,有没有什么好的工具可以告诉我,从某个特定的时间点开始,哪些物体没有被触摸过,直到程序结束,它们才被触摸到。我一直在用“yourkit”来检查所有的物体,但通常不清楚它们是否需要保留。如果我有把你的记忆计算/报告和某种覆盖工具结合起来的东西,我会是一个快乐的人。

    2 回复  |  直到 15 年前
        1
  •  2
  •   TMN    15 年前

    可以使用VisualVM检查堆,并监视垃圾收集。你应该能够在你的程序中设置一个断点,然后寻找那些你怀疑不应该被保留的东西,找出是什么保留了对它们的引用。

    我曾经使用过一个名为(jprobe?)的商业工具。这正是你想要的,但那是8-9年前的事了,我不知道它是否仍然可用,或者如果可用,它可能会被称为什么。

        2
  •  3
  •   GuruKulki    15 年前

    弱引用用于确定何时不再引用对象。

      // Create the weak reference. 
         ReferenceQueue rq = new ReferenceQueue(); 
         WeakReference wr = new WeakReference(object, rq); 
      // Wait for all the references to the object. 
      try { 
             while (true) 
            {  
                  Reference r = rq.remove(); 
                  if (r == wr) 
                   { // Object is no longer referenced. } 
             } 
         } 
         catch (InterruptedException e) { }