基本上,我想找出当前有多少线程正在使用该对象。
如果没有人使用该对象引用,那么我想销毁该对象。

例子

 User u = new User();
 (here I have other code)
 if (u is not used by any thread) {
   u = null;
 }

最佳答案

该问题基于对Java内存管理的基本误解。

null分配给变量不会使破坏先前引用的对象,而不会破坏该对象。它实际上所做的是断开可能使它“可到达”的对象的许多路径(从 Activity 变量引用的链)中的一条。如果没有更多路径,则程序中的任何对象都无法访问(使用)该对象,并且可以对其进行垃圾回收。它何时真正消失取决于JVM/垃圾收集器。

当没有其他引用时,您正在尝试使User对象“消失”。但这还是会发生的。您真正需要做的就是无条件地将null分配给u,以便此变量不会阻止User对象消失。

您可以让User对象“现在”消失吗?答案很复杂,归结为:

  • 您不能可靠地做到这一点,而
  • 您无法有效地做到这一点。


  • 并在问题标题中回答问题。



    不。不是您的意思。 JVM甚至没有提供一种方法来找出对象引用的实时副本。 JVM提供的最接近的是SoftReferenceWeakReference类,可用于检测对象不再具有对该对象的任何常规(强)引用。

    但这对于解决您的“问题”不是必需的。

    10-07 19:01
    查看更多