01.10.2024 старт набору нової групи на курс Enterprise Patterns! Реєструйтеся зараз зі знижкою 30%!
Дізнатися більше
01.11.2023
7 хвилин читання

Які типи посилань існують у Java

Ви коли-небудь замислювалися про те, як Java працює з пам’яттю та обробляє посилання на об’єкти? Які типи посилань java взагалі існують? У цій статті ми розглянемо різні типи посилань, розкриємо їхні особливості та наведемо приклади їхнього використання, щоб краще зрозуміти їхній принцип роботи та вибрати правильний тип для своїх завдань.

Огляд сильних посилань 

Сильні посилання (Strong reference) – це найбазовіший і найпоширеніший тип посилань у Java, і важливо зрозуміти, як вони працюють. Коли ми створюємо об’єкт у Java і присвоюємо його змінній, ми створюємо сильне посилання на цей об’єкт. Це означає, що об’єкт залишатиметься в пам’яті, поки на нього є хоча б одне таке посилання.

Це — простий і прямий доступ до об’єктів.

Розглянемо приклад:

String message = "Привіт світ!";

У цьому прикладі ми створюємо змінну message і присвоюємо їй значення рядка “Привіт, світ!” за допомогою сильного посилання. Тепер у нас є доступ до цього рядка і можемо виконувати операції з ним.

System.out.println(message);

Ми можемо вивести вміст рядка на консоль за допомогою методу println(). У цьому випадку, наш висновок буде “Привіт, світ!”.

message = "Hello, world!";

System.out.println(message);

Ми також можемо змінити значення змінної message, присвоївши їй новий рядок “Hello, world!”. І в результаті отримаємо виведення “Hello, world!”.

У цьому прикладі сильне посилання message дає нам змогу легко маніпулювати строковим значенням і змінювати його за потреби.

Підсумок: сильні посилання в Java використовуються для вказівки на об’єкти, які повинні залишатися в пам’яті доти, доки існують посилання на них. Якщо недостатньо пам’яті, це може призвести до помилки OutOfMemoryError.

Не забувайте звільняти пам’ять, коли об’єкт більше не потрібен, присвоюючи посиланню значення null.

🚀 Курс Java Start від Сергія Немчинського — ваш ідеальний старт у світі програмування!

🏆 Проходьте курс і станьте частиною успішних студентів, які завершують його всього за 2-4 тижні.

👆👆👆

Вивчення м’яких посилань 

Це такий тип посилання, який дозволяє JVM (Java Virtual Machine) видалити об’єкт із пам’яті, якщо він стає недоступним, і системі потрібно звільнити пам’ять. М’які посилання (Soft Reference) особливо корисні для кешування даних або оптимізації продуктивності. Якщо об’єкт, на який вказує таке посилання, все ще доступний, він залишається в пам’яті. Однак, якщо пам’ять – обмежена, JVM може видалити такий об’єкт.

Якщо простіше, то, у нас є об’єкт, на який вказує сильне посилання. Але що, якщо ми хочемо, щоб він був видалений з пам’яті, на нього більше немає сильних посилань і пам’ять починає виснажуватися? Ось де на сцену виходять м’які посилання, які “підказують” збирачу сміття, що об’єкт можна видалити, але не терміново, тільки в разі нестачі пам’яті.

Розглянемо приклад:

SoftReference<String> softRef = new SoftReference<>("Привіт світ!");

У нас є змінна softRef, яка є м’яким посиланням на об’єкт типу String зі значенням “Привіт, світ!”. Зауважте, що тут ми використовували SoftReference, щоб створити м’яке посилання.

Тепер, коли на об’єкт є тільки таке посилання, збирач сміття може видалити його, якщо пам’ять почне виснажуватися. Однак, якщо пам’яті достатньо, то об’єкт залишатиметься в пам’яті, і ми зможемо отримати до нього доступ через посилання softRef.

String message = softRef.get();

Тут ми використовуємо метод get(), щоб отримати доступ до об’єкта, пов’язаного з softRef. Якщо об’єкт ще не був вилучений з пам’яті, ми зможемо отримати його і працювати з ним, як зазвичай.

Підсумок: м’які посилання в Java корисні для кешів, які потребують гнучкого управління доступним обсягом оперативної пам’яті. За ними об’єкти можуть бути видалені тільки в разі потреби. Наприклад, якщо потрібно створити більше об’єктів із сильними посиланнями, але доступний простір вичерпано, краще звільнити кеш і сповільнити роботу, ніж ризикувати повним збоєм процесу.

Types of References in Java

Розуміння слабких посилань 

Це ще один тип посилання, який дає змогу видалити об’єкт із пам’яті в будь-який момент під час збирання сміття. Такі посилання часто застосовуються для кешування тимчасових даних або під час реалізації складних структур даних.

Припустимо, у нас є об’єкт, на який немає сильних посилань, але ми б хотіли знати, коли він видалиться з пам’яті. Ось де слабкі посилання вступають у гру.

Слабке посилання (Weak Reference) – це як “ніжна” версія м’якого. Вона дає підказку збирачу сміття, що об’єкт можна видалити наступного разу, коли виявиться слабке посилання. Якщо об’єкт не має сильних або м’яких посилань, збирач сміття безжально видалить його з пам’яті.

