Подтвердить что ты не робот

Утечка ClassLoader - стоит ли их решать?

ClassLoader утечки обычно приводят к java.lang.OutOfMemoryError: PermGen. В случае работы на серверах приложений вы можете увидеть это в результате много перераспределения общего приложения. Объяснение и возможные решения этой проблемы можно увидеть по этим двум ссылкам. (среди прочих)

http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/17/the-unknown-generation-perm/ http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

Теперь по большей части их легко обойти. Просто увеличьте -XX: MaxPermSize, и когда это произойдет, перезапустите JVM полностью. Проблема с попыткой решить эту проблему заключается в том, что в больших приложениях многие классы могут вызвать утечку класса загрузчика и, следовательно, классы оставаться в пределах permgen.

Из этого вытекают два вопроса:

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

Существуют ли более простые способы устранения утечки загрузчика класса?

4b9b3361

Ответ 1

Это действительно зависит от приложения, или, скорее, от используемого процесса развертывания. Во время разработки многие приложения только повторно обрабатываются, новые выпуски происходят раз в несколько месяцев, а сервер приложений перезапускается по другим причинам гораздо чаще, чем приложение развертывается. В этих обстоятельствах утечка Classloader является пустой тратой времени.

Конечно, если вы планируете внедрить процесс непрерывного развертывания особенно в среде с высокой доступностью, то утечки Classloader - это то, что вы действительно нужно заняться. Но есть много других вещей, которые вам нужно сделать лучше, чем большинство проектов, прежде чем это станет проблемой.

Ответ 2

@biziclop прав. Вы должны быть прагматичными по этому поводу.

Если проблема связана только с тестовыми серверами, возможно, вы можете отказаться от этого, так как не стоит пытаться решить.

Если проблема возникает на рабочих серверах, вам необходимо решение или обходной путь. Решение - это тяжелая работа, но обходные решения могут быть меньше:

  • Обходной путь №1 - не выполнять горячие развертывания на рабочих серверах; только выполнять перераспределения и перезагрузки.

  • Обходной путь №2 - периодически выполнять полный перезапуск производственных серверов, чтобы избежать нехватки пространства. Объедините это с увеличением пространства пермгенов.

В хорошо сбалансированной/хорошо работающей среде вы должны выполнять все свои тесты на отдельных серверах. Если время простоя полного развертывания вызывает беспокойство, вы должны минимизировать передислокационные сбои, используя репликацию сервера и прогрессивное перераспределение. Не рекомендуется использовать горячие установки для производства.

Если вы находитесь в положении, когда у вас нет тестовой среды, и вы часто посещаете горячую разводку на производственной машине, чтобы свести к минимуму время простоя, вы катаетесь на тонких льдах. Скорее всего, вы в конечном итоге допустите ошибку, которая приведет к повреждению, которое требует много времени, чтобы оправиться от...

Ответ 4

Это одна из худших утечек... но любая утечка зла. Поэтому я лично их разрешу. Также помогает профилирование. Способов нет, но:

  • Темы идут в threadGroups + стартовый поток для каждого модуля, чтобы гарантировать, что новые Threads() имеют эту группу.
  • Особая забота о Thread.inheritedAccessControlContext(которая содержит ссылку на загрузчик классов)
  • WeakReferences, когда вам нужно сохранять классы, на самом деле использовать WeakReferences для слушателей, поэтому никто не может пропустить де-регистры (и использовать только annon. clasess). Наличие рамок для WeakListeners действительно помогает.
  • Дополнительная помощь для дисков DB, ​​java.security.Provider
  • несколько трюков (включая динамическое расширение файлов классов, но это переполнение обычно)

нижняя строка:


утечки злы.

Ответ 5

Я применил бы проблему прагматично:

  • Это вызывает проблемы в производственных средах?
  • У вас есть достаточно времени и ресурсов для отслеживания этого?

Если ответ на оба этих вопроса да, то непременно пойти на это. Если он один да, то нет, это, вероятно, до руководства, чтобы решить, если оба носа, не беспокойтесь.