2014-08-29 3 views
4

Из-за вопроса Creating a memory leak with Java существует множество способов создания утечек памяти в Java, но я просто пытаюсь создать простую утечку памяти и как-то наблюдать ее эффект. На самом деле, пытаясь создать утечку памяти, я хотел бы проверить, что (в цифрах или что-то еще), чтобы я убедился, что утечка памяти была успешно создана. Можем ли мы исследовать возникновение утечки памяти в нашем коде, не используя стороннее приложение, просто вставив, например, runtime.maxMemory() в нашем коде?Как проверить утечку памяти в Java

+0

Для вас рассматривается [VisualVM] (http://visualvm.java.net/), который является частью JDK (с 6, если я не ошибаюсь) в качестве стороннего инструмента/приложения? –

ответ

3

Это заменитель бедного-человек для инструмента профилирования памяти:

public static long bytesOccupied() { 
    final Runtime rt = Runtime.getRuntime(); 
    for (int i = 0; i < 2; i++) rt.gc(); 
    return rt.totalMemory()-rt.freeMemory(); 
} 

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

В противном случае очень легко запустить VisualVM, который уже установлен на вашем компьютере с помощью JDK. Обязательно установите дополнительный плагин VisualGC. Сделайте свой код, сделав некоторые выделения в цикле, и наблюдайте, как происходит генерация генераций GC. Используйте короткое время выборки (100 или 200 мс), чтобы получить ощущение в реальном времени.

+0

Итак, ключом к созданию утечки памяти был вызов rt.gc() дважды? Можете ли вы объяснить, как работает ваш код - Спасибо (Потому что, если я не добавил это (\t \t символ [] ч = новый символ [100000000]; \t \t \t \t Строка й = новый String (ч);) до вызова кода Я не мог сгенерировать утечку памяти. –

+0

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

+0

Итак, почему там размещен rt.gc()? –

Смежные вопросы