Pertanyaan Contoh yang direferensikan oleh 'bound_this' saja bukan sampah yang dikumpulkan


Saya memiliki pertanyaan tentang pengumpulan sampah di google chrome (Versi 20.0.1132.47, Ubuntu 11.04 64bit).

Saat membandingkan tumpukan sampah dan memeriksa kebocoran memori, saya menemukan beberapa contoh, yang tidak pernah dibersihkan. Biasanya perilaku ini dapat dilacak ke kesalahan programmer, tetapi dalam hal ini saya agak tidak mengerti ..

Lihatlah screenshot berikut Screenshot of heap-dump showing an instance (child) referenced only by 'bound_this'

Contoh 'anak @ 610739' hanya direferensikan oleh 'bound_this' contoh yang termasuk fungsi dari turunan-anak itu sendiri. Jadi untuk pemahaman saya, turunan anak harus dikumpulkan dari sampah, karena satu-satunya referensi lain yang mempertahankannya adalah turunan-anak itu sendiri (melalui fungsi 'bound_this').

Saya menggunakan fungsi utilitas underscore.js '' bindAll '(underscore.js # bindAll) yang memetakan ke fungsi 'native_bind' dari chrome (Wiki Script ECMA di bound_this)

Apakah saya kehilangan sesuatu yang jelas di sini dan jika demikian, dapatkah seseorang menjelaskan apa yang membuat kejadian ini tetap hidup?

MEMPERBARUI:
Sementara itu saya menguji aplikasi yang sama di chrominium (18.0.1025.168 (Pembangun Pengembang 134367 Linux) Ubuntu 11.10) yang tidak menunjukkan contoh yang menggantung ini ..

PERBARUI 2:
Mengikuti petunjuk Esailijas untuk memberikan potongan jsfiddle, saya membuat satu (http://jsfiddle.net/8gSTR/1/) yang meniru apa yang pada dasarnya saya lakukan. Menjalankan biola ini sayangnya tidak menunjukkan perilaku buruk yang saya alami dalam aplikasi saya. Heap-dump yang diambil saat 'a'-instance masih direferensikan terlihat mirip meskipun referensi dari window.o array yang membuat instance hidup: Heap-dump taken during execution of jsfiddle mentioned above

Karena referensi seperti itu hilang dalam kasus saya (screenshot 1) saya tidak tahu apa yang membuat krom dari membebaskan instance ini ...

PERBARUI 3:
Saran loislos yang diikuti untuk mengaktifkan properti tersembunyi. Hasilnya (dengan salah satu cabang diperluas) dapat dilihat di screenshot berikut tetapi tidak membawa saya lebih jauh. Heap-dump with hidden properties enabled


32
2017-07-20 09:13


asal


Jawaban:


Kecurigaan Anda bahwa ini bukan kebocoran memori yang sebenarnya tetapi keanehan dengan chrome benar.

Saya baru saja berlari melintasi masalah yang sama. IE11 tidak akan menampilkan this.func = _.bind (this.func, this) sebagai kebocoran memori sementara chrome akan, bahkan setelah Anda menekan tombol sampah mengumpulkan 100 kali.

Ini akan menunjukkannya bahkan setelah Anda menjalankan chrome dengan omong kosong jsflag dan mengekspos kolektor sampah yang mendasari dan memanggil gc 100 kali.

Cara mudah untuk membuktikan bahwa itu sebenarnya bukan kebocoran di chrome adalah untuk membuat masalah kecil masalah utama dengan browser dan memaksa mesin untuk mengambil tindakan.

Pada contoh yang memiliki fungsi terikat yang ditugaskan untuk menetapkan properti baru seperti ini:

target.WhyAmILeaking = Array baru (200000000) .join ("YOURNOT");

Lakukan tiga teknik snapshot dengan chrome dan Anda akan melihat string yang ada di heap clocking di sekitar 214mb. Lakukan tindakan konstruktif apa pun (cuplikan kedua) lagi dan Anda akan melihat tumpukannya hingga 423mb atau tinggal di 214mb. Jika tetap Anda selesai karena Anda membuktikan 214mb asli telah dikumpulkan. Jika tidak tetap melakukan tindakan merusak Anda (snapshot ketiga) dan itu akan kembali ke 214mb juga membuktikan yang asli dikumpulkan.

Jika hanya tinggal di 423mb Anda, Pak atau Madam memiliki kebocoran.

Oh dan kelompok lain dari jiwa miskin yang berlari di situasi yang sama persis: https://github.com/jashkenas/backbone/issues/2269#issuecomment-13610969

TL; DR; gunakan IE 11 untuk mendeteksi kebocoran.


3
2018-03-05 13:04



Saya telah menyebutkan ini EcmaScript, istilah ini "mengikat ini" dengan kelas,

Metode kelas memiliki "terikat ini", di mana ini dalam tubuh metode selalu terikat ke kelas contoh dari mana metode itu diekstraksi, terlepas dari apa yang sebenarnya parameter ini diteruskan ke metode (parameter ini ke metode diabaikan) .

Sekarang di sini di contoh Anda tidak ada contoh skrip yang diberikan sehingga tidak dapat spesifik untuk dipertanyakan,

Saya harus mengatakan jika ini tidak bocor ..

kemudian dengan objek apa pun, class script dibatasi, ia tidak akan memanggil sampah sampai kelas / objek ada karena fungsi ini dibatasi dengan objek yang sama .. itu akan sampah yang dikumpulkan hanya setelah induknya (objek / kelas yang dengannya). dibatasi) ruang lingkup berakhir.

Sekarang jika referensi melingkar ketika tugas akan menyelesaikannya akan berakhir, >> ini bekerja seperti konsep Rekursi (pikiran itu konsep, tidak sama dengan) .. jadi akhirnya akan mulai dari panggilan terakhir .. secara terbalik .. panggilan paling dalam (panggilan terakhir) akan dirilis pertama .. dan seterusnya

Kode harus buggy karena mereka tidak boleh mengikat dan mendefinisikan fungsi dan menggunakan kembali setiap kali .. tetapi jika mereka mengikat maka juga harus bekerja dengan baik dan tidak boleh bocor sampai jejak keluar dari batas peramban dari kolam memori.

Saya harap ini akan menjelaskan ..


1
2017-07-16 05:17



Apakah Anda memicu "paksa GC" menggunakan alat pengembang? Jika itu kasusnya dan benda-benda kemudian bertahan maka penelitian di atas adalah nilai.

Jika Anda tidak memicu GC melalui alat pengembang, maka ingatlah bahwa cara kerja mesin GC cukup rumit dan memiliki konsep kumpulan generasi (menggunakan dua generasi).

http://www.html5rocks.com/en/tutorials/memory/effectivemanagement/#toc-v8-gc

Bisa jadi Anda belum mencapai ambang batas yang diperlukan untuk memicu GC generasi muda, atau bahwa benda-benda itu telah bertumpu kepada Generasi lama, tetapi bahwa GC generasi lama tidak pernah terpicu.

Sayangnya, alat pengembang tampaknya tidak menunjukkan generasi mana yang GC'd.


1
2017-08-08 16:04