Если объект в памяти не имеет ссылки, это означает, что объект больше не используется, и он может стать кандидатом на сборку мусора. Однако, поскольку время выполнения коллекционера мусора неясно, фактическое время утилизации объектов, которые могут быть собраны мусором, неясно. Для объекта, пока есть ссылка, он всегда будет существовать в памяти. Если есть все больше и больше таких объектов, превышающих общую память в JVM, JVM принесет ошибку Outpmemory. Хотя конкретная работа сбора мусора контролируется JVM, разработчики все еще могут в определенной степени взаимодействовать с коллекционером мусора, и цель состоит в том, чтобы лучше помочь коллекционеру мусора управлять памятью приложения. Этот метод взаимодействия состоит в том, чтобы использовать пакет java.lang.ref, представленный JDK 1.2.
1 сильная цитата
Сильные цитаты являются наиболее распространенными цитатами. Если у объекта сильная ссылка, сборщик мусора никогда не переработает его. Когда пространство памяти недостаточно, виртуальная машина Java предпочел бы достать ошибку OutofmemoryError, чтобы заставить программу прекратить ненормально, и не будет перерабатывать объекты с сильными ссылками, чтобы решить проблему недостаточной памяти.
Например, дата даты = новая дата (), дата является сильной ссылкой на объект. Сильные ссылки на объекты могут быть переданы повсюду в программе. Во многих случаях несколько ссылок будут указывать на один и тот же объект одновременно. Существование сильных ссылок ограничивает время выживания объекта в памяти. Если объект A содержит прочную ссылку на объект B, то в целом время выживания объекта B не будет короче, чем объект A. Если объект A явно не устанавливает ссылку на объект B на NULL, только после того, как объект A собирается мусор, объект B больше не будет иметь ссылки, указывающего на него, и будет возможна возможность получить возможность для сбора мусора.
Пример кода:
пакет com.skywang.java; public class strongReferencetest {public static void main (string [] args) {mydate date = new mydate (); System.gc (); }} Результаты работы:
<Нет вывода>
Результат показывает, что, несмотря на то, что сборы мусора явно называются, это является сильной ссылкой на дату, а дата не переработана.
В дополнение к сильным ссылкам, пакет java.lang.ref предоставляет различные справочные методы для объекта. У коллекционера мусора JVM есть разные способы обработки различных типов ссылок.
2 мягкие цитаты
Если у объекта есть только мягкие ссылки, пространство памяти достаточно, и сборщик мусора не будет перерабатывать его; Если пространство памяти недостаточно, память этих объектов будет переработана. Пока сборщик мусора не перерабатывает его, объект может использоваться программой. Мягкие ссылки могут использоваться для реализации чувствительных к памяти кэшам.
Мягкая ссылка может быть использована в сочетании с эталонной очередью (reference quieue). Если объект, на который ссылается мягкая ссылка, переработана коллекционером мусора, виртуальная машина Java добавит мягкую ссылку на связанную справочную очередь.
Мягкие ссылки слабее, чем сильные ссылки в силе, и представлены Softreference. Его функция состоит в том, чтобы сообщить коллекционеру мусора, который объекты в программе менее важны и могут быть временно переработаны, когда память недостаточно. Когда в JVM недостаточно памяти, сборщик мусора освободит объекты, на которые указывают только мягкие ссылки. Если все эти объекты будут выпущены и память недостаточно, будет выброшена ошибка переоборудования. Мягкие ссылки идеально подходят для создания кэши. Когда системы недостаточна, содержимое в кэше может быть выпущено. Например, рассмотрим программу редактора изображений. Программа будет прочитать все содержимое файла изображения в память для легкой обработки. Пользователи также могут открывать несколько файлов одновременно. Когда в то же время открывается слишком много файлов, это может вызвать недостаточную память. Если мягкие ссылки используются для указания на содержимое файла изображения, коллектор мусора может при необходимости восстанавливать эту память.
Пример кода:
пакет com.skywang.java; импортировать java.lang.ref.softreference; открытый класс softreferenceStest {public static void main (string [] args) {softreference ref = new softreference (new mydate ()); SERECTENCETEST.DrainMemory (); }} Результаты работы:
<Нет вывода>
Результаты: Когда память недостаточно, мягкая ссылка прекращается. Когда мягкие ссылки запрещены,
Softreference ref = new softreference (new mydate ()); serfectEntest.drainmemory ();
Эквивалентно
Mydate date = new mydate (); // Это до jvm, чтобы запустить if (jvm. insuft memory ()) {date = null; System.gc ();} 3 слабых цитат
Слабая ссылка слабее, чем мягкая ссылка в силе, и выражается классом ShideReference. Его цель состоит в том, чтобы ссылаться на объект, но он не мешает переработке объекта. Если используется сильная ссылка, пока существует ссылка, ссылочный объект не может быть переработан. У слабых цитат нет этой проблемы. Когда коллекционер мусора работает, если все ссылки на объект являются слабыми ссылками, объект будет переработан. Функция слабых ссылок состоит в том, чтобы решить взаимосвязь связи между объектами во время выживания, вызванных сильными ссылками. Наиболее распространенное использование слабых ссылок - в классах сбора, особенно в хэш -таблицах. Интерфейс хеш -таблицы позволяет использовать любой объект Java в качестве ключа. Когда пара клавишных значений помещается в хэш-таблицу, сам объект хэш-таблицы имеет ссылку на эти ключевые и значения объектов. Если эта ссылка является сильной ссылкой, то до тех пор, пока сам объект хеш -таблицы все еще жив, объекты ключа и значения, содержащиеся в нем, не будут переработаны. Если хеш-таблица с длительным временем выживания содержит много пар ключевых значений, она может в конечном итоге потреблять всю память в JVM.
Решение этой ситуации состоит в том, чтобы использовать слабые ссылки на ссылку на эти объекты, чтобы объекты ключа и значения в хэш -таблице могли быть собраны мусором. SleedHashmap предоставляется в Java для удовлетворения этой общей потребности.
Пример кода:
пакет com.skywang.java; импорт java.lang.ref.weakreference; открытый класс SleedReerEncetest {public static void main (string [] args) {SleedReference ref = new SleaseReference (new MyDate ()); System.gc (); }} Результаты работы:
OBJ [Дата: 1372142034360]
Результаты: когда работает сборы мусора JVM, слабые ссылки прекращаются.
ShideReference ref = новый SleedReference (New MyDate ()); System.gc ();
Эквивалентно:
Mydate date = new mydate (); // Сбор мусора if (jvm. insuffit memory ()) {date = null; System.gc ();} Разница между слабыми ссылками и мягкими ссылками состоит в том, что объекты с только слабыми ссылками имеют более короткий жизненный цикл. Во время процесса сканирования резьбы для коллектора мусора в области памяти под ее юрисдикцией, как только объект со слабыми ссылками будет обнаружен, ее память будет переработана независимо от того, является ли текущее пространство памяти достаточным или нет. Однако, поскольку сборщик мусора является поток с очень низким приоритетом, он не обязательно будет обнаружен очень быстро для объектов, которые имеют только слабые ссылки.
Слабая ссылка может использоваться в сочетании с эталонной очередью (REGURESTEAUE). Если объект, на который ссылается слабая ссылка, собирается мусор, виртуальная машина Java добавит слабую ссылку на связанную справочную очередь.
4 Иллюзии цитаты
Также известный как призрачные цитаты ~ перед введением цитат -призраков, мы должны сначала представить механизм завершения объекта, предоставленный Java. В классе объекта есть метод завершения. Первоначальное намерение его дизайна состоит в том, чтобы выполнить некоторые работы по очистке до того, как объект фактически будет переработан. Поскольку Java не предоставляет механизм, похожий на деструктор C ++, он реализуется с помощью метода завершения. Но проблема в том, что время выполнения коллектора мусора не является фиксированным, поэтому фактическое время выполнения этих чистящих работ не может быть предсказано. Призрачная ссылка может решить эту проблему. При создании призрачного эталонного PhantomReference вы должны указать справочную очередь. Когда был вызван метод завершения объекта, в очередь будет добавлена ссылка на призрак объекта. Проверяя содержимое в очереди, вы узнаете, готов ли объект для переработки.
Использование призрачных ссылок и их очередей встречается редко и в основном используется для реализации относительно тонкого контроля использования памяти, что очень значимо для мобильных устройств. Программа может запросить память для создания нового объекта после определения того, что объект должен быть переработан. Таким образом, память, потребляемая программой, может поддерживаться в относительно низком количестве.
Например, следующий код приводит пример реализации буфера.
открытый класс Phantombuffer {private byte [] data = new Byte [0]; Private ReferenceQueue <byte []> queue = new Referencequeue <byte []> (); Private PhantomReference <byte []> ref = new PhantomReference <byte []> (данные, очередь); public byte [] get (int size) {if (size <= 0) {бросить новый allosalArgumentException («неправильный размер буфера»); } if (data.length <size) {data = null; System.gc (); // force запустить коллектор мусора try {queue.remove (); // Этот метод будет блокироваться до тех пор, пока очередь не станет непустым ref.clear (); // Ссылка на призрак не будет автоматически очищена, вы должны запустить ref = null; data = новый байт [размер]; ref = new PhantomReference <byte []> (данные, очередь); } catch (прерванное искусство e) {e.printstacktrace (); }} вернуть данные; }} В приведенном выше коде каждый раз, когда применяется новый буфер, сначала гарантируется, что байтовый массив предыдущего буфера был успешно переработан. Метод удаления, который ссылается на очередь, будет блокироваться до тех пор, пока в очередь не будет добавлена новая ссылка на призрака. Тем не менее, следует отметить, что этот подход приведет к тому, что коллекционер мусора будет работать слишком много раз, что может привести к тому, что программа будет слишком низкой пропускной способностью.
Пример кода:
пакет com.skywang.java; импорт java.lang.ref.referenceue; импорт java.lang.ref.phantomReference; public class phantomReferenceStest {public static void main (string [] args) {rekergeue Queue = new Referencequeue (); PhantomReference Ref = новый PhantomReference (New MyDate (), очередь); System.gc (); }} Результаты работы:
OBJ [Дата: 1372142282558] является GC
Результат показывает, что ссылка на иллюзию прекращается после экземпляра.
Reightqueue queue = new Referencequeue (); PhantomReference ref = new PhantomReference (new MyDate (), Queue); System.gc ();
Эквивалентно:
Mydate date = new mydate (); date = null;