Увеличение размера кучи пространства Eden tomcat - PullRequest
0 голосов
/ 01 марта 2019

Моя текущая конфигурация tomcat показана ниже

enter image description here

, а мои переменные конфигурации для tomcat указаны ниже -

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx12288m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmn8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:NewRatio=1"
export CATALINA_OPTS="$CATALINA_OPTS -XX:SurvivorRatio=4"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark"
export CATALINA_OPTS="$CATALINA_OPTS -Xloggc:/opt/tomcat/logs/gc_$(date +%d-%m-%y-%H-%M).log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps"

Распределение из вышеуказанного конфига хорошо представлено на изображении выше.Young Generation HeapSize составляет около 8 ГБ и Old Generation Heap size, если 4 ГБ.Все выглядит хорошо.Но я проверил gc logs и обнаружил, что сборка мусора запускается, когда пространство eden заполнено примерно на 1 ГБ

2019-02-27T06:26:48.881+0000: 1027.464: [GC (Allocation Failure) [PSYoungGen: 1247052K->30885K(1296896K)] 1283550K->67399K(1360896K), 0.0245425 secs] [Times: user=0.09 sys=0.03, real
=0.02 secs]
2019-02-27T06:28:08.578+0000: 1107.161: [GC (Allocation Failure) [PSYoungGen: 1183909K->31338K(1438720K)] 1220423K->67860K(1502720K), 0.0354672 secs] [Times: user=0.12 sys=0.03, real
=0.03 secs]
2019-02-27T06:29:32.316+0000: 1190.899: [GC (Allocation Failure) [PSYoungGen: 1378672K->31886K(1312768K)] 1415194K->68416K(1376768K), 0.0237727 secs] [Times: user=0.10 sys=0.00, real
=0.03 secs]
2019-02-27T06:30:17.752+0000: 1236.335: [GC (Allocation Failure) [PSYoungGen: 1312398K->31671K(1286144K)] 1348928K->68209K(1350144K), 0.0240825 secs] [Times: user=0.12 sys=0.01, real
=0.02 secs]
2019-02-27T06:31:01.988+0000: 1280.571: [GC (Allocation Failure) [PSYoungGen: 1248695K->31838K(1188864K)] 1285233K->68385K(1252864K), 0.0288038 secs] [Times: user=0.15 sys=0.00, real
=0.03 secs]
2019-02-27T06:31:44.973+0000: 1323.555: [GC (Allocation Failure) [PSYoungGen: 1188446K->31749K(1166848K)] 1224993K->68295K(1230848K), 0.0231320 secs] [Times: user=0.13 sys=0.00, real
=0.02 secs]
2019-02-27T06:32:26.203+0000: 1364.786: [GC (Allocation Failure) [PSYoungGen: 1131013K->32025K(1077248K)] 1167559K->68579K(1141248K), 0.0351297 secs] [Times: user=0.14 sys=0.00, real
=0.03 secs]

Я не совсем понимаю, почему eden space не занимает до 7 ГБ свободного меставыполняя Young GC.Из журналов видно, что gc запускается каждые 2 минуты, и каждый вызов gc останавливает систему на 30 milli-seconds.Можно ли полностью использовать выделенное пространство кучи.

1 Ответ

0 голосов
/ 03 марта 2019

В производственных системах я рекомендую использовать идентичные значения -Xms и -Xmx, потому что при запуске вы хотите быть уверены, что доступно максимально допустимое количество памяти.Вы не хотите, чтобы выделение последних 2G памяти проваливалось в воскресенье вечером в 3 часа ночи.Это согласуется с комментарием Хольгера: вы указываете, что не хотите, чтобы JVM выделяла всю память - и он подчиняется этому желанию.

Другой аспект: GC абстрагируется, и редко есть причиназаботиться о его деталях.С точки зрения приложения, вы не имеете ни малейшего представления, когда оно действительно появляется - это может происходить во время низкой загрузки, каждые 2 минуты или когда память почти заполнена.

В некоторых алгоритмах и приложениях GC рекомендуется определить наименьший объем памяти, который требуется приложению, добавить немного накладных расходов и настроить его, так как более частые короткие GC лучше, чем менее частые длинные.Если это все еще сохраняется в GC, который вы используете, и для вашего приложения, это еще предстоит выяснить.

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

  • Если вам нужен 12G: продолжайте, и выделите их с помощью -Xms.
  • Если вы просто предоставляете 12G для устранения утечек памяти: исправьте это.
  • Если вы просто предоставляете 12G, потому что у вас есть такой объем памяти, доступный на вашем сервере: выясните, что нужно вашему приложению,и выделите эту сумму (плюс некоторую маржу)

В системах разработки : зачем?

...