Java использует гораздо больше памяти, чем размер кучи (или правильно размер ограничения памяти Docker)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java использует гораздо больше памяти, чем размер кучи (или правильно размер ограничения памяти Docker)

Сообщение Anonymous »

Для моего приложения объем памяти, используемый процессом Java, намного превышает размер кучи.
В системе, в которой работают контейнеры, возникают проблемы с памятью, поскольку контейнер занимает гораздо больше памяти, чем размер кучи.
Размер кучи установлен на 128 МБ (

Код: Выделить всё

-Xmx128m -Xms128m
), при этом контейнер занимает до 1 ГБ памяти. В нормальном состоянии ему требуется 500 МБ. Если докер-контейнер имеет ограничение ниже (например, mem_limit=mem_limit=400MB), процесс завершается убийцей нехватки памяти ОС.
Не могли бы вы объяснить, почему процесс Java использует гораздо больше памяти, чем куча? Как правильно определить размер ограничения памяти Docker? Есть ли способ уменьшить объем памяти, занимаемой процессом Java вне кучи?

Я собираю некоторые сведения о проблеме с помощью команды отслеживания собственной памяти в JVM.
От хост-системы я получаю информацию о памяти, используемой контейнером.

Код: Выделить всё

$ docker stats --no-stream 9afcb62a26c8
CONTAINER ID        NAME                                                                                        CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9afcb62a26c8        xx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.0acbb46bb6fe3ae1b1c99aff3a6073bb7b7ecf85   0.93%               461MiB / 9.744GiB   4.62%               286MB / 7.92MB      157MB / 2.66GB      57
Изнутри контейнера я получаю память, используемую процессом.

Код: Выделить всё

$ ps -p 71 -o pcpu,rss,size,vsize
%CPU   RSS  SIZE    VSZ
11.2 486040 580860 3814600

Код: Выделить всё

$ jcmd 71 VM.native_memory
71:

Native Memory Tracking:

Total: reserved=1631932KB, committed=367400KB
-                 Java Heap (reserved=131072KB, committed=131072KB)
(mmap: reserved=131072KB, committed=131072KB)

-                     Class (reserved=1120142KB, committed=79830KB)
(classes #15267)
(  instance classes #14230, array classes #1037)
(malloc=1934KB #32977)
(mmap: reserved=1118208KB, committed=77896KB)
(  Metadata:   )
(    reserved=69632KB, committed=68272KB)
(    used=66725KB)
(    free=1547KB)
(    waste=0KB =0.00%)
(  Class space:)
(    reserved=1048576KB, committed=9624KB)
(    used=8939KB)
(    free=685KB)
(    waste=0KB =0.00%)

-                    Thread (reserved=24786KB, committed=5294KB)
(thread #56)
(stack: reserved=24500KB, committed=5008KB)
(malloc=198KB #293)
(arena=88KB #110)

-                      Code (reserved=250635KB, committed=45907KB)
(malloc=2947KB #13459)
(mmap: reserved=247688KB, committed=42960KB)

-                        GC (reserved=48091KB, committed=48091KB)
(malloc=10439KB #18634)
(mmap: reserved=37652KB, committed=37652KB)

-                  Compiler (reserved=358KB, committed=358KB)
(malloc=249KB #1450)
(arena=109KB #5)

-                  Internal (reserved=1165KB, committed=1165KB)
(malloc=1125KB #3363)
(mmap: reserved=40KB, committed=40KB)

-                     Other (reserved=16696KB, committed=16696KB)
(malloc=16696KB #35)

-                    Symbol (reserved=15277KB, committed=15277KB)
(malloc=13543KB #180850)
(arena=1734KB #1)

-    Native Memory Tracking (reserved=4436KB, committed=4436KB)
(malloc=378KB #5359)
(tracking overhead=4058KB)

-        Shared class space (reserved=17144KB, committed=17144KB)
(mmap: reserved=17144KB, committed=17144KB)

-               Arena Chunk (reserved=1850KB, committed=1850KB)
(malloc=1850KB)

-                   Logging (reserved=4KB, committed=4KB)
(malloc=4KB #179)

-                 Arguments (reserved=19KB, committed=19KB)
(malloc=19KB #512)

-                    Module (reserved=258KB, committed=258KB)
(malloc=258KB #2356)

$ cat /proc/71/smaps | grep Rss | cut -d: -f2 | tr -d " "  | cut -f1 -dk | sort -n | awk '{ sum += $1 } END { print sum }'
491080
Приложение представляет собой веб-сервер, использующий Jetty/Jersey/CDI, объем которого составляет 36 МБ.
Используются следующие версии ОС и Java (внутри контейнера). Образ Docker основан на openjdk:11-jre-slim.

Код: Выделить всё

$ java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment (build 11+28-Debian-1)
OpenJDK 64-Bit Server VM (build 11+28-Debian-1, mixed mode, sharing)
$ uname -a
Linux service1 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux
https://gist.github.com/prasanthj/48e70 ... 1fb3149b58

Подробнее здесь: https://stackoverflow.com/questions/534 ... emory-limi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»