Menggunakan Snapshot Heap
Anda dapat mengambil Snapshot Heap dari aplikasi yang sedang berjalan dan memuatnya ke Chrome Developer Tools untuk memeriksa variabel tertentu atau memeriksa ukuran retainer. Anda juga dapat membandingkan beberapa snapshot untuk melihat perbedaan dari waktu ke waktu.
Peringatan
Ketika membuat snapshot, semua pekerjaan lain dalam thread utama Anda akan dihentikan. Bergantung pada isi heap, ini bahkan bisa memakan waktu lebih dari satu menit. Snapshot dibangun di dalam memori, sehingga dapat menggandakan ukuran heap, sehingga mengisi seluruh memori dan kemudian menonaktifkan aplikasi.
Jika Anda akan mengambil snapshot heap pada produksi, pastikan bahwa proses yang Anda ambil tidak akan berdampak pada ketersediaan aplikasi Anda.
Cara Melakukan
Dapatkan Snapshot Heap
Ada beberapa cara untuk memperoleh snapshot heap:
- melalui inspector,
- melalui sinyal eksternal dan flag baris perintah,
- melalui panggilan
writeHeapSnapshot
dalam proses, - melalui protokol inspector.
1. Gunakan profil memori dalam inspector
Berfungsi di semua versi Node.js yang aktif dipelihara
Jalankan node dengan flag--inspect
dan buka inspector.
Cara paling sederhana untuk mendapatkan Snapshot Heap adalah menghubungkan inspector ke proses Anda yang berjalan secara lokal. Kemudian pergi ke tab Memori dan ambil snapshot heap.
2. Gunakan flag --heapsnapshot-signal
Berfungsi di v12.0.0 atau versi yang lebih baru
Anda dapat memulai node dengan flag baris perintah yang memungkinkan bereaksi terhadap sinyal untuk membuat snapshot heap.
$ node --heapsnapshot-signal=SIGUSR2 index.js
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
node 1 5.5 6.1 787252 247004 ? Ssl 16:43 0:02 node --heapsnapshot-signal=SIGUSR2 index.js
$ kill -USR2 1
$ ls
Heap.20190718.133405.15554.0.001.heapsnapshot
Untuk detailnya, lihat dokumentasi terbaru dari flag heapsnapshot-signal.
3. Gunakan fungsi writeHeapSnapshot
Berfungsi di v11.13.0 atau versi yang lebih baru, dapat bekerja pada versi yang lebih lama dengan paket heapdump
Jika Anda membutuhkan snapshot dari proses yang sedang berjalan, seperti aplikasi yang berjalan pada server, Anda dapat mengimplementasikannya menggunakan:
require('v8').writeHeapSnapshot();
Periksa dokumen writeHeapSnapshot
untuk opsi nama file.
Anda perlu memiliki cara untuk memanggilnya tanpa menghentikan proses, jadi disarankan untuk memanggilnya dalam HTTP handler atau sebagai reaksi terhadap sinyal dari sistem operasi. Hati-hati untuk tidak mengekspos titik akhir HTTP yang memicu snapshot. Tidak boleh memungkinkan siapa pun untuk mengaksesnya.
Untuk versi Node.js sebelum v11.13.0, Anda dapat menggunakan paket heapdump.
4. Picu Heap Snapshot menggunakan protokol inspektor
Protokol inspektor dapat digunakan untuk memicu Heap Snapshot dari luar proses.
Tidak perlu menjalankan inspektor aktual dari Chromium untuk menggunakan API.
Berikut contoh pemicu snapshot pada bash, menggunakan websocat
dan jq
:
#!/bin/bash
set -e
kill -USR1 "$1"
rm -f fifo out
mkfifo ./fifo
websocat -B 10000000000 "$(curl -s http://localhost:9229/json | jq -r '.[0].webSocketDebuggerUrl')" < ./fifo > ./out &
exec 3>./fifo
echo '{"method": "HeapProfiler.enable", "id": 1}' > ./fifo
echo '{"method": "HeapProfiler.takeHeapSnapshot", "id": 2}' > ./fifo
while jq -e "[.id != 2, .result != {}] | all" < <(tail -n 1 ./out); do
sleep 1s
echo "Capturing Heap Snapshot..."
done
echo -n "" > ./out.heapsnapshot
while read -r line; do
f="$(echo "$line" | jq -r '.params.chunk')"
echo -n "$f" >> out.heapsnapshot
i=$((i+1))
done < <(cat out | tail -n +2 | head -n -1)
exec 3>&-
Berikut adalah daftar alat profil memori yang dapat digunakan dengan protokol inspector:
Cara menemukan kebocoran memori dengan Heap Snapshots
Anda dapat menemukan kebocoran memori dengan membandingkan dua snapshot heap. Penting untuk memastikan bahwa perbedaan snapshot tidak mengandung informasi yang tidak perlu. Langkah-langkah berikut harus menghasilkan perbedaan yang bersih antara snapshot.
- Biarkan proses memuat semua sumber dan selesai bootstrapping. Ini seharusnya hanya memakan waktu beberapa detik.
- Mulai menggunakan fungsionalitas yang Anda curigai bocor memori. Kemungkinan besar ini membuat beberapa alokasi awal yang bukan bocoran.
- Ambil satu snapshot heap.
- Lanjutkan menggunakan fungsionalitas untuk sementara waktu, lebih baik tanpa menjalankan apa pun di antara.
- Ambil snapshot heap lainnya. Perbedaan antara keduanya seharusnya sebagian besar berisi apa yang bocor.
- Buka alat pengembang Chromium/Chrome dan pergi ke tab Memory
- Muat file snapshot lama terlebih dahulu, dan yang lebih baru satu detik.
- Pilih snapshot yang lebih baru dan alihkan mode di dropdown di bagian atas dari Ringkasan dengan Perbandingan.
- Cari delta positif besar dan jelajahi referensi yang menyebabkannya di panel bawah.
Anda dapat berlatih menangkap snapshot heap dan menemukan kebocoran memori dengan latihan snapshot heap ini.