我想知道我的程序中所有的变量都被垃圾回收了,以及垃圾回收的顺序。有没有一种简单的方法可以做到这一点:
class GarbageUtility {
public static void main(String args[]) {
int a =10;
int b = a;
int c = a + b;
System.out.println(a);
}
}
我想知道我的程序中所有的变量都被垃圾回收了,以及垃圾回收的顺序。有没有一种简单的方法可以做到这一点:
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
,见http://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GarbageCollectionNotificationInfo.html
此外,这篇文章还介绍了一种为哈希图制作 gc 检测器的方法,http://java.dzone.com/articles/letting-garbage-collector-do-c
我想知道我的程序中所有的变量都被垃圾回收了,以及垃圾回收的顺序。有没有一种简单的方法可以做到这一点:
不,没有1。
变量不是垃圾收集2。对象被垃圾收集......或者至少,它们可能被垃圾收集。
您程序中的大多数变量都有类型int
,int
而不是对象/引用类型。他们甚至不会受到垃圾收集器的影响。
你的程序甚至不会编译...
脚注:
有几种方法可以用来推断对象正在被垃圾回收:
如果你声明了一个finalize()
方法,那么当 GC 检测到对象没有对 is ... 的强、软或弱引用并且垃圾回收迫在眉睫时,就会调用该方法。Reference
您可以使用对象及其关联的队列获得类似的效果。但是请注意,这也可能会改变各个对象的生命周期……导致它们的寿命比原本可能更长。
您可能能够通过外部调试器或分析器代理检测到一个对象应被垃圾收集。(对此我不确定。我实际上认为无法访问的对象对代理是不可见的。)
实际上,它比这要复杂一些。
变量没有独立的生命周期。它们总是“其他东西”的一部分......并且“其他东西”可以被垃圾收集......在某些情况下:
我们可以将变量分为3种:
堆栈变量(即方法参数和局部变量)不存储在 GC 管理的空间中。任何引用在(实时)堆栈变量中的对象都不会被垃圾收集。
实例变量(类声明的实例字段)是相应对象的一部分。当对象被垃圾回收时,变量“消失”。
静态变量(由类声明的静态字段)通常在应用程序的生命周期内一直存在。但是,在某些情况下,一个类可能会被垃圾收集,如果发生这种情况,它的静态变量会同时消失。
请注意,它GarbageCollectionNotificationInfo
告诉您 GC 已经收集了某个堆,并提供了一些基本统计信息,例如 GC 花费了多长时间以及之前和之后堆中的可用空间。
我看不出这如何帮助您判断特定对象是否已被垃圾收集以及何时发生。