К сожалению, поиск в Google для «подсчета ссылок в java» не приносит никаких полезных результатов.
К сожалению, это продолжает оставаться верным 8 лет спустя.
Но больше нет!Я вытащил Нетти бит подсчета ссылок, немного отшлифовал их и превратил в отдельную библиотеку almson-refcount .
Базовая ссылкаПодсчет функциональности прост и понятен.Существует один базовый класс, ReferenceCountedObject
.У него есть один переопределяемый метод, destroy
.Он предоставляет retain
и release
, которые управляют внутренним счетчиком ссылок, используя поточно-безопасный и эффективный AtomicFieldUpdater.release
вызовет destroy
в том же потоке, и из-за семантики упорядочения памяти между различными вызовами release
вам не нужно беспокоиться о поточной безопасности вашего destroy
даже в многопоточномприложение.Класс реализует AutoCloseable
и предоставляет метод close
, который просто вызывает release
.Это позволяет использовать его в try-with-resources.
Нет механизма финализации, который пытается вызвать destroy
в случае, если вы забудете вызвать release!Завершение представляет большие проблемы, включая проблемы параллелизма и даже преждевременное завершение, особенно в общем случае.(Если вы настаиваете на наличии финализаторов, вы все равно можете использовать их или более производительные java.lang.ref.Cleaner
.)
Вместо этого есть умная система обнаружения утечек.Он использует механизм, аналогичный завершению.Поскольку его единственной обязанностью является обнаружение утечек и запись отладочной информации, вам ничего не нужно делать, чтобы заставить его работать правильно (кроме включения).
Основные изменения, внесенные в Netty:
- Фактический, пригодный для использования базовый класс для всех ваших объектов с подсчетом ссылок.
- Более элегантный интерфейс с меньшим количеством методов.
- Более простой и понятный код с меньшими затратами ресурсов.
- Улучшения в документации, предварительных настройках и выходе детектора утечки.