Есть ли способ, чтобы слабые и/или мягкие объекты FORCE были GC'd в Java?

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

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

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

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

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

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

Ответ 1

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

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