การจัดการหน่วยความจำ Actionscript การรวบรวมขยะ

บล็อกนี้ (และอื่นๆ) ระบุว่าคุณควรตั้งค่า การอ้างอิงวัตถุเป็นโมฆะภายในวิธีการกำจัด () ของคุณเมื่อทำความสะอาดวัตถุ

อย่างไรก็ตาม Actionscript 3 (พร้อม Flash Player 9) ใช้ทำเครื่องหมายและกวาด เพื่อล้างข้อมูลอ้างอิงแบบวงกลมให้กับคุณ ดังนั้นฉันจึงสงสัยว่า: มีเหตุผลใดบ้างที่ทำให้การอ้างอิงวัตถุของคุณเป็นโมฆะ?




คำตอบ (2)


ฉันไม่เคยทำ - ตราบใดที่คุณทำสิ่งที่ชัดเจน:

  • ทำลายการอ้างอิงวัตถุทั้งหมด (ลบออกจากอาร์เรย์ ตั้งค่าตัวแปรที่จัดเก็บวัตถุเป็นค่าว่าง ลบออกจากรายการที่แสดง)
  • ลบ Listener เหตุการณ์ทั้งหมดและอื่นๆ

จากนั้นหน่วยความจำที่วัตถุใช้จะพร้อมสำหรับการเขียนทับได้ตลอดเวลา

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
นี่เป็นคำตอบที่ดี แต่จะไม่พร้อมสำหรับ gc เว้นแต่จะถูกลบออกจากรายการที่แสดง ดังนั้นบางทีหลังจาก ar.splice(0,1) ในตัวอย่าง ให้ใส่ RemoveChild(mc); - person Chris; 04.05.2011
comment
มันถูกลบออกจาก DisplayList..? สับสน. - person Marty; 04.05.2011
comment
ตัวรวบรวมขยะใน AS3 ใช้การผสมผสานระหว่างการนับอ้างอิง การทำเครื่องหมาย และการกวาด ทำเครื่องหมายและกวาด ช้า จริงๆ หากคุณสามารถเพิ่มหน่วยความจำโดยลบข้อมูลอ้างอิงของคุณได้ จะเร็วกว่ามากในการรอ VM เพื่อเริ่มทำเครื่องหมายและกวาดล้างเนื่องจากไม่สามารถระบุได้ว่ามีอะไรว่างหรือไม่ - person divillysausages; 04.05.2011
comment
ข้อมูลดีๆ ผมจะเก็บเอาไว้เป็นความทรงจำสำหรับโครงการต่อๆ ไปครับ - person Marty; 04.05.2011
comment
นอกจากนี้ยังเป็นที่น่าสังเกตว่ายิ่งคุณสามารถลบล้างการอ้างอิงวัตถุทั้งหมดในวัตถุของคุณได้มากขึ้นเท่าใด GC ก็จะยิ่งมีโอกาสกวาดล้างมากขึ้นโดยไม่ต้องขุดลึกลงไปในสายโซ่อ้างอิงของวัตถุ นี่เป็นสิ่งสำคัญมากในการที่จะรักษาเกาะขยะของคุณให้มีขนาดเล็กมากเพื่อที่จะรวบรวม หากคุณเพียงแค่ทำให้การอ้างอิงวัตถุเป็นโมฆะ 1 รายการและคาดหวังว่าส่วนที่เหลือของตัวแปรที่อ้างอิงระหว่างกันจะได้รับการรวบรวม ... เป็นไปได้ที่ GC จะยอมแพ้ (ดู bit.ly/jIuKrQ) - person bigp; 04.05.2011

บทสรุปที่ยอดเยี่ยมของการจัดการหน่วยความจำคือการนำเสนอของ Grant Skinner:

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

โดยสรุป ฉันไม่เคย null วัตถุนั้นเอง แต่เป็นโมฆะวัตถุที่อ้างอิงถึงพวกมัน (มีความแตกต่างเล็กน้อย แต่สำคัญ) การอ้างอิงทั้งหมดจำเป็นต้องทำลายวัตถุนั้น รวมถึงผู้ฟังเหตุการณ์ด้วย ฯลฯ

เมื่อเพิ่ม Listener กิจกรรม ให้สร้างนิสัยในการตั้งค่า Listener ให้เป็น weak

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

ไม่มีข้อเสียในเรื่องนี้ และหมายความว่าหากคุณลบการอ้างอิงทั้งหมดไปยังออบเจ็กต์ o แต่ยังมี Listener แนบอยู่ พวกเขาจะลบตัวเองออก และยังคงสามารถทำเครื่องหมายออบเจ็กต์เป็น gc'ed ได้ คุณยังควรจัดการกับการลบผู้ฟังของคุณเองไม่ว่าอย่างไรก็ตาม

"อย่าเกียจคร้าน - ทำความสะอาดตัวเอง!"

ในที่สุด คุณสามารถใช้คลาส Janitor เพื่อช่วยตรวจสอบ/ล้างทรัพยากรของคุณ:

http://gskinner.com/libraries/

person Chris    schedule 04.05.2011