Главная » Uncategorized » Виды ссылок Java

Виды ссылок Java

В Java существует 4 вида ссылок:

strong, soft, weak, phantom

В Java объекты, создаваемые через оператор
new
создаются по strong ссылке.

GC уничтожает такие объекты только тогда, когда на них больше не остается сильных (strong) ссылок.
|======================================================================================|
Пригождаются для избегания OutOfMemoryError.
В пакете java.lang.ref есть 3 класса, которые описывают оставшиеся 3 типа ссылок, соответственно SoftReference, WeakReference, PhantomReference.
|==|
SoftReference часто используется для кешей, потребляющих большое количество памяти.
SoftReference объекты будут собраны в случае, если JVM требует память. Перед тем, как JVM выбросит OutOfMemoryError, гарантия есть
|==|
WeakReference используется для кешей и для создания цепей связанных между собой объектов.
WeakReference объекты финализируются, если на них не остется Strong и Weak ссылок
КЭШ: В качестве кэша этот класс можно использовать только если вы хотите, чтобы объекты внутри кэша были как можно раньше уничтожены сборщиком мусора. Однако это очень странная стратегия кэширования.
/==/
PhantomReference. Этот тип ссылок используется как альтернатива финализации (для более гибкого освобождения ресурсов).
/========================================================================================/
Виды задач
Задача 1: исчезающие ящики

На ваш склад прибыла партия ящиков, и вам нужно присвоить каждому ящику номер. Для этого заведена хеш-табличка, в которой ключи — ссылки на ящики, а значения — их номера. Примерно так:
HashMap boxMap = new HashMap();
При поступлении на склад, ящик добавляется в таблицу:
boxMap.put(box, boxid);
При этом возникает проблема: при отгрузке ящика со склада, память, выделенная для него, не освобождается, поскольку хеш-таблица содержит ссылку на ящик, и виртуальная машина считает его «живым».

Вопрос: как можно модифицировать хеш-таблицу так, чтобы память освобождалась после отгрузки ящика?.
Map<Box,long> boxMap = new WeakHashMap<Box,long>();
boxMap.put(box, boxid);
/========================================================================================/
верный путь к OutOfMemoryError.
Код преобразования картинок:
public class PicModifier {
private byte[] picData;
public synchronized int modifyPicture(String fileName) {
int picSize = getPicSize(fileName);
if (picData == null || picData.length < picSize) {
picdata = new byte[pisSize];
loadPicture(fileName, picSize);
}
}
}
выделяется буфер для файла ,но может перестать хватать памяти.
Надо: модифицировать код так,
чтобы приложение
сохраняло буфер, если памяти достаточно
освобождало буфер , если память в системе заканчивается?
Все:
Всё, что требуется в нашей задаче — это обернуть буфер в мягкую ссылку.
private SoftReference<byte[]> picData;
P/S
Таким образом, мягкие ссылки обеспечивают нечто вроде кэширования. Но это, конечно же, не настоящее кэширование. Если Вашему приложению действительно нужен полноценный кэш, то одних только мягких ссылок мало, нужна реализация кэширующих стратегий, по возможности независимых от количества свободной памяти. Поэтому мягкие ссылки иногда называют «кэшированием для бедных».
0_310f5_60f84e97_L.jpg
Далее:
http://www.quizful.net/post/java_reference_types

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s