У меня работает J2EE-проект на JBoss с максимальным размером кучи 2048 м, что дает странные результаты при нагрузочном тестировании.Я провел сравнительный анализ использования кучи и процессора и получил следующие результаты (серия 1 - использование кучи, серия 2 - использование процессора):
http://i29.tinypic.com/m9ul1e.png
Кажется, что кучапри правильном использовании и правильном сборе мусора вокруг A. Однако, когда он добирается до B, появляется какое-то узкое место, так как имеется свободное пространство в куче, но оно никогда не нарушает эту воображаемую линию.В то же время, в C, использование процессора резко падает.В течение этого периода мы также получаем «OutOfMemoryError (превышен лимит накладных расходов GC)», который не имеет большого смысла для меня, поскольку есть доступное пространство в куче.
Я предполагаю, что существует какое-то узкое место, ночто именно я даже не могу себе представить.Как бы вы посоветовали найти причину проблемы?Я профилировал использование памяти и заметил, что существует довольно много экземпляров одного класса (около миллиона), но общий размер этих экземпляров довольно мал (около 50 МБ, если я правильно помню).
Редактировать: Сервер выделен для этого приложения, и использование ЦП указано только для JVM (не должно быть значительного использования ЦП вне JVM).Использование памяти только для кучи, оно не включает пространство permgen.Эта проблема воспроизводима.Моя главная проблема заключается в том, чтобы ограничить предел B, для которого я еще не нашел правдоподобного объяснения.
Вывод: Оказывается, это было вызвано тем, что куча долго выполняющихся SQL-запросовназывается одновременно.Возвращенные ResultSets также были очень большими, возможно, объясняя OOME.У меня до сих пор нет разумного объяснения, почему, по-видимому, существует определенный предел в B.