Manajemen memori skrip tindakan, pengumpulan sampah

Blog ini (dan lainnya) menyatakan bahwa Anda harus menyetel referensi objek ke null di dalam metode buang() Anda saat membersihkan objek.

Namun, Actionscript 3 (dengan Flash Player 9) menggunakan tandai dan sapu untuk menghapus referensi melingkar untuk Anda. Jadi saya bertanya-tanya: apakah benar-benar ada alasan untuk menghilangkan referensi objek Anda?


person Fragsworth    schedule 04.05.2011    source sumber


Jawaban (2)


Saya tidak pernah melakukannya - selama Anda melakukan hal yang sudah jelas:

  • Hancurkan semua referensi ke objek (hapus dari array, setel variabel yang menyimpan objek ke null, hapus dari daftar tampilan)
  • Hapus semua pendengar acara dan seterusnya

Kemudian memori yang digunakan oleh objek tersedia untuk ditimpa kapan saja.

var ar:Array = [];
var mc:MovieClip = new MovieClip();

mc.addEventListener(MouseEvent.CLICK, pants);

ar[ar.length] = mc;
addChild(mc);

if(mc.parent) mc.parent.removeChild(mc); // not garbage collected
mc.removeEventListener(MouseEvent.CLICK, pants); // still not garbage collected
ar.splice(0, 1); // finally garbage collected
person Marty    schedule 04.05.2011
comment
Ini adalah jawaban yang bagus, tetapi tidak akan siap untuk gc kecuali jika dihapus dari daftar tampilan. Jadi mungkin setelah ar.splice(0,1) pada contoh masukkan deleteChild(mc); - person Chris; 04.05.2011
comment
Itu dihapus dari DisplayList..? Bingung. - person Marty; 04.05.2011
comment
pengumpul sampah di AS3 menggunakan kombinasi penghitungan referensi dan penandaan serta sapuan. tandai dan sapuan sangat lambat. jika Anda dapat mengosongkan memori dengan menghilangkan referensi Anda, akan lebih cepat jika menunggu VM melakukan penandaan dan penyisiran karena tidak dapat menentukan mana yang gratis atau tidak. - person divillysausages; 04.05.2011
comment
Info bagus, saya akan menyimpannya dalam memori untuk proyek mendatang. - person Marty; 04.05.2011
comment
Perlu juga dicatat bahwa semakin BANYAK Anda dapat membatalkan semua referensi objek di objek Anda, semakin besar kemungkinan GC untuk menyapu bersihnya tanpa harus menggali lebih dalam rantai referensi objek tersebut. Hal ini sangat penting untuk menjaga pulau sampah Anda tetap kecil agar dapat dikumpulkan. Jika Anda hanya membatalkan 1 referensi objek dan mengharapkan sisa variabel yang saling direferensikan dikumpulkan... mungkin saja GC akan menyerah (lihat bit.ly/jIuKrQ). - person bigp; 04.05.2011

Ringkasan manajemen memori yang fantastis adalah presentasi Grant Skinner:

http://gskinner.com/talks/resource-management/

Singkatnya, saya tidak pernah null objek itu sendiri, tetapi membatalkan objek yang merujuknya (ada perbedaan yang halus namun penting). Semua referensi yang diperlukan untuk objek harus dimusnahkan, dan juga pendengar acara, dll.

Saat menambahkan pemroses acara, biasakan menyetel pemroses menjadi weak.

o.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);

Tidak ada kerugian dalam hal ini, dan berarti jika Anda membatalkan semua referensi ke objek Anda o namun masih ada pendengar yang terpasang, mereka akan menghapusnya sendiri, dan objek tersebut masih dapat ditandai untuk di-gc. Anda tetap harus menangani penghapusan pendengar Anda sendiri.

"jangan malas - bersihkan dirimu sendiri!"

Terakhir, Anda dapat menggunakan kelas Janitor untuk membantu memantau/membersihkan sumber daya Anda:

http://gskinner.com/libraries/

person Chris    schedule 04.05.2011