Java 垃圾清理器检测器

问题描述 投票:0回答:2

如何检测java垃圾清理器?

当您想在 Java 上做一些实验或了解 Java 的工作原理时,它会很有用。

java garbage-collection detection
2个回答
0
投票

有不同的检测方法:

  1. 日志记录: 您可以在 Java 虚拟机 (JVM) 中启用 GC 日志记录来跟踪垃圾收集何时发生。此日志记录提供有关垃圾收集事件的频率、持续时间和类型的详细信息。要启用 GC 日志记录,您可以使用 JVM 选项,例如

    -XX:+PrintGC
    -XX:+PrintGCDetails

  2. JVisualVM: Java VisualVM 是 Java 开发工具包 (JDK) 中包含的监控、故障排除和分析工具。它提供了一个图形界面来监视 JVM 及其上运行的应用程序,包括垃圾收集活动。您可以将 JVisualVM 连接到 Java 应用程序并实时监控 GC 活动。它显示与内存使用情况相关的各种指标,包括堆使用情况和垃圾收集事件。

  3. 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);
        }
    }
}

-1
投票

您可以使用

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.