gpt4 book ai didi

执行了Java垃圾回收,但未收到GC通知

转载 作者:太空宇宙 更新时间:2023-11-04 09:54:34 25 4
gpt4 key购买 nike

我遵循了来自不同来源的一些示例,并得到了以下代码片段:

 private void registerForMemUsageChanges() {
List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean garbageCollectorMXBean : garbageCollectorMXBeans) {
listenForGarbageCollectionOn(garbageCollectorMXBean);
}

}

private void listenForGarbageCollectionOn(GarbageCollectorMXBean garbageCollectorMXBean) {
NotificationEmitter notificationEmitter = (NotificationEmitter) garbageCollectorMXBean;
GarbageListener listener = new GarbageListener();
notificationEmitter.addNotificationListener(listener, null, null);
}

public class GarbageListener implements NotificationListener {

@Override
public void handleNotification(Notification notification, Object handback) {
if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
doSomthing();//irrelevant
}

}
}

我添加了一个执行以下操作的测试(再次基于我发现的示例)并且它似乎有效:

private void triggerGc() throws InterruptedException {
Object obj = new Object();
WeakReference ref = new WeakReference<Object>(obj);
obj = null;
while(ref.get() != null) {
System.gc();
}
}

在 Debug模式下运行时,我看到监听器已注册到 psmarksweep 和 psscavenge。 while 循环完成(我将其视为执行 GC 的标志),但没有调用任何通知。不是 GC 通知或任何类型。

问题是监听器注册错误还是GC没有真正执行?看来 while 循环之后弱引用确实是空的。

我使用的是 openjdk 1.8.0_144。

最佳答案

问题实际上是:

  1. 正如 Holger 在评论中提到的,我只收到影响老一代的 GC 通知,并且
  2. 虽然代码已执行,但调试器并未在我的断点处停止,因此尽管我无法判断,但 doSomething 实际上做了一些事情。

关于执行了Java垃圾回收,但未收到GC通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54325529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com