Есть ли способ заставить FORCE слабые и / или мягкие объекты, на которые ссылаются, быть GC'd в Java? - PullRequest
12 голосов
/ 06 августа 2011

Вот мой вариант использования. Мы пытаемся сузить потенциальную утечку памяти в приложении, и мы используем инструмент анализа памяти, чтобы сделать снимок кучи, чтобы мы могли искать экземпляры объектов и ссылки. (Если это поможет, мы используем YourKit.)

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

После запуска нашего тестового примера мы ожидаем, что все жесткие ссылки на объект X и его загрузчик классов исчезнут, но, поскольку в конце тестового примера было задействовано много прокси, у нас осталось много слабых / мягких ссылок. (Я могу найти только ссылки WeakHashMap, но YourKit объединяет слабые и мягкие ссылки в одну позицию в сводке, поэтому я не могу быть уверен, что где-то не пропущена мягкая ссылка.)

Это верно даже после запроса полного GC от JVM. (Использование JDK sun 1.6.0_23 в режиме сервера.)

Это кажется , как будто JVM допускает, что есть только слабые / мягкие ссылки на эти объекты, но я не могу заставить это GC эти вещи быть на 100% уверенными. (Итак, я хочу, чтобы это полностью исчезло из кучи и использование permgen загрузчиком классов также исчезло.)

Кто-нибудь знает способ настроить и / или заставить JVM распоряжаться объектами, имеющими только мягкие / слабые ссылки?

1 Ответ

10 голосов
/ 06 августа 2011

Вызов GC должен всегда освобождать все слабо достижимые объекты (при условии, что «запрос», сделанный путем вызова System.gc, фактически удовлетворен). Если слабые ссылки не очищаются GC, это означает, что объекты, по крайней мере, мягко достижимы.

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

...