Как найти Утечку памяти Java

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

Стандартный SQL не имеет чистого способа принудительного ограничения ограничений подтипа.

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

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

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

138
задан Community 23 May 2017 в 12:09
поделиться

9 ответов

Я использую следующий подход к нахождению утечек памяти в Java. Я использовал jProfiler с большим успехом, но я полагаю, что любой специализированный инструмент с построением графика возможностей (diffs легче проанализировать в графической форме) будет работать.

  1. Запускают приложение и ожидают до него, добираются до "стабильного" состояния, когда вся инициализация завершена, и приложение неактивно.
  2. Выполнение операция, подозреваемая в создании утечки памяти несколько раз, чтобы позволить любому кэшу, связанная с DB инициализация происходить.
  3. Выполнение GC и берут снимок памяти.
  4. Выполнение операция снова. В зависимости от сложности операции и размеров данных, которые являются обработанной операцией, возможно, должен быть выполнен несколько к много раз.
  5. Выполнение GC и берут снимок памяти.
  6. Выполнение разность для 2 снимков и анализируют его.

В основном анализ должен запустить с самой большой положительной разности, скажем, типами объектов и найти то, что вызывает те дополнительные объекты всунуть память.

Для веб-приложений, которые обрабатывают запросы в нескольких анализах потоков, становится более сложным, но тем не менее общий подход все еще применяется.

я сделал множество проектов, конкретно нацеленных на сокращение объема потребляемой памяти приложений и этого общего подхода с некоторыми специализированными тонкими настройками, и всегда обманываю работавший хорошо.

123
ответ дан 23 November 2019 в 23:29
поделиться

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

, Так как люди предлагают несколько инструментов (я только попробовал визуальный wm, так как я получил это в JDK и пробной версии JProbe), я, хотя я должен предложить свободное / инструмент с открытым исходным кодом основывался на платформе Eclipse, Память Анализатор (иногда ссылаемый как память SAP анализатор) доступный на http://www.eclipse.org/mat/ .

то, Что действительно прохладно об этом инструменте, - то, что он индексировал дамп "кучи", когда я сначала открыл его, который позволил ему показывать данные как сохраненная "куча" без ожидающих 5 минут для каждого объекта (в значительной степени, все операции были тоннами быстрее, чем другие инструменты, которые я попробовал).

при открытии дампа первый экран показывает Вам круговую диаграмму с самыми большими объектами (считающий сохраненную "кучу"), и можно быстро перейти вниз к объектам, которые являются к большому для комфорта. Это также имеет Находку, вероятно, пропускают подозреваемых, которые я может пригодиться reccon, но так как навигация была достаточно для меня, я действительно не вошел в него.

48
ответ дан 23 November 2019 в 23:29
поделиться

Инструмент является большой справкой.

Однако существуют времена, когда Вы не можете использовать инструмент: дамп "кучи" так огромен, он разрушает инструмент, Вы пытаетесь диагностировать машину в некоторой продуктивной среде, к которой у Вас только есть доступ оболочки, и т.д.

В этом случае, он помогает знать Ваш путь вокруг файла дампа hprof.

Ищут САЙТЫ, НАЧИНАЮТСЯ. Это показывает Вам, какие объекты используют большую часть памяти. Но объекты не смешаны только типом: каждая запись также включает идентификатор "трассировки". Можно затем искать ту "ТРАССИРОВКУ nnnn" для наблюдения главных немногих кадров стека, где объект был выделен. Часто, после того как я вижу, где объект выделяется, я нахожу ошибку, и я сделан. Кроме того, обратите внимание, что можно управлять, сколько кадров зарегистрировано в стеке с опциями к-Xrunhprof.

, Если Вы проверяете сайт выделения и не видите ничто плохого, необходимо запустить обратное построение цепочки с некоторых из тех живых объектов к корневым объектам, для нахождения неожиданной ссылочной цепочки. Это - то, где инструмент действительно помогает, но можно сделать то же самое вручную (хорошо с grep). Нет всего одного корневого объекта (т.е. объект, не подвергающийся сборке "мусора"). Потоки, классы и стековые фреймы действуют как корневые объекты и что-либо, на что они ссылаются, сильно не предмет коллекционирования.

, Чтобы сделать объединение в цепочку, посмотрите в разделе HEAP DUMP для записей с плохим идентификатором трассировки. Это возьмет Вас к Объекту или записи ARR, которая показывает идентификатор уникального объекта в шестнадцатеричном. Ищут все случаи того идентификатора для нахождения, у кого есть сильная ссылка к объекту. Следуйте за каждым из тех путей назад, поскольку они переходят, пока Вы не выясняете, где утечка. Посмотрите, почему инструмент так удобен?

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

13
ответ дан 23 November 2019 в 23:29
поделиться

Действительно необходимо использовать профилировщика памяти, который отслеживает выделения. Смотрите на JProfiler - их ""куча", Уокер" функция является великим, и у них есть интеграция со всем главным Java IDE. Это не свободно, но не случается так дорогой любой (499$ для единой лицензии) - записью ценности за 500$ времени, довольно быстро изо всех сил пытающегося найти утечку с менее сложными инструментами.

0
ответ дан 23 November 2019 в 23:29
поделиться

Существуют инструменты, которые должны помочь Вам найти свою утечку, как JProbe, YourKit, AD4J или Управление полетом JRockit. Последним является тот, который я лично знаю лучше всего. Любой хороший инструмент должен позволить Вам выполнить развертку к уровню, где можно легко определить, какие утечки, и где протекающие объекты выделяются.

Используя HashTables, Hashmaps или подобный является одним из нескольких способов, которыми можно acually пропустить память в Java вообще. Если бы я должен был найти утечку вручную, то я peridically распечатал бы размер своего HashMaps и оттуда нашел бы тот, где я добавляю объекты и забываю удалять их.

5
ответ дан 23 November 2019 в 23:29
поделиться

NetBeans имеет встроенного профилировщика.

1
ответ дан 23 November 2019 в 23:29
поделиться

Можно узнать путем измерения размера использования памяти после вызова сборщика "мусора" многократно:

Runtime runtime = Runtime.getRuntime();

while(true) {
    ...
    if(System.currentTimeMillis() % 4000 == 0){
        System.gc();
        float usage = (float) (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024;
        System.out.println("Used memory: " + usage + "Mb");
    }

}

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

Used memory: 14.603279Mb
Used memory: 14.737213Mb
Used memory: 14.772224Mb
Used memory: 14.802681Mb
Used memory: 14.840599Mb
Used memory: 14.900841Mb
Used memory: 14.942261Mb
Used memory: 14.976143Mb

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

0
ответ дан 23 November 2019 в 23:29
поделиться

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

4
ответ дан 23 November 2019 в 23:29
поделиться

Контроль этот экран бросил о нахождении утечек памяти с JProfiler. Это - визуальное объяснение @Dima Ответа Malenko.

Примечание: Хотя JProfiler не является бесплатным программным обеспечением, Но Пробная версия может справиться с текущей ситуацией.

0
ответ дан 23 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: