คุณถูก. ตัวรวบรวมขยะหยุดการทำงานของแอปพลิเคชันชั่วคราว
อัลกอริธึมตัวรวบรวมขยะ Flash Runtime ทำงานเพิ่มขึ้นในขณะที่ทำเครื่องหมายหน่วยความจำที่ใช้งานอยู่ มันหยุดการทำงานของแอพพลิเคชั่นชั่วคราวเมื่อรวบรวมหน่วยความจำส่วนที่ไม่ได้ใช้ การหยุดชั่วคราวที่เกิดขึ้นเมื่อรอบการรวบรวมที่เพิ่มขึ้นเสร็จสิ้นอาจยาวนานกว่าที่ต้องการ และสามารถสังเกตหรือได้ยินได้ในบางโปรแกรม
จาก ข้อมูลอ้างอิง
ตรวจสอบว่าตัวรวบรวมขยะทำงานหรือไม่
ตามความรู้ของฉัน ไม่มีวิธีโดยตรงที่จะทราบได้ว่า GC วิ่งอยู่หรือไม่ แต่เป็นไปได้ที่จะให้ฟังก์ชันทดสอบดำเนินการบน ENTER_FRAME
และตรวจสอบว่ามีการรวบรวมขยะนับตั้งแต่การเรียกใช้ฟังก์ชันครั้งล่าสุดหรือไม่ อย่างมีประสิทธิภาพตั้งแต่เฟรมที่แล้ว
ด้วย Dictionary
ซึ่งสามารถจัดเก็บคีย์อ้างอิงที่ไม่รัดกุม คุณสามารถดูได้ว่ามีการรวบรวมออบเจ็กต์หรือไม่ หากเป็นกรณีนี้ การรวบรวมขยะจะต้องดำเนินการ ในคลาสต่อไปนี้ ฉันสร้างอ็อบเจ็กต์ใหม่ เพื่อตรวจสอบในภายหลังว่ามีการรวบรวมหรือไม่
package
{
import flash.display.Sprite;
import flash.utils.Dictionary;
public class GCTest
{
private static var dict:Dictionary = null;
public static function didGCRun():Boolean
{
if ( dict == null ) {
dict = new Dictionary(true);
}
var hasKeys:Boolean = false;
for ( var obj:* in dict ) {
hasKeys = true;
break;
}
if ( hasKeys ) {
return false;
}
else {
dict[new Sprite()] = null;
return true;
}
}
}
}
โดยการตรวจสอบในแต่ละเฟรม คุณจะรู้ว่า gc stroke หรือไม่
addEventListener(Event.ENTER_FRAME, onEnterFrame);
private function onEnterFrame(event:Event):void
{
var gcRan:Boolean = GCTest.didGCRun();
}
การใช้ความจำ
คุณยังสามารถตรวจสอบการรวบรวมขยะโดยตรวจสอบการใช้หน่วยความจำ เอกสารแนะนำให้ใช้ System.freeMemory()
ก>
จำนวนหน่วยความจำ (เป็นไบต์) ที่จัดสรรให้กับ Adobe Flash Player หรือ Adobe AIR และที่ไม่ได้ใช้งาน ส่วนที่ไม่ได้ใช้ของหน่วยความจำที่จัดสรร (System.totalMemory) จะผันผวนเมื่อมีการรวบรวมขยะ ใช้คุณสมบัตินี้เพื่อตรวจสอบการรวบรวมขยะ
ฉันจะใช้ค่านี้ร่วมกับ System.totalMemoryNumber()
ตรวจสอบเวลาดำเนินการ
เมื่อใช้ร่วมกับวิธีอื่นๆ การบันทึกอัตราเฟรมจริงหรือเวลาดำเนินการของบล็อกโค้ดอาจเป็นประโยชน์ ซึ่งสามารถทำได้โดยการจัดเก็บสถานะการออนไลน์ของโปรแกรมไว้ในตัวแปรและเปรียบเทียบในภายหลัง
ใช้ getTimer()
สำหรับการประมวลผลรันไทม์ Flash ActionScript 3.0 เมธอดนี้จะส่งคืนจำนวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่เครื่องเสมือนรันไทม์ Flash สำหรับ ActionScript 3.0 (AVM2) เริ่มทำงาน
var startTime:int = getTimer();
// execution or frame change
var executionTime:int = getTimer() - startTime;
เมื่อใช้กับแต่ละเฟรม คุณสามารถเปรียบเทียบสิ่งนี้กับ stage.frameRate
และตรวจสอบความคลาดเคลื่อน
แนะนำให้ผู้รวบรวมขยะดำเนินการ
ความเป็นไปได้ที่จะลดการหยุดชั่วคราวของคุณอาจเป็นการแนะนำให้ผู้รวบรวมขยะดำเนินการด้วยตนเอง System.pauseForGCIfCollectionImminent(imminence:Number = 0.75)
จะ หยุดการทำงานของโปรแกรมชั่วคราวหากความใกล้เข้ามาจริงสูงกว่าค่าอาร์กิวเมนต์
ความใกล้เข้ามานั้นหมายถึงระยะที่นักสะสมเชื่อว่ามันผ่านไปได้มากเพียงใด และด้วยเหตุนี้ความใกล้จะกระตุ้นให้เกิดการหยุดคอลเลกชันชั่วคราว อาร์กิวเมนต์ความใกล้เข้ามาของฟังก์ชันนี้คือขีดจำกัด: ตัวรวบรวมขยะจะถูกเรียกใช้เฉพาะเมื่อความใกล้เข้ามาจริงเกินค่าขีดจำกัด มิฉะนั้น สายนี้จะโทรกลับทันทีโดยไม่ดำเนินการใดๆ
โดยการเรียกใช้ฟังก์ชันนี้ด้วยค่าความใกล้เคียงต่ำ แอปพลิเคชันจะระบุว่ายินดีที่จะยอมรับว่าการมาร์กจำนวนค่อนข้างมากจะต้องเสร็จสิ้น ในทางกลับกัน ค่าความใกล้เคียงที่สูงบ่งชี้ว่าควรหยุดการใช้งานชั่วคราวเฉพาะในกรณีที่การมาร์กใกล้จะเสร็จสมบูรณ์เท่านั้น โดยปกติแล้ว การหยุดชั่วคราวจะนานกว่าในกรณีหลัง
ใกล้เข้ามา:ตัวเลข (ค่าเริ่มต้น = 0.75) — ตัวเลขระหว่าง 0 ถึง 1 โดยที่ 0 หมายถึงใกล้เข้ามาน้อยกว่า และ 1 หมายถึงใกล้เข้ามามากที่สุด ค่าที่น้อยกว่า 0 มีค่าเริ่มต้นเป็น 0.25 ค่าที่มากกว่า 1.0 จะมีค่าเริ่มต้นเป็น 1.0 NaN มีค่าเริ่มต้นอยู่ที่ 0.75
จาก ข้อมูลอ้างอิง
person
dreamlab
schedule
03.09.2014