Общие шаблоны утечки памяти / эталонной памяти Java? - PullRequest
13 голосов
/ 22 марта 2009

Возможно, наиболее типичным примером является неправильное закрытие JDBC и неправильная обработка возможных исключений. Мне очень любопытно увидеть другие примеры, которые вы видели - предпочтительно связанные с веб-приложениями.

Итак, есть ли какие-либо распространенные шаблоны утечек в Java?

Ответы [ 3 ]

17 голосов
/ 22 марта 2009

Два ключевых шаблона «эффективной утечки» в моем опыте:

  • Статика и синглтоны, которые постепенно растут со временем. Это может включать кеши, плохо реализованные и используемые пулы соединений, словари «каждого пользователя, которого мы видели с момента запуска» и т. Д.
  • Ссылки из долгоживущих объектов на объекты, которые предназначались как недолговечные. В C # это может происходить с событиями, и эквивалентный шаблон наблюдателя может дать такой же эффект в Java. В основном, если вы просите один объект (наблюдателя) наблюдать за другим (источником), то вы обычно получаете ссылку от источника до наблюдателя. Это может оказаться единственной «живой» ссылкой, но она будет жить так же долго, как и источник.
  • Утечка Permgen, если вы продолжаете генерировать новый код динамически. Здесь я нахожусь в сложном положении, но я почти уверен, что столкнулся с такими проблемами. Возможно, это было отчасти из-за ошибок JRE, которые с тех пор были исправлены - прошло слишком много времени с тех пор, как я вспомнил наверняка.
  • Модульные тесты, которые держат состояние, могут длиться дольше, чем вы ожидаете, потому что JUnit будет удерживать экземпляры тестового набора. Опять же, я не могу вспомнить детали, но иногда это стоит того, чтобы в разборке было явное «обнуление переменной», как это выглядит анахронизмом.

Я не могу сказать, что я регулярно сталкиваюсь с утечками памяти в Java (или .NET).

6 голосов
/ 22 марта 2009

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

1 голос
/ 25 мая 2009

Утечки PermGen могут произойти из-за:

  • Потоки демонов, которые остаются в живых после того, как ваше приложение не развернуто.
  • Отключающие крюки, зарегистрированные в JVM
  • Переменные ThreadLocal, где значение имеет ссылку на класс, загруженный вашим загрузчиком классов

Это все веб-приложения. Они не происходят в стандартных приложениях Java.

...