Я работал над утечкой загрузчика в нашем приложении и, наконец, дошел до того, что все ссылки на CL исчезли. В моем инструменте профилирования памяти (с использованием MyKit и jmap/jhat) я могу заставить GC, который иногда сразу же избавится от моего загрузчика классов, но затем в другое время (зависит от использования приложения, но это так же специфично, как я могу получить), когда я вынуждаю GC, экземпляр CL не исчезает. Я фиксирую снимок памяти и просматриваю результаты, и он говорит, что этот объект существует, но недоступен.Зачем так долго ждать JVM для GC моего недостижимого объекта?
Вот сумасшедшая часть ... и я обнаружил это случайно.
Я могу заставить все GC полностью хотеть, но экземпляр просто не исчезает. ОДНАКО, через 10-20 минут, если я сделаю еще один полный GC, это будет .
(В течение этого периода времени приложение является в основном неактивным (не полностью). Мой «расширенной» кофе-брейк был несчастный случай, который привел к этому открытию.)
Так мое беспокойство по поводу утечки здесь больше нет (надеюсь), но теперь вопрос заключается в попытке объяснить это поведение.
Кто-нибудь знает, что может заставить ВС JVM решить не собирать недостижимый загрузчик классов в течение 20 минут?
ВС JVM версия деталь:
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
Это может быть полезно: http://java.sun.com/developer/technicalArticles/javase/finalization/ – Jeremy
Возможно, еще один бит информации имеет значение: здесь я использую параллельный сборщик. – Scott
Мой опыт совсем такой же, как у вас, и я всегда мог только объяснить это так, как надлежащий GC является сложной задачей. Интересная «дискуссия» об этом идет здесь: http://stackoverflow.com/questions/176745/circular-references-in-java. Есть некоторые особые случаи, которые обрабатывает сборщик мусора, один из которых является Class Loaders, а другие - слабыми ссылками. Если вам случится это доказать, прочитав какой-то фактический исходный код GC или _proven_ answer, отправьте его здесь. Еще одна статья, подробно обсуждающая GC в Java5: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html –