Как я узнаю, что у меня есть утечка в Java? - PullRequest
1 голос
/ 09 августа 2010

Я запускаю свое приложение, используя профилировщик Netbeans, и тип char кажется очень активным. Я вижу, как число поколений достигает 180 поколений, а затем падает до 80 и поднимается, и в среднем оно составляет 160 поколений.

Трудно сказать, потому что это пользовательское приложение сервера TCP / IP, которое использует JDBC, Hibernate и пулы соединений.

1- Если число поколений идет вверх и вниз, можно предположить, что это нормально? Только если он продолжает расти и подниматься и никогда не падает, тогда есть потенциальная проблема?

2 - График генерации Netbeans продолжает расти. В конце моего стресс-теста это было на 20000 поколений. Является ли график итоговым со временем? Я в замешательстве, потому что, глядя на результаты в реальном времени, поколения, как упоминалось выше, идут вверх и вниз для типа символа.

3- При ручном вызове сборщика мусора из профилировщика память, кажется, падает обратно вниз. Итак, я думаю, что это тоже нормально?

Ответы [ 3 ]

1 голос
/ 09 августа 2010
  • 1) Да.Он повышается из-за всех созданных экземпляров и понижается, когда запускается сборщик мусора.
  • 3) Ну, да, вы делаете 1 вручную.Это не должно быть необходимым, хотя.

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

Он может немного увеличиться, если вы введете разные части кода, так как классы загружаются и, возможно, создается статика.

На самом деле, очень трудно идентифицировать утечку, не зная выбранных путей кода.У меня были утечки, которые не проявлялись до тех пор, пока не было обработано около 100000 сообщений, и возникли проблемы только после нескольких недель работы.

Также см. Этот ТАК вопрос об идентификации этих утечек .

0 голосов
/ 09 августа 2010

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

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

0 голосов
/ 09 августа 2010

Обычно я подхожу к предполагаемой утечке памяти:

  • , чтобы приложение какое-то время запускалось в производственной среде (не в вашей IDE)
  • запускает приложениенапишите Java heapdump
  • , используйте IBM alphaworks HeapAnalyzer для проверки и поиска возможных проблемных мест
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...