У меня похожая история, как в вопросе Рост использования резидентной памяти (RSS) Java Process
jcmd NMT не показывает проблем.Имеет постоянные значения.Например,
Native Memory Tracking:
Total: reserved=1611305KB +19680KB, committed=347717KB +41440KB
В то же время команда docker exec eb97c7681baa ps -o rss,vsz,sz 7
возвращает
RSS VSZ SZ
458368 2294800 573700
И зафиксированный размер для NMT остается +/- постоянным, но RSS продолжает расти, что вызывает dockerУбийца ООМ, чтобы остановить контейнер с ООМ.Я прочитал несколько замечательных статей о фрагментации памяти (https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_native_memory_fragmentation_and_process_size_growth?lang=en)
Так что многие люди сообщают, что исправление, например MALLOC_ARENA_MAX=2
, должно решить проблему, но, похоже, требуется больше настроек. Когда я устанавливаю значение,проблема с ростом RSS значительно уменьшается, но все еще остается. Кажется, мне нужно установить значения для:
MALLOC_MMAP_THRESHOLD_
- определяет, когда память будет выделяться из кучи Java (значение по умолчанию 128k)
MALLOC_TRIM_THRESHOLD_
он пытается обрезать арены, чтобы освободить память для операционной системы, когда размер арены достигает максимального порогового значения (значение по умолчанию 128k) - Это так?
Из статьи:
Если вы решите изменить порог mmap, первым шагом будет определение шаблона распределения. Это можно сделать с помощью таких инструментов, как ltrace (на malloc) или SystemTap, или если вы знаете, что является причиной большей частираспределения (например, Java DirectByteBuffers), затем вы можете отслеживать только эти распределения. Затем создайте гистограмму этих размеров и выберите порогd только при наименьшем, но наиболее частом распределении.Например, допустим, вы обнаружили, что большинство выделений больше 8 КБ.В этом случае вы можете установить порог на 8192
Я использовал инструмент pmap, чтобы проверить, каковы размеры выделения:
7: java -XX:NativeMemoryTracking=detail -XX:+PrintFlagsFinal -XshowSettings:vm -jar /usr/share/jvmservice/service.jar
Address Kbytes RSS Dirty Mode Mapping
00000000020af000 560 432 432 rw--- [ anon ]
00000000f8000000 43648 39032 39032 rw--- [ anon ]
00000000faaa0000 87424 66532 66532 rw--- [ anon ]
0000000100000000 11136 11056 11056 rw--- [ anon ]
00007f2820000000 30912 25520 25520 rw--- [ anon ]
00007f2828000000 65512 58568 58568 rw--- [ anon ]
00007f282fb06000 1280 1176 1176 rw--- [ anon ]
00007f282fd06000 2048 2044 2044 rw--- [ anon ]
00007f282ff06000 2048 2048 2048 rw--- [ anon ]
00007f2830106000 2048 2048 2048 rw--- [ anon ]
00007f2830309000 3064 2064 2064 rw--- [ anon ]
00007f283060a000 1016 100 100 rw--- [ anon ]
00007f283070b000 3064 2068 2068 rw--- [ anon ]
00007f2830a09000 2048 2048 2048 rw--- [ anon ]
00007f2830c0c000 1016 108 108 rw--- [ anon ]
00007f2830d0d000 1016 92 92 rw--- [ anon ]
00007f2830e0e000 1016 124 124 rw--- [ anon ]
00007f2830f0f000 1016 128 128 rw--- [ anon ]
00007f2831111000 1016 124 124 rw--- [ anon ]
00007f2831212000 1016 128 128 rw--- [ anon ]
00007f2831313000 1016 144 144 rw--- [ anon ]
00007f2831414000 1016 128 128 rw--- [ anon ]
00007f2831515000 1016 144 144 rw--- [ anon ]
00007f2831616000 1016 128 128 rw--- [ anon ]
00007f2831717000 1016 136 136 rw--- [ anon ]
00007f2831818000 3064 2136 2136 rw--- [ anon ]
00007f2831b16000 2048 2044 2044 rw--- [ anon ]
00007f2831d19000 3064 2152 2152 rw--- [ anon ]
00007f2832017000 2048 2048 2048 rw--- [ anon ]
00007f283221a000 3064 2152 2152 rw--- [ anon ]
00007f2832518000 16388 164 164 rw--- [ anon ]
00007f283351c000 1016 136 136 rw--- [ anon ]
00007f283361d000 3064 2136 2136 rw--- [ anon ]
00007f283391b000 2048 2048 2048 rw--- [ anon ]
00007f2833d20000 1016 100 100 rw--- [ anon ]
00007f2833e21000 3064 2148 2148 rw--- [ anon ]
00007f283411f000 2048 2048 2048 rw--- [ anon ]
00007f2834b43000 3064 2136 2136 rw--- [ anon ]
00007f2835291000 2116 2052 2052 rw--- [ anon ]
00007f28354a2000 2048 2048 2048 rw--- [ anon ]
00007f28356a2000 2048 2048 2048 rw--- [ anon ]
00007f28358a2000 2048 2048 2048 rw--- [ anon ]
00007f2835aa2000 2048 2048 2048 rw--- [ anon ]
00007f2835ca2000 2048 2048 2048 rw--- [ anon ]
00007f2835ea2000 2048 2048 2048 rw--- [ anon ]
00007f28360e1000 2048 2048 2048 rw--- [ anon ]
00007f28365df000 3064 2164 2164 rw--- [ anon ]
00007f28368dd000 2048 2048 2048 rw--- [ anon ]
00007f2836add000 2048 2048 2048 rw--- [ anon ]
00007f2836cdd000 2048 2048 2048 rw--- [ anon ]
00007f2836ee0000 3064 2156 2156 rw--- [ anon ]
00007f28371de000 2048 2048 2048 rw--- [ anon ]
00007f28373de000 2048 2048 2048 rw--- [ anon ]
00007f28375de000 2048 2048 2048 rw--- [ anon ]
00007f2837c00000 2048 2048 2048 rw--- [ anon ]
00007f2837e00000 2048 2048 2048 rw--- [ anon ]
00007f2838000000 19828 19820 19820 rw--- [ anon ]
00007f283c000000 6296 6036 6036 rw--- [ anon ]
00007f2840000000 1004 952 952 rw--- [ anon ]
00007f2844000000 65520 62180 62180 rw--- [ anon ]
00007f2848000000 192 192 192 rw--- [ anon ]
00007f284c000000 3260 3228 3228 rw--- [ anon ]
00007f2850000000 5060 5060 5060 rw--- [ anon ]
00007f28544b7000 1024 12 12 rw--- [ anon ]
00007f28545ba000 1016 116 116 rw--- [ anon ]
00007f28546bc000 1012 24 24 rw--- [ anon ]
00007f28547bd000 1012 56 56 rw--- [ anon ]
00007f28548bd000 1016 92 92 rw--- [ anon ]
00007f2854b31000 1016 92 92 rw--- [ anon ]
00007f2854c32000 1016 88 88 rw--- [ anon ]
00007f2854d31000 1024 16 16 rw--- [ anon ]
00007f2855000000 45440 44788 44788 rwx-- [ anon ]
00007f2864000000 27756 26120 26120 rw--- [ anon ]
00007f28680d1000 8976 8976 8976 rw--- [ anon ]
00007f2868995000 712 712 712 rw--- [ anon ]
00007f286a0f7000 12612 4916 0 r-x-- libjvm.so
---------------- ------- ------- -------
total kB 2294804 461600 456396
Так что, похоже, большинство ячеек имеютРазмер 2048К.Также я проанализировал кучу с JXRay
Кажется, что это пространство используется java DirectByteBuffers.Вот отличная статья о настройке https://www.evanjones.ca/java-bytebuffer-leak.html
Вопросы 1. Будет ли правильно задать
MALLOC_MMAP_THRESHOLD_ = 8192
Вопрос 2. Какие соображенияМне нужно принять во внимание, чтобы установить значение для MALLOC_TRIM_THRESHOLD_
. Из документов
M_TRIM_THRESHOLD
When the amount of contiguous free memory at the top of the
heap grows sufficiently large, free(3) employs sbrk(2) to
release this memory back to the system. (This can be useful
in programs that continue to execute for a long period after
freeing a significant amount of memory.) The M_TRIM_THRESHOLD
parameter specifies the minimum size (in bytes) that this
block of memory must reach before sbrk(2) is used to trim the
heap.
The default value for this parameter is 128*1024. Setting
M_TRIM_THRESHOLD to -1 disables trimming completely.
Modifying M_TRIM_THRESHOLD is a trade-off between increasing
the number of system calls (when the parameter is set low) and
wasting unused memory at the top of the heap (when the
parameter is set high).