Тепер давайте розглянемо приклад, щоб краще зрозуміти, як це працює:

WeakReference<String> weakRef = new WeakReference<>("Привіт світ!");

Тут ми створюємо змінну weakRef, яка є слабким посиланням на об’єкт типу String із вмістом “Привіт, світ!”. Зверніть увагу, що ми використовували WeakReference, щоб створити слабке посилання.

Коли на об’єкт немає сильних або м’яких посилань, збирач сміття може видалити його, виявивши слабке посилання. Водночас, якщо об’єкт ще доступний, ми можемо отримати до нього доступ через weakRef.

String message = weakRef.get();

Ми використовуємо метод get(), щоб отримати доступ до об’єкта, пов’язаного з weakRef. Якщо об’єкт ще не видалено з пам’яті, ми зможемо отримати його і працювати з ним.

Підсумок: слабкі посилання в Java корисні для зв’язування об’єктів із чимось без запобігання їх видалення, коли вони більше не потрібні. Вони не впливають на можливість видалення об’єктів, і вони будуть автоматично очищені при наступному запуску збирача сміття.

Тому, під час використання таких посилань, потрібно бути готовим до того, що об’єкт може стати недоступним у будь-який момент.

Аналіз фантомних посилань у Java

Фантомне посилання (Phantom Reference) практично не надає інформації про стан об’єкта, на який воно вказує. Воно використовується для відстеження об’єктів перед їхнім видаленням із пам’яті, що, своєю чергою, дає змогу застосунку отримувати повідомлення про те, що об’єкт готовий до фіналізації. Тобто, ми маємо можливість виконати певні дії перед його остаточним видаленням.

Це найслабший тип посилань у Java. Коли об’єкт стає доступним тільки через фантомне посилання, це означає, що він уже позначений для видалення і це є неминучим. Ми не можемо отримати доступ до самого об’єкта і його даних, а лише сигнал про те, що об’єкт буде видалено.

Розглянемо приклад:

ReferenceQueue<String> queue = new ReferenceQueue<>();

PhantomReference<String> phantomRef = new PhantomReference<>("Привіт світ!", queue);

Тут ми створюємо чергу queue, яка буде використовуватися для відстеження фантомних посилань. Потім ми створюємо фантомне посилання phantomRef на об’єкт типу String із вмістом “Привіт, світ!”;

Коли об’єкт стає доступним тільки через фантомне посилання, його додають у чергу queue. Ми можемо це перевірити, витягуючи посилання з цієї черги.

Reference<? extends String> reference = queue.poll();

Ми використовуємо метод poll(), щоб витягти посилання з черги. Якщо посилання є фантомним, це означає, що об’єкт буде видалено і ми можемо вжити відповідних заходів.

📢 Підпишись на наш Ютуб-канал! 💡Корисні відео для програмістів вже чекають на тебе!

🔍 Обери свій курс програмування! 🚀 Шлях до кар’єри програміста починається тут!

Підсумок: фантомні посилання в Java виникають, коли об’єкт уже вважається сміттям, завершує свою фіналізацію і перебуває в процесі очищення. Вони корисні, коли нам потрібно виконати додаткові дії перед остаточним видаленням об’єкта, наприклад, закриття ресурсів, звільнення пам’яті або виконання інших операцій.

Висновок

При виборі типу посилання в Java важливо розуміти свої завдання і вимоги. Сильні посилання прості та зручні у використанні, м’які – допомагають оптимізувати продуктивність, слабкі – підходять для тимчасових даних, а фантомні – корисні при відстеженні об’єктів перед видаленням. Обирай тип посилання, який найкраще відповідає твоїм потребам і допоможе ефективно керувати пам’яттю у твоїх Java-додатках.

FAQ
Які основні типи посилань існують у Java?

У Java існують чотири типи посилань: сильні, м'які (SoftReference), слабкі (WeakReference) і фантомні (PhantomReference).

Що таке сильне посилання?

Сильне посилання — це звичайне посилання, яке ми використовуємо найчастіше. Доки на об'єкт є хоча б одне сильне посилання, він не буде зібраний збирачем сміття.

У яких випадках корисно використати м'які посилання?

М'які посилання корисні, коли ви хочете зберегти об'єкт у пам'яті доти, доки не стане нестача пам'яті.

Навіщо служать слабкі посилання?

Слабкі посилання часто використовуються для створення кешів. Об'єкти, на які посилаються тільки слабкі посилання, можуть бути видалені під час наступного запуску збирача сміття.

Що таке фантомні посилання та в яких випадках вони застосовуються?

Фантомні посилання дають змогу дізнатися, коли об'єкт був зібраний збирачем сміття. Вони корисні для певних завдань керування ресурсами.

Як працює механізм очищення пам'яті Java в контексті різних типів посилань?

Сильні посилання запобігають видаленню об'єкта. Об'єкти, на які посилаються м'які та слабкі посилання, видаляються під час нестачі пам'яті або під час наступного запуску збирача сміття відповідно. Об'єкти, на які посилаються фантомні посилання, вже видалені, але вони залишають записи в черзі фантомних посилань.

🔍 У тебе є питання про типи посилань у Java? Задай їх прямо зараз у коментарях нижче! 🤔

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів