Java 查看垃圾收集的变量

Java 查看垃圾收集的变量,java,garbage-collection,Java,Garbage Collection,我想知道在我的程序中垃圾收集的所有变量以及垃圾收集的顺序。有没有一种简单的方法可以做到这一点: class GarbageUtility { public static void main(String args[]) { int a =10; int b = a; int c = a + b; System.out.println(a); } } 您可以查看com.sun.management.GarbageCo

我想知道在我的程序中垃圾收集的所有变量以及垃圾收集的顺序。有没有一种简单的方法可以做到这一点:

class GarbageUtility {
    public static void main(String args[]) {
        int a =10;
        int b = a;
        int c = a + b;
        System.out.println(a);
    }
}

您可以查看
com.sun.management.GarbageCollectionNotificationInfo
,请参阅

此外,这篇文章还介绍了一种为hashmaps制作gc检测器的方法


我想知道在我的程序中垃圾收集的所有变量以及垃圾收集的顺序。有没有一种简单的方法可以做到这一点:

class GarbageUtility {
    public static void main(String args[]) {
        int a =10;
        int b = a;
        int c = a + b;
        System.out.println(a);
    }
}
  • 不,没有

  • 变量不是垃圾收集的2。对象被垃圾收集。。。或者至少,它们可能是垃圾收集的

  • 程序中的大多数变量都具有类型
    int
    ,并且
    int
    不是对象/引用类型。它们甚至不会受到垃圾收集器的影响

  • 你的程序甚至无法编译


  • 脚注:

  • 有几种方法可以用来推断对象正在被垃圾收集:

    • 如果声明一个
      finalize()
      方法,当GC检测到对象没有对is的强、软或弱引用时,将调用该方法。。。垃圾收集迫在眉睫。使用
      Reference
      对象及其关联队列可以获得类似的效果。但是请注意,这也可能会改变相应对象的生存期。。。使他们比其他人活得更长

    • 您可能能够通过外部调试器或探查器代理检测到要进行垃圾收集的对象。(我对此不确定。我实际上认为无法访问的对象对代理是不可见的。)

  • 事实上,这比那要复杂一点

    变量没有独立的生存期。他们总是“其他东西”的一部分。。。“其他东西”可以被垃圾收集。。。在某些情况下:

    我们可以将变量分为3类:

    • 堆栈变量(即方法参数和局部变量)不存储在GC管理的空间中。任何引用位于(活动)堆栈变量中的对象都不会被垃圾收集

    • 实例变量(类声明的实例字段)是相应对象的一部分。当对象被垃圾收集时,变量“消失”

    • 静态变量(由类声明的静态字段)通常在应用程序的生命周期内保持不变。然而,在某些情况下,类可能被垃圾收集,如果发生这种情况,它的静态变量将同时消失


  • 请注意,
    GarbageCollectionNotificationInfo
    告诉您GC已经收集了某个堆,并提供了一些基本统计信息,例如GC花费了多长时间以及前后堆中的可用空间


    我看不出这有助于您判断特定对象是否已被垃圾收集以及何时发生。

    您认为拥有这些信息有助于解决的技术问题是什么?“我想知道垃圾收集的所有变量是什么”最简单的方法是将每个对象的弱引用放入列表中。然后重新查看列表,您知道对象为
    null
    的引用已被收集。当然,这只是开玩笑。您的示例中没有任何显式对象,因此您知道没有创建对象,因此没有对象被收集。实际上,很可能调用了Integer.toString()来创建一个对象。谢谢,GarbageCollectionNotificationInfo就是我要找的。如何?我不认为它能满足你的需求。