Я следовал нескольким примерам из разных источников и имею следующий фрагмент:
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();
}
}
При работе в режиме отладки я вижу, что слушатель зарегистрирован в ps marksweep и ps scavenge. Цикл while завершен (что я воспринимаю как знак выполнения GC) , но уведомление не вызывается.Не является уведомлением GC или любого другого типа.
Является ли проблема в том, что слушатель зарегистрирован неправильно или GC действительно не выполнялся?кажется, что слабый ref действительно пустой после цикла while.
Я использую openjdk 1.8.0_144.