Go 1.3 Garbage Collector Bocorkan Memori pada Pelayan
Soalan:
Kenapa Go 1.3 pengumpul sampah gagal melepaskan memori pelayan kembali ke operasi sistem?
Jawapan:
Waktu jalan Go secara berkala menjalankan proses kutipan sampah yang bertanggungjawab untuk mendelokasi memori yang tidak lagi digunakan. Walau bagaimanapun, terdapat beberapa sebab mengapa pengumpul sampah mungkin tidak melepaskan semua memori yang diminta kembali ke OS:
-
Timbunan dibebaskan, tetapi ruang alamat maya tidak : Pada platform berasaskan Unix, Go menggunakan panggilan sistem untuk memberitahu sistem pengendalian bahawa ia boleh menuntut semula bahagian timbunan yang tidak digunakan. Kemudahan ini tidak tersedia pada platform Windows.
-
Memori tidak ditandakan sebagai percuma: Slice dan struktur data lain mungkin tidak ditandakan sebagai dibebaskan, sebaliknya sedang digunakan. Ini menghalangnya daripada dikembalikan ke OS.
-
Tidak semua memori sistem yang diperuntukkan adalah memori 'sebenar': Memori yang diperuntukkan oleh masa jalan tetapi sebenarnya tidak digunakan oleh program mungkin masih dilaporkan sebagai memori yang diperuntukkan oleh perintah runtime.Stats Go. OS mungkin masih menggunakan memori ini secara dalaman.
Walaupun Go tidak selalu mengecilkan ruang ingatannya, terdapat beberapa penyelesaian yang mungkin untuk mengurangkan masalah:
-
Paksa kutipan sampah: Panggil fungsi runtime.GC() untuk mencetuskan sampah secara manual koleksi.
-
Paksa memori OS kembali: Panggil fungsi runtime.FreeOSMemory untuk mengembalikan memori secara eksplisit kepada OS. Ini hanya akan berfungsi selepas GC telah dijalankan.
Adalah penting untuk ambil perhatian bahawa tidak semua memori yang diduduki oleh goroutine dikeluarkan oleh GC.
Atas ialah kandungan terperinci Mengapa Pengumpul Sampah Go 1.3 Tidak Sentiasa Mengembalikan Memori ke Sistem Pengendalian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!