Что такое пул объектов в Java?
Что такое пул объектов и что такое слабая ссылка на объект?
Как мы можем реализовать их с помощью Java?
7 ответов
Пул объектов - это коллекция конкретного объекта, который приложение будет создавать и держать под рукой в тех ситуациях, когда создание каждого экземпляра обходится дорого. Хорошим примером будет подключение к базе данных или рабочий поток. Пул проверяет экземпляры для пользователей, как книги из библиотеки.
Обычно пул объектов обрабатывается сервером приложений Java EE. Если вам нужно сделать это самостоятельно, лучше всего использовать что-то вроде пула объектов Apache. Не пиши себе; безопасность потоков и другие проблемы могут усложнить задачу.
Вот хорошая ссылка на слабые ссылки на объекты.
Проверьте общие бассейны
предоставляет API для пула объектов
Обычно используется для объектов, создание которых стоит дорого. Во избежание этого вы поддерживаете пул из N предварительно созданных объектов и повторно используете их.
Слабая ссылка - это разновидность ссылочной переменной, которая специально обрабатывается сборщиком мусора.
Это вводит другой вид достижимости, любой объект может быть:
- сильно достижимо (доступно из любого жизненного потока только обычными ссылками)
- слабо достижимый (не сильно достижимый, но достижимый слабой ссылкой (или несколькими способами, каждый из которых включает слабую ссылку))
- вообще недоступен
(Есть также " Мягкие ссылки" и " Призрачные ссылки", которые я здесь опускаю - они работают аналогично и вводят больше уровней между ними.)
Если объект вообще недоступен, его можно собрать в любой момент. Если объект является сильно достижимым, он вообще не может быть собран мусором. Если сборщик мусора обнаруживает, что объект (или группа объектов) слабо доступен (возможно, по нескольким слабым ссылкам), он очищает все эти ссылки сразу, а затем объекты не достижимы (и могут быть собраны мусором).
(На самом деле существует / может быть этап завершения между "недостижимым" и коллекцией, который также может сделать объект снова достижимым.)
Для использования слабых ссылок, вы можете использовать класс java.lang.ref.WeakReference
- фактическая ссылка находится в закрытой переменной этого класса и может быть установлена только с помощью конструктора, а затем очищена. Вы можете создать подкласс этого класса, если вам нужны другие данные, кроме самой ссылки, которая все еще должна быть там, когда ссылка очищена.
Для пула объектов в смысле "избегать дорогостоящих реализаций" слабая ссылка не является правильным инструментом.
Пул объектов - это любая коллекция объектов, которые перерабатываются, а не воссоздаются каждый раз, когда они необходимы.
Существует несколько способов реализации такого пула объектов в зависимости от ваших требований. Пулы объектов используются для повышения производительности даже для простых объектов, но не так полезны в Java 5+.
Я предлагаю вам использовать их только для объектов, которые подключаются к внешним ресурсам, таким как файлы, сокеты или соединения с базой данных.
Идея шаблона пула объектов похожа на идею библиотеки. Каждый из нас знает, что дешевле и проще пойти в библиотеку и взять книгу вместо того, чтобы покупать ее. Точно так же дешевле (с точки зрения системной памяти и скорости) процесс заимствовать объект, а не создавать его экземпляр. Таким образом, такой процесс, в котором процесс заимствует объект у другого процесса, называется объединением объектов.
Объединение и объединение объектов:
Пул в основном означает эффективное использование ресурсов, ограничивая доступ объектов только тем периодом, который требуется клиенту.
Увеличение использования за счет объединения в пул обычно повышает производительность системы.
Объединение объектов - это способ управления доступом к конечному набору объектов среди конкурирующих клиентов.
Другими словами, пул объектов - это не что иное, как разделение объектов между различными клиентами.
Поскольку пул объектов позволяет совместно использовать объекты, другим клиентам / процессам необходимо повторно создать экземпляр объекта (что уменьшает время загрузки), вместо этого они могут использовать существующий объект.
После использования объекты возвращаются в пул.
Слабый эталонный объект:
Слабая ссылка является держателем для ссылки на объект, называемый референтом.
С помощью слабых ссылок вы можете поддерживать ссылку на референта, не предотвращая его сборку мусора.
Когда сборщик мусора отслеживает кучу, если единственные невыполненные ссылки на объект являются слабыми ссылками, тогда референт становится кандидатом на сборщик мусора, как если бы не было невыполненных ссылок, и все невыполненные слабые ссылки очищаются.
Помните, что GC всегда, используя некоторые алгоритмы, восстанавливает слабодоступные объекты.
Я реализовал простой ObjectPool в Java, смотрите здесь, хотя он не использует слабую ссылку на объект. Цель слабой ссылки на объект, чтобы позволить собирать память объекта, даже если есть ссылки на объект, но они являются слабыми. Это более полезно для кэшей, чем для пулов объектов, хотя может использоваться и для них.
Я подозреваю, что вы пытаетесь спросить о кеше SoftReference (не WeakReference). Я не могу найти его прямо сейчас, но я помню, как читал от кого-то, кто реализовал проприетарную JVM, умоляющего людей не использовать их. Его аргумент состоял в том, что эти кеши предполагают, что автор сборщика мусора каким-то образом знает о ваших потребностях в кэшировании больше, чем вы (что никогда не должно быть правдой).
Я вспоминаю, что когда-то видел, что если цикл GC не освобождает достаточно памяти, все SoftReferences впоследствии очищаются сразу, то есть кеш переходит от смехотворно (нехватки памяти) до (столь же нелепо) полностью пустого. Вместо этого выберите реализацию кеша, которая работает в зависимости от размера или возраста, или того и другого, то есть ту, которой вы можете дать свои собственные разумные правила, вместо того, чтобы пытаться переложить решение о том, как работает ваш кеш, на человека, который написал сборщик мусора. по какой-то причине.