Недавно брал интервью у Java-программиста, который даже не понимает ссылки

Java

[Точка галантереи] Прочитав эту статью, вы можете в основном ответить на вопрос интервью [рассказать о понимании нескольких ссылок в Java].

Недавно был вопрос интервью

Расскажите о понимании нескольких ссылок в Java.

Поэтому я планирую использовать этот вопрос интервью в качестве примера для написания статьи о том, что такое ссылка в Java и как ее использовать. [Ключевые моменты: дайте вам три секунды, чтобы подумать, как бы вы ответили на этот вопрос интервьюера, если бы это были вы]

что такое цитата

[акцент] Ссылки на Java включают:

  • Сильная ссылка FinalReference
  • Мягкий справочник SoftReference
  • Слабая ссылка WeakReference
  • PhantomReference

Так почему эти четыре цитата при условии, основными причинами являются:

  • Облегчение JVM для сборки мусора
  • Разработчикам удобно использовать, и разработчики могут гибко решать жизненный цикл тех или иных объектов

Как использовать это в ежедневной разработке

Примените то, что мы узнали, так как же мы используем эти ссылки в нашей повседневной жизни? Далее я дам соответствующую демонстрацию! ! !

Сильная ссылка FinalReference

Подобно Object o = new Object(), после создания объекта ссылка будет сохранена в стеке JVM, и пока существует сильная ссылка, сборщик мусора не вернет объект, на который указывает ссылка.

ежедневное использование

Есть много примеров сильных ссылок, потому что в повседневной разработке мы часто переходим к новому объекту, а новый объект является сильной ссылкой, то есть пока ссылка существует, сборщик мусора не соберет ее. . [Акцент: как JVM узнает, есть ли ссылка? 】

Мягкий справочник SoftReference

Объекты, связанные с мягкими ссылками, будут включены в область сбора мусора при нехватке памяти, а затем переработаны, что означает, что мягкие ссылки не являются полностью безопасными, а в случае нехватки памяти он будет собран сборщиком мусора. .

дать демо

2.png

Из комментариев вы можете узнать, что здесь я создаю несколько больших объектов, а затем помещаю их в массив softReferences, а затем просматриваю и печатаю имена объектов в них.Результаты печати следующие:

3.png

Из результатов видно, что первые четыре объекта были утилизированы сборщиком мусора из-за нехватки памяти.

ежедневное использование

В проекте нашей компании некоторые используют мягкие ссылки для сохранения данных, взятых из базы данных. В частности, инкапсулируется средний уровень. Функция среднего уровня состоит в том, чтобы судить, являются ли данные нулевыми при получении данных. , если они нулевые чтобы снова прочитать из базы данных, а затем поместить ее в коллекцию мягких ссылок после чтения, этот подход может избежать переполнения памяти.

Слабая ссылка WeakReference

Слабые ссылки слабее, чем мягкие ссылки.Объекты, связанные со слабыми ссылками, могут существовать только до следующей сборки мусора.То есть, когда происходит GC, независимо от того, достаточно ли текущей памяти, он будет переработан.

дать демо

4.png

Код очень короткий, то есть сначала создайте объект слабой ссылки, а затем распечатайте его перед gc, чтобы доказать, что он существует, затем вручную вызовите gc, распечатайте его снова, и вы увидите, что он исчез. Текущий результат выглядит следующим образом

5.png

PhantomReference Фантомная ссылка

Отличие виртуальных ссылок от приведенных выше в том, что наличие у объекта виртуальных ссылок никак не влияет на его время жизни, а также невозможно получить экземпляр объекта через виртуальные ссылки, а значит, на него нет ссылки. Как и ассоциации, они могут быть утилизированы сборщиком мусора в любое время.

Так что легко задаться вопросом, какова роль виртуальных ссылок?

Функция состоит в том, чтобы получать системное уведомление, когда объект утилизируется сборщиком, и отслеживать действия сборщика мусора, например, когда объект утилизируется, будет вызываться метод finalize объекта.

Прежде чем дать соответствующую демонстрацию, мы должны сначала представить

Эталонная очередь ReferenceQueue

Ссылку ReferenceQueue также можно резюмировать как член ссылки, который можно использовать в сочетании с тремя указанными выше типами ссылок [мягкая ссылка, слабая ссылка, виртуальная ссылка].

Так что же он делает?

Когда вы создаете ссылку, вручную регистрируете в очереди ссылок, тогда как когда на объект ссылается сборщик мусора ссылок, JVM будет помещена в очередь в ссылке, и мы можем делать другие дела в этой очереди, эквивалентный механизм уведомления.

дать демо

6.png

Вы можете увидеть использование очереди из демонстрации, и результаты печати выглядят следующим образом.

7.png

Из результата видно, что объект, полученный из ссылки, сначала является нулевым, что доказывает, что экземпляр объекта нельзя получить через виртуальную ссылку, и он будет помещен в очередь после повторного использования.

Понятия, связанные со ссылкой

Прежде всего, чтобы облегчить управление JVM, Reference имеет состояние и может быть разделен на следующие четыре состояния.

  • Active Вообще говоря, память выделяется в начале, и когда доступность объекта, на который указывает ссылка, изменяется, сборщик мусора помещает ссылку в очередь ожидания и меняет свое состояние на состояние ожидания.
  • pending относится к объектам, готовым к помещению в очередь ожидания.
  • enqueue означает, что память объекта была восстановлена.
  • inactive Это конечное состояние, и его нельзя изменить ни на какое другое состояние.

Как JVM узнает, присутствует ли ссылка?

Что касается того, как JVM узнает, присутствует ссылка или нет, это включает в себя алгоритм анализа достижимости JVM. Простая идея алгоритма анализа достижимости JVM состоит в том, чтобы использовать серию корней GC в качестве отправной точки для поиска вниз, а путь, пройденный поиском, называется цепочкой ссылок, Когда объект недоступен, это доказывает, что объект недоступен и может быть переработан. Как показано ниже

6.png

Объекты 4, 5 и 6 подлежат вторичной переработке. Итак, вопрос в том, какие объекты можно использовать в качестве GC Roots? Вот несколько, как показано ниже

  • Объекты, на которые есть ссылки в стеке виртуальной машины

  • Объект, на который ссылается статическое свойство класса в области метода

  • Объект, на который ссылается константа в области метода

  • Объекты, на которые ссылается собственный стек методов JNI

Если вы хотите провести более глубокое исследование, вы можете воспользоваться Baidu и Google самостоятельно или подождать, пока я проанализирую его позже.

последний из последних

Эта статья в основном отвечала [говорить о понимании нескольких ссылок в Java]. Если вы хотите изучить более глубоко, вы должны начать с исходного кода. В следующий раз, когда вы столкнетесь с таким вопросом на собеседовании, в основном не паникуйте, потому что на самом деле, пока вы внимательно читаете статью и помните несколько ключевых моментов, интервьюер, по сути, не будет вас спрашивать, а статья Это также отвечает на вопросы [Как JVM узнает о наличии или отсутствии ссылок] и [Какие объекты можно использовать в качестве корней сборщика мусора].

Добро пожаловать в [Fan Talks Programming] и поделитесь тем, что вы видели, слышали, узнали и сделали на фабриках первого уровня!