JVM - соотношение молодого поколения и старого поколения / распределение - PullRequest
2 голосов
/ 30 января 2020

Я выделяю 8 ГБ памяти для приложения, написанного на Java. Это выходит из памяти. Я считаю, что молодое поколение всегда меньше старого по умолчанию (1/4 кучи). И Eden / Survivor 1,2 находятся внутри молодого поколения. Я считаю, что новые объекты создаются в пространстве Эдема.

Не остается ли у приложения java 1008 * недостаточно памяти, даже если старое поколение не заполнено, а молодое поколение полностью заполнено?

Если есть более недолговечные объекты чем долгоживущие объекты, можно ли выделить больше памяти молодому поколению или, по крайней мере, 50% кучи молодому поколению? Или это всегда должно быть 1/4 кучи из-за обслуживания jvm?

1 Ответ

1 голос
/ 31 января 2020

Прежде всего, это 1/4 кажется другим. То есть, сколько памяти будет выделено вашей куче, , если вы не укажете -Xmx (это немного отличается, когда вы находитесь в контейнере и какие флаги вы включили).

Не исчерпано ли в приложении java 1029 * памяти, хотя старое поколение не заполнено, а молодое поколение полностью заполнено?

Нет. Когда молодой Eden полон, живые Объекты из этого перемещаются в Survivor, когда те из Выжившего «выживают» достаточно циклов G C, они перемещаются в старый регион (управляется с помощью XX:MaxTenuringThreshold). Когда старое поколение достигает определенного предела (IHOP в G1), происходит цикл G C, касающийся старого поколения. Некоторые подробности здесь .

Если недолговечных объектов больше, чем долгоживущих, можно ли выделить больше памяти молодому поколению или хотя бы на 50%? кучи молодому поколению?

Чем больше молодой регион, тем дольше будут паузы. Молодые циклы G C всегда являются событиями остановки мира, поэтому делать их слишком большими нехорошо. Кроме того, это повлияет на ваш -XX:MaxGCPauseMillis; а также не делайте этого самостоятельно: по умолчанию G1 G C будет корректировать регионы так, как это будет наиболее подходящим для .

...