Мое приложение регистрирует использование определенных объектов - моя настройка использует AspectJ для определения интересующих контекстов и регистрации этих обычаев. Затем я загружаю файлы журнала для анализа, но по соображениям эффективности полезно знать, когда объект больше недоступен.Ведение журнала при сборе мусора
Мой текущий подход заключается в регистрации объектов, которые меня интересуют, с помощью «мусорщика», который затем создает объект «сбережения», содержащий хэш-код идентификатора объекта, и сохраняет его в слабой карте хэша. Идея заключается в том, что когда объект будет собран, объект-хранитель будет удален из слабой карты хэша и собран, таким образом, запущенный код для регистрации хэш-кода идентификатора собранного объекта. Я использую отдельный поток и очередь, чтобы предотвратить появление узкого места в сборщике мусора. Вот код мусора регистратор:
public class GarbageLogger extends Thread {
private final Map<Object,Saver> Savings =
Collections.synchronizedMap(new WeakIdentityHashMap<Object,Saver>());
private final ConcurrentLinkedQueue<Integer> clearTheseHash =
new ConcurrentLinkedQueue<Integer>();
public void register(Object o){
Savings.put(o,new Saver(System.identityHashCode(o));
}
private class Saver{
public Saver(int hash){ this.hash=hash;}
private final int hash;
@Override
public void finalize(){
clearTheseHash.add(hash);
}
}
@Override
public void run(){
while(running){
if((clearTheseHash.peek() !=null)){
int h = clearTheseHash.poll();
log(h);
}
else sleep(100);
}
}
// logging and start/end code omitted
}
Моя проблема заключается в том, что это кажется очень запутанным, и, поскольку слабая хэш-карта не обязательно очистить свои записи, если пространство не требуется, я мог бы долго ждать после того, как объект собранных до его записи. В принципе, я ищу лучший способ добиться этого.
Примечание. Я контролирую произвольные объекты и не контролирую их создание, поэтому не могу переопределить их методы финализации.
Похоже на то, что вы действительно хотите, это [ссылочная очередь] (http://stackoverflow.com/a/14450693/869736). –
Итак, я бы заменил WeakIdentityHashMap и ConcurrentLinkedQueue на ReferenceQueue, но все равно нужен поток GarbageLogger для сбора собранных ссылок и их регистрации? – selig
Это правильно. –