kami mencoba untuk menyelidiki penggunaan memori proses java di bawah beban sedang.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12663 test 20 0 8378m 6.0g 4492 S 43 8.4 162:29.95 java
Seperti yang Anda lihat kami memiliki memori penduduk di 6Gb. Sekarang bagian yang menarik adalah ini: proses dijalankan dengan params ini:
- -Xmx2048m
- -Xms2048m
- -XX: NewSize = 512m
- -XX: MaxDirectMemorySize = 256m
- ... beberapa lainnya untuk GC dan lainnya
Melihat pengaturan ini dan penggunaan memori yang sebenarnya, kami tersandung untuk melihat perbedaan dari apa yang kami harapkan akan digunakan oleh proses ini dan apa yang sebenarnya digunakan.
Biasanya masalah ingatan kita diselesaikan dengan menganalisis heap dump tetapi dalam kasus ini ingatan kita digunakan di suatu tempat di luar heap.
Pertanyaan: Apa langkah-langkah untuk mencoba dan menemukan alasan penggunaan memori yang sedemikian tinggi? Alat apa yang dapat membantu kami mengidentifikasi apa yang menggunakan memori dalam proses itu?
EDIT 0
Sepertinya ini bukan masalah yang berhubungan dengan tumpukan karena kita masih memiliki beberapa ruang di sana:
jmap -heap 12663
hasil dalam (diedit untuk menghemat ruang)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 1610612736 (1536.0MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
New Generation: 45.7% used
Eden Space: 46.3% used
From Space: 41.4% used
To Space: 0.0% used
concurrent mark-sweep generation: 63.7% used
Perm Generation: 82.5% used
EDIT 1
menggunakan pmap kita dapat melihat bahwa ada sejumlah alokasi 64Mb:
pmap -x 12663 | grep rwx | sort -n -k3 | less
menghasilkan:
... a lot more of these 64Mb chunks
00007f32b8000000 0 65508 65508 rwx-- [ anon ] <- what are these?
00007f32ac000000 0 65512 65512 rwx-- [ anon ]
00007f3268000000 0 65516 65516 rwx-- [ anon ]
00007f3324000000 0 65516 65516 rwx-- [ anon ]
00007f32c0000000 0 65520 65520 rwx-- [ anon ]
00007f3314000000 0 65528 65528 rwx-- [ anon ]
00000000401cf000 0 241904 240980 rwx-- [ anon ] <- Direct memory ?
000000077ae00000 0 2139688 2139048 rwx-- [ anon ] <- Heap ?
Jadi bagaimana cara mengetahui potongan 64Mb itu? Apa yang menggunakannya? Jenis data apa yang ada di dalamnya?
Terima kasih