如何检测java垃圾清理器?
当您想在 Java 上做一些实验或了解 Java 的工作原理时,它会很有用。
有不同的检测方法:
日志记录: 您可以在 Java 虚拟机 (JVM) 中启用 GC 日志记录来跟踪垃圾收集何时发生。此日志记录提供有关垃圾收集事件的频率、持续时间和类型的详细信息。要启用 GC 日志记录,您可以使用 JVM 选项,例如
-XX:+PrintGC
和 -XX:+PrintGCDetails
。
JVisualVM: Java VisualVM 是 Java 开发工具包 (JDK) 中包含的监控、故障排除和分析工具。它提供了一个图形界面来监视 JVM 及其上运行的应用程序,包括垃圾收集活动。您可以将 JVisualVM 连接到 Java 应用程序并实时监控 GC 活动。它显示与内存使用情况相关的各种指标,包括堆使用情况和垃圾收集事件。
GC 通知: 从 Java 9 开始,您可以使用 GarbageCollectorMXBean 类以编程方式监视垃圾回收活动。这是一个例子:
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import javax.management.NotificationEmitter;
import javax.management.NotificationListener;
import javax.management.openmbean.CompositeData;
public class GCNotifier {
public static void main(String[] args) {
for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
NotificationEmitter emitter = (NotificationEmitter) gc;
emitter.addNotificationListener(new NotificationListener() {
@Override
public void handleNotification(javax.management.Notification notification, Object handback) {
if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from((CompositeData) notification.getUserData());
System.out.println("GC Event: " + info.getGcName() + ", Duration: " + info.getGcInfo().getDuration());
}
}
}, null, null);
}
}
}
您可以使用
java.lang.ref.WeakReference
来完成。 WeakReference可以引用对象,但它并不能阻止对象被终结、终结,然后被回收。
因此,当
Garbage cleaner
开始工作时,它会清除所有未引用的对象,我们可以使用弱引用来检测它。
import java.lang.ref.WeakReference;
public class GCDetector{
public static void startDetection() {
Thread garbageClear = new Thread(() -> {
WeakReference<Object> weakReference;
Object checker;
while (true) {
checker = new Object(){
public void foo() {}
};
weakReference = new WeakReference<>(checker);
int i = checker.hashCode() + 4;
checker = null;
while (true) {
try {
if (weakReference.get() == null) {
System.out.println("Garbage clean detected!!!");
break;
}
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
garbageClear.start();
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
GCDetector.startDetection();
Thread.sleep(1000);
Runtime.getRuntime().gc();
}
}