Почему JVM всегда начинается с полного GC? - PullRequest
4 голосов
/ 14 сентября 2011

Я выполняю тесты настройки для веб-приложения, работающего на JBoss AS5.

Я создаю различные сценарии с использованием JMeter, начиная от низкой нагрузки до стрессовой нагрузки.

Что я заметил, так это то, что журнал GC всегда начинается с полного GC.

Может ли кто-нибудь объяснить мне это поведение?

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

FWIW, вот фрагмент из журнала GC: * ​​1011 *

17.560: [Full GC [PSYoungGen: 44456K->0K(458752K)] [ParOldGen: 0K->4385K(1572864K)]      44456K->4385K(2031616K) [PSPermGen: 11565K->11555K(262144K)], 0.9226691 secs]
72.478: [GC [PSYoungGen: 393216K->30720K(458752K)] 397601K->35105K(2031616K), 0.1787110    secs]
112.137: [GC [PSYoungGen: 423936K->38912K(458752K)] 428321K->43297K(2031616K), 0.2197971 secs]
188.297: [GC [PSYoungGen: 432128K->54272K(458752K)] 436513K->58657K(2031616K), 0.3034273 secs]
309.100: [GC [PSYoungGen: 447488K->60416K(458752K)] 451873K->64801K(2031616K), 0.3111470 secs]
430.354: [GC [PSYoungGen: 453632K->65536K(454848K)] 458017K->72129K(2027712K), 0.3374716 secs]
546.078: [GC [PSYoungGen: 454848K->65536K(415104K)] 461441K->78881K(1987968K), 0.3746511 secs]
652.116: [GC [PSYoungGen: 415104K->40960K(436928K)] 428449K->88641K(2009792K), 0.3895185 secs]
765.134: [GC [PSYoungGen: 390528K->28672K(437632K)] 438209K->94882K(2010496K), 0.2703870 secs]
870.726: [GC [PSYoungGen: 380800K->23552K(375680K)] 447010K->102114K(1948544K), 0.1948568 secs]
976.144: [GC [PSYoungGen: 375680K->18432K(436096K)] 454242K->110306K(2008960K), 0.1734677 secs]

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

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

Однако при запуске JVM по умолчанию используется минимальный объем памяти.

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

Поскольку вы знаете, сколько памяти будет расти в вашем приложении, вы можете использовать опцию типа

-ms512m -mx1g

Полный GC уйдет, и вы будете собирать реже.

0 голосов
/ 22 сентября 2011

С помощью Питера Джонсона из сообщества Jboss.Мне удалось узнать ответ на этот вопрос.

Я пишу это здесь, чтобы поделиться им с вами.

Звонок System.gc ()закодирован в сервер приложений (или в одну из библиотек, которые он использует - я знаю, что библиотеки RMI любят выполнять вызовы GC), я подозреваю, что он переходит с начальной загрузки на сам сервер приложений.Я думаю, что это может также выполнить другой GC или два после развертывания или другой основной деятельности инициализации.Я думаю, что идея заключалась в том, чтобы куча была как можно более чистой от мусора до обработки пользовательских запросов.Конечно, это имело смысл несколько лет назад, когда на серверах не было столько памяти, а куча была меньше.Я видел такое поведение в выпуске JBoss AS с 4.0.x до 5.x (не отслеживал поведение GC на 6).

...