Использование различных ссылочных типов в Java
Недавно я поигрался с мягкими, слабыми и фантомными ссылочными типами в Java, и мне было интересно, есть ли какие-то способы их использования, с которыми я не сталкивался. Я использовал их в прошлом для разных вещей, и они всегда подпадали под категорию следующего:
- Использование фантомных ссылок вместо финализаторов - я предпочитаю это, так как есть 0 шансов на воскрешение мертвого объекта
- Использование слабых ссылок в hashmap для хранения сопоставления значения object=>, где сопоставление должно быть только в том случае, если объект существует в другом месте (полезно, когда необходимо добавить дополнительную информацию к объекту в библиотеке, например, источник которого не может быть модифицированный)
- Использование мягких ссылок для кэширования (работает намного лучше, чем слабые ссылки, потому что JVM хранит их гораздо дольше и отпускает, только если считает, что это необходимо.)
Тем не менее, есть только 3 варианта использования, и я осмелюсь сказать, что есть еще много вещей, которые могут быть полезны для которых я никогда не сталкивался. Все предложения приветствуются!
1 ответ
Две странные идеи:
- Вы можете использовать мягкую ссылку, чтобы узнать, что у вас мало памяти, и вручную освободить некоторые кеши, которые сами не могут использовать мягкие ссылки.
- Вы можете использовать слабую ссылку, чтобы узнать, когда запускается GC, что может быть полезно в случае странных программных пауз, которые могут иметь или не иметь отношение к GC.
ИМХО, в некоторых (редких) случаях слабые ссылки могут быть лучше для кэширования, например, вы можете слабо ссылаться на значения, которые вряд ли понадобятся снова, когда они будут удалены из структур, использующих их (то есть, они станут сильно недостижимыми). Кроме того, в JVM есть серьезная ошибка, связанная с мягкими ссылками, которая может заставить вас сделать это.