Я отлаживаю утечку собственной памяти в приложении Java. RSS растет на 1 ГБ в день, в то время как куча не увеличивается. Сравнивая выходные данные pmap с течением времени, я вижу, что несколько анонимных блоков добавляются либо в начало кучи, либо между двумя нативными библиотеками.
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- java
0000000000601000 4 4 4 rw--- java
00000000008fc000 64156 64028 64028 rw--- [ anon ]
00000006c0000000 2467840 2466824 2466824 rw--- [ anon ] (heap)
0000000756a00000 2775040 0 0 ----- [ anon ]
0000000800000000 39808 39636 39636 rw--- [ anon ]
00000008026e0000 607360 0 0 ----- [ anon ]
00007fc8f0000000 11268 10944 10944 rw--- [ anon ]
00007fc8f0b01000 54268 0 0 ----- [ anon ]
00007fc938000000 49204 46164 46164 rw--- [ anon ]
00007fc93b00d000 16332 0 0 ----- [ anon ]
00007fc940000000 126784 126784 126784 rw--- [ anon ]
00007fc947bd0000 4288 0 0 ----- [ anon ]
00007fc948000000 65512 65512 65512 rw--- [ anon ]
.....a lot of new anon blocks with memory 1012 and also ~64MB block shown in screenshot
00007fc98c448000 16 12 0 r-x-- sssd_pac_plugin.so
.....anon blocks with memormy increased over time:
00007fca747fe000 2044 0 0 ----- librmi.so
.....anon blocks with memormy increased over time:
00007fcb58015000 44 32 0 r-x-- libkrb5support.so.0.1
.............................................other libraries
00007fcbad8f8000 4 4 4 rw--- libnio.so
.....anon blocks with memormy increased over time like :
00007fcbb0000000 65420 65404 65404 rw--- [ anon ]
00007fcbc4f7e000 4820 4820 4820 rw--- [ anon ]
00007fcbc5433000 5420 0 0 ----- [ anon ]
00007fcbc597e000 90112 88172 88172 rwx-- [ anon ]
.....anon blocks with memormy increased over time
00007fcbd96ea000 44 16 0 r-x-- libjimage.so
...............................................other libraries
00007fcbdcdd9000 4 4 4 r---- ld-2.17.so
00007fcbdcdda000 4 4 4 rw--- ld-2.17.so
00007fcbdcddb000 4 4 4 rw--- [ anon ]
00007ffdbd52c000 140 40 40 rw--- [ stack ]
00007ffdbd578000 8 8 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 16585920 9216360 9206356
Могу ли я сказать, что увеличение памяти между, скажем, sssd_pac_plugin.so и librmi.so связано с одним из них? Является ли это распределение памяти непрерывным? https://i.stack.imgur.com/G1duY.jpg
В верхней части кучи создается много новых блоков памяти размером от 126 МБ до 1 МБ (100 небольших блоков по 1 МБ для справки) (адрес: 00007fc940000000 и выше). Означают ли они некоторую утечку памяти или просто создаются для каждого нового потока.
- Чтобы увидеть данные в этих блоках, я попробовал приведенный ниже фрагмент, но я всегда не получаю от него строк. Это все в двоичном формате, который я не могу интерпретировать. Есть ли способ преобразовать его в строки? Или сопоставьте любой поток/библиотеку или что-нибудь, с чем я могу работать.
gdb -pid <pid>
dump memory mem.bin 0x00007fc940000000 0x00007fc940000000+126784
#read file as:
strings mem.bin
Еще одно наблюдение заключается в том, что многие новые блоки и старые блоки увеличиваются примерно до 60-65 МБ. Количество этих блоков со временем сильно увеличивается. Наибольший вклад в увеличение RSS. https://i.stack.imgur.com/xueC8.png https://i.stack.imgur.com/hwbAb.jpg
Я также пробовал libtcmalloc и профилировщики, основная проблема заключается в производственной среде, где я не могу их использовать. В экземпляре dev утечка не так значительна, поэтому выходные данные профилировщика не могут быть проверены.