2015-11-12 2 views
4

У меня есть приложение Java с историей, и оно использует WeakReferences для кеширования. Я сделал несколько кучи и увидел, что все они содержат много объектов со слабыми ссылками (10% -15% от размера кучи, ~ 1,2 ГБ).Когда GC удаляет объекты, имеющие только слабые ссылки?

  • Означает ли это, что слабые ссылки создают давление памяти на JVM?
  • И заставляет FullGC останавливать паузу?

P.S. Я знаю, что WeakReference производит ограничение производительности для GC для CMS, потому что это делает алгоритм более сложным. Но видел ли кто-нибудь документ или какую-то официальную информацию об этом? Я нашел только это SO post.

ответ

1

Компания Object Computing, Inc. сделала презентацию по этому вопросу, которую я нашел полезной в прошлом. Вот выдержка:

Виды Ссылки на объект

  • Сильных ссылки
  • SoftReference
  • GC'ed в любое время после того, как там нет сильных ссылок на референт, но, как правило, сохраняется до памяти низкий
  • может использоваться для реализации кешей объектов, которые могут быть воссозданы при необходимости

WeakRefernence

  • GC'ed в любое время после того, как там нет сильных или мягких ссылок на референт
  • часто используются для «канонических отображений», где каждый объект имеет уникальный идентификатор (один-к-одному), а также в сборниках «слушателей»

«Для мягких и слабых ссылок получатель возвращает нулевой метод, когда объект референта был GC'ed».

ИСТОЧНИК: http://java.ociweb.com/mark/other-presentations/JavaGC.pdf

Это наводит на мысль SoftReference является выхода на выбор для кэшированных объектов.

На практике я использовал гуавы кэширования API, и пусть управлять ими: https://github.com/google/guava/wiki/CachesExplained

+0

Спасибо за ваш ответ, но он не отвечает на мой вопрос :) Для кеша я предпочитаю [Encache] (http://www.ehcache.org), потому что у него много опций, фасоль, статистика, и т. д. Но в случае этой темы я интересуюсь **, когда ** GC удаляет объекты с помощью WeakReference. – Jimilian

1

Означает ли это, что слабые ссылки производят давление памяти на виртуальной машине Java?

Нет. Слабые ссылки не влияют на GC вообще. Они просто дают вам способ отслеживать это.

И заставляет FullGC отключить паузу?

No.

+0

Итак, с точки зрения производительности GC нет никакой разницы между использованием и использованием WeakReference? И удаление WeakReference не увеличивает производительность? – Jimilian

+0

И знаете ли вы, когда GC очищает объект с помощью WeakReference? Например, в алгоритме CMS. – Jimilian

+0

Я уже ответил на ваш первый вопрос. Ответ на второй вопрос в основном «когда угодно». – EJP