OpenJDK 1.8.0_242, параметр MaxRAMFraction не отражает - PullRequest
1 голос
/ 13 февраля 2020

Я запускаю приложение Springboot в образе alpine-OpenJDK и сталкиваюсь с проблемами OutOfMemory. Максимальная куча ограничена 256 МБ. Я попытался обновить параметр MaxRAMFraction до 1, но не увидел, что это отражается в Java_process. У меня есть возможность увеличить ограничение памяти контейнера до 3000 м, но я бы предпочел использовать память Cgroup с MaxRamfraction = 1. Есть мысли?

Java-Version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (IcedTea 3.15.0) (Alpine 8.242.08-r0)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

bash-5.0$ java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|MaxRAMFraction"
    uintx DefaultMaxRAMFraction                     = 4                                   {product}
    uintx MaxHeapSize                              := 262144000                           {product}
    uintx MaxRAMFraction                            = 4                                   {product}
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (IcedTea 3.15.0) (Alpine 8.242.08-r0)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

Container Resource limits
 ports:
        - containerPort: 8080
          name: 8080tcp02
          protocol: TCP
        resources:
          limits:
            cpu: 350m
            memory: 1000Mi
          requests:
            cpu: 50m
            memory: 1000Mi
        securityContext:
          capabilities: {}

Контейнер JAVA_OPTS скриншот

1 Ответ

0 голосов
/ 13 февраля 2020

Максимальная куча ограничена 256 МБ.

Вы имеете в виду через -m в docker? Если это так, то это не указанная куча java, а общая память.

Я попытался обновить настройку MaxRAMFraction до 1

MaxRAMFraction устарела и не используется, забудьте об этом.

UseCGroupMemoryLimitForHeap

устарела и будет удалена. Используйте UseContainerSupport, который был портирован на java -8.

MaxRAM = 2g

Знаете ли вы, что это на самом деле делает? Он устанавливает значение «физической» оперативной памяти, которое JVM должна считать имеющимся у вас.

Я предполагаю, что вы не установили здесь -Xms и -Xmx специально? Поскольку вы не знаете, сколько памяти будет иметь контейнер? Если таковые, мы в одной обуви. Мы делаем знаем, что минимум, который мы собираемся получить, равен 1g, но я понятия не имею о максимуме, поэтому я предпочитаю не устанавливать -Xms и -Xmx явно.

Вместо этого мы делаем:

-XX:InitialRAMPercentage=70
-XX:MaxRAMPercentage=70
-XX:+UseContainerSupport
-XX:InitialHeapSize=0

И это все. Что это делает?

InitialRAMPercentage используется для расчета начального размера кучи, НО только в случае отсутствия InitialHeapSize/Xms. MaxRAMPercentage используется для расчета максимальной кучи . Не забывайте, что процессу java нужно больше, чем , просто heap, ему также нужны собственные структуры; вот почему это 70 (%).

...