-3

У моего сервера есть какая-то утечка памяти или что-то в этом роде, использование процессора Java увеличивается до 100% за час и после многих часов оно перескакивает до 1100%.Утечка памяти Java (Loop Traversing)

Мне было интересно, может ли это перемещение цикла вызвать утечку памяти.

for (Object o : friends.values()) { 
    doSomethingWith(o); 
} 

друзей является ConcurrentHashMap и его содержание может меняться в некоторых ситуациях, когда друг идет онлайн или оффлайн.

Если это безопасно, как я могу найти утечку памяти?

Заранее спасибо.

+2

@MitchWheat На Linux с достаточным количеством ядер [он может] (HTTP: // StackOverflow .com/questions/14579124/why-do-whiletrue-without-thread-sleep-cause-100-cpu-use-on-linux-but) ... – assylias

+0

@MitchWheat, вы ошибаетесь. В Linux использование процессора, по-видимому, представлено для каждого ядра. Таким образом, 2 ядра с 100% -ным использованием будут отображаться как 200% –

+2

@Matthew Kirkley: вздох! есть разница с тем, что показано и что на самом деле правильно! –

ответ

2

вы можете использовать visualvm для мониторинга вашего приложения во время его работы.

Создание дампа памяти и использовать Eclipse, анализатор памяти, чтобы изучить ваш дамп

Вы должны быть в состоянии получить более подробную информацию с помощью этих инструментов

+0

У меня возникают трудности при подключении удаленно. В системе разработки (мой компьютер) я не вижу ничего необычного. После развертывания на сервере и ожидания 1-2 часа, скачки использования на 100%. Я не пробовал ничего нового (например, новую структуру данных или другой тип класса) в своих последних дополнениях к коду. – berkayk

+0

Предыдущие комментарии могут быть верными, что процент может исходить из других ядер и поддерживать больше потоков с вашего сервера. [некоторые статьи] (http://java.dzone.com/articles/high-cpu-troubleshooting-guide) – user1549804

+0

jvisualvm помог мне найти бесконечный цикл. Благодарю. – berkayk

1

ConcurrentHashMap является поточно действительно. поэтому я не думаю, что это основная причина утечки памяти. на самом деле, если у вас есть некоторые ужасные или тяжелые коды в вашем коде 'doSomethingWith', это вызовет проблему с загрузкой процессора. Ошибка утечки памяти - это не то же самое, что у процессора высокая скорость. утечка памяти означает, что память приложения увеличивается непрерывно, а не ниже.

+0

Я не делаю ничего тяжелого на doSomethingWith, я просто получаю соединение и отправляю сообщение, как я использовал на всем сервере. – berkayk

+0

Спасибо за ваш комментарий, я буду искать другие вещи. – berkayk

1

Прохождение цикла может привести к утечке памяти, но это будет зависеть от того, что происходит в вашем методе doSomethingWith (o).

Вы хотите, чтобы ваши руки на профилирующий инструмент, как http://www.ej-technologies.com/download/jprofiler/files

или бесплатный инструмент, такие как http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html

+0

Спасибо за ваш комментарий. Мне нужно настроить профилирование, чтобы посмотреть, что происходит. – berkayk

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