Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Управление памятью в JAVA: Reference Objects API

Управление памятью в JAVA: Reference Objects API

Цель презентации - познакомить слушателя с Reference Objects API.

Stanislav Savulchik

May 22, 2014
Tweet

Other Decks in Programming

Transcript

  1. Актуальность • Reference Objects API имеет непосредственное отношение к работе

    сборщика мусора и, следовательно, с его помощью можно влиять на автоматическое управление памятью • изучение Reference Objects API является шагом к пониманию работы сборщика мусора
  2. • приложение оперирует объектами, которые создаются в куче с помощью

    оператора new • объекты занимают место в памяти и никогда не удаляются явно • память - ограниченный ресурс, который при таком подходе быстро закончится • следовательно, нужен способ нахождения и удаления неиспользуемых объектов для утилизации занимаемой ими памяти Зачем нужна сборка мусора?
  3. • сборка мусора освобождает программиста от ручного управления памятью, делая

    его более продуктивным • программист не может случайно "уронить" JVM, некорректно освобождая память, что гарантирует целостность программы • однако, сборка мусора может повлиять на производительность программы, т.к. несет некоторые издержки: ◦ требуются дополнительные циклы процессора и ◦ память • программист почти не может контролировать этот процесс: ◦ когда будет запущен сборщик мусора? Достоинства и недостатки сборки мусора
  4. • любой алгоритм сборки мусора должен выполнять две вещи: ◦

    обнаруживать объекты, ставшие мусором ◦ утилизировать занимаемую ими память • процесс обнаружения мусора обычно включает: ◦ определение корневого множества ссылок ◦ определение достижимости объектов из корневого множества • объекты, достижимые из корневого множества, считаются используемыми программой • недостижимые объекты считаются мусором Задачи сборщика мусора
  5. Корневое множество ссылок • включает: ◦ локальные переменные и аргументы

    методов ◦ статические переменные классов ◦ ссылки, зарегистрированные через JNI ◦ и другие • объекты, на которые ссылается корневое множество, считаются достижимыми • объекты, на которые ссылаются достижимые объекты, также считаются достижимыми (транзитивно)
  6. Достижимость объектов До версии Java 1.2 1 2 3 Достижимые

    объекты 4 5 6 7 8 9 Корневое множество Недостижимые объекты 10 11 12 13 13 13 13 Cсылка Достижимый объект Недостижимый объект
  7. • все объекты после создания находятся на этом уровне достижимости

    до тех пор, пока до них существует хотя бы один путь из корневого множества • объекты на текущем уровне достижимости не могут быть утилизированы сборщиком мусора • когда исчезает последний путь до объекта, он переходит на уровень Finalizable Уровни достижимости объектов До версии Java 1.2 Reachable Finalizable Unreachable
  8. Уровни достижимости объектов До версии Java 1.2 Reachable • объекты

    на текущем уровне не достижимы из корневого множества • однако, могут вновь стать достижимыми после "воскрешения" в финализаторе • после выполнения сборщиком мусора финализаторов объекты переходят на уровень Unreachable Finalizable Unreachable
  9. • объекты на текущем уровне не только не достижимы из

    корневого множества, но и уже не могут стать достижимыми • недостижимые объекты могут быть утилизированы сборщиком мусора Уровни достижимости объектов До версии Java 1.2 Reachable Finalizable Unreachable
  10. Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly

    Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable
  11. Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly

    Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable • существует путь из корневого множества до объекта не содержащий объектов-ссылок • объект остается сильно достижимым пока на него существует сильная ссылка из корневого множества или на него ссылается другой сильно достижимый объект • объект на текущем уровне достижимости не будет утилизирован сборщиком мусора
  12. Достижимость объектов С версии Java 1.2 1 2 Достижимые объекты

    5 6 7 11 10 Корневое множество Недостижимые объекты 13 14 18 19 15 17 16 12 3 4 8 9 Сильная ссылка Сильно достижимый объект Объект-ссылка Слабо достижимый объект Недостижимый объект
  13. Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly

    Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable • объект не является сильно достижимым • существует путь из корневого множества до объекта содержащий одну и более мягких ссылок • сборщик мусора может утилизировать такой объект при сборке, тогда он ◦ очищает все мягкие ссылки на объект ◦ добавляет ссылки в соответствующие очереди
  14. Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly

    Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable • объект не является сильно и мягко достижимым • существует путь из корневого множества до объекта содержащий одну и более слабых ссылок • сборщик мусора должен утилизировать такой объект при сборке, тогда он ◦ очищает все слабые ссылки на объект ◦ добавляет ссылки в соответствующие очереди
  15. Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly

    Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable • объект не является сильно, мягко и слабо достижимым • может быть "воскрешен" во время финализации
  16. • объект не является сильно, мягко и слабо достижимым •

    не был воскрешен во время финализации • существует путь из корневого множества до объекта содержащий одну или более фантомных ссылок • фантомные ссылки на объект ◦ будут добавлены в соответствующие очереди сборщиком мусора ◦ не будут автоматически очищены сборщиком мусора ◦ должны быть явно очищены в программе Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable
  17. • объект не является сильно, мягко, слабо и фантомно достижимым

    • не был воскрешен во время финализации • может быть утилизирован сборщиком мусора Уровни достижимости объектов С версии Java 1.2 Strongly Reachable Softly Reachable Weakly Reachable Finalizable Phantom Reachable Unreachable
  18. Reference Objects API java.lang.ref.Reference • представляет собой косвенную ссылку на

    объект называемый референтом • референт задается при создании ссылки • также, при создании ссылка может быть ассоциирована с очередью Reference(T referent) Reference(T referent, ReferenceQueue<? super T> queue) T get() void clear() boolean isEnqueued()
  19. Reference Objects API java.lang.ref.ReferenceQueue • очередь объектов Reference • ссылки

    помещаются в очередь сборщиком мусора в определенный момент их жизненного цикла • если ссылка появилась в очереди, значит уровень достижимости объекта изменился • приложение может: ◦ периодически опрашивать очередь с помощью poll() ◦ вызывать remove(), реализующий ожидание, если очередь пуста Reference<? extends T> poll() Reference<? extends T> remove(long timeout) Reference<? extends T> remove()
  20. Reference Objects API java.lang.ref.SoftReference • очистка мягких ссылок осуществляется сборщиком

    мусора при нехватке памяти ◦ сборщик мусора сам решает, когда наступает этот момент ◦ агрессивность очистки мягких ссылок можно настраивать с помощью ключа -XX:SoftRefLRUPolicyMSPerMB=1000 • гарантируется, что все мягкие ссылки будут очищены до того, как будет брошен java.lang.OutOfMemoryError • область применения: простое кэширование данных в памяти приложения SoftReference(T referent) SoftReference(T referent, ReferenceQueue<? super T> q)
  21. • слабые ссылки на объект должны быть очищены, если сборщик

    мусора определил, что объект стал слабо достижимым • область применения: создание таблиц, в которых ключи не препятствуют удалению записей из таблицы сборщиком мусора ◦ см. java.util.WeakHashMap WeakReference(T referent) WeakReference(T referent, ReferenceQueue<? super T> q) Reference Objects API java.lang.ref.WeakReference
  22. • обязательно ассоциируются с очередью при создании • невозможно получить

    сильную ссылку на референта: ◦ вызов get() всегда возвращает null, даже если ссылка не очищена • фантомные ссылки должны очищаться явно в приложении, сборщик мусора этого не делает (или сами ссылки должны становиться недостижимыми) • область применения: ◦ оповещение приложения перед удалением объекта из памяти, чтобы произвести необходимую "уборку" ◦ замена финализаторам, не подверженная проблеме воскрешения объекта PhantomReference(T referent, ReferenceQueue<? super T> q) Reference Objects API java.lang.ref.PhantomReference
  23. Источники 1. http://www.artima.com/insidejvm/ed2/gcP.htm 2. http://www.pawlan.com/monica/articles/refobjs 3. http://docstore.mik.ua/orelly/java-ent/jnut/ch13_01.htm 4. http://www.kdgregory.com/index.php?page=java.refobj 5.

    http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary. html 6. http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 7. http://google-collections.googlecode. com/svn/trunk/javadoc/com/google/common/base/package-summary.html 8. http://2013.codefest.ru/doklad/47