Pertanyaan Unloading ByteArray menggunakan Actionscript 3


Bagaimana cara saya secara paksa membongkar a ByteArray dari memori menggunakan ActionScript 3?

Saya telah mencoba yang berikut:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}

76
2017-08-01 12:30


asal


Jawaban:


Saya tidak berpikir Anda memiliki sesuatu yang perlu dikhawatirkan. Jika System.totalMemory turun Anda bisa bersantai. Ini mungkin sekali OS yang tidak merebut kembali memori yang baru dibebaskan (untuk mengantisipasi Flash Player berikutnya akan meminta lebih banyak memori).

Coba lakukan hal lain yang sangat membutuhkan memori dan saya yakin Anda akan menyadari bahwa memori yang dialokasikan untuk Flash Player akan berkurang dan digunakan untuk proses lain.

Seperti yang saya pahami, manajemen memori di OS modern tidak intuitif dari perspektif melihat jumlah yang dialokasikan untuk setiap proses, atau bahkan jumlah total yang dialokasikan.

Ketika saya menggunakan Mac saya selama 5 menit, 95% dari RAM 3 GB saya digunakan, dan itu akan tetap seperti itu, tidak pernah turun. Itu hanya cara OS menangani memori.

Selama tidak diperlukan di tempat lain bahkan proses yang telah berhenti masih memiliki memori yang ditugaskan kepada mereka (ini dapat membuat mereka meluncurkan lebih cepat di lain waktu, misalnya).


31
2017-08-14 17:05



(Saya tidak yakin tentang ini, tapi ...)

AS3 menggunakan koleksi sampah non-deterministik. Yang berarti bahwa memori yang tidak direferensikan akan dibebaskan kapanpun runtime terasa seperti itu (biasanya tidak kecuali ada alasan untuk menjalankannya, karena ini adalah operasi yang mahal untuk dijalankan). Ini adalah pendekatan yang sama yang digunakan oleh kebanyakan bahasa pengumpulan sampah modern (seperti C # dan Java juga).

Dengan asumsi tidak ada referensi lain ke memori yang ditunjukkan oleh byteArray atau item dalam larik itu sendiri, memori akan dibebaskan di beberapa titik setelah Anda keluar dari ruang lingkup di mana byteArray dinyatakan.

Anda dapat memaksa pengumpulan sampah, meskipun Anda tidak seharusnya melakukannya. Jika Anda melakukannya, lakukan hanya untuk menguji ... jika Anda melakukannya dalam produksi, Anda akan lebih merusak kinerja daripada membantu.

Untuk memaksa GC, coba (ya, dua kali):

flash.system.System.gc();
flash.system.System.gc();

Anda dapat membaca lebih lanjut di sini.


22
2017-08-01 13:08



Silahkan lihat artikel ini

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

Program actionscript IANA, namun perasaan yang saya dapatkan adalah itu, karena garbage collector mungkin tidak berjalan ketika Anda menginginkannya.

Karenanya http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Jadi saya akan merekomendasikan mencoba kode koleksi mereka dan melihat apakah itu membantu

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

17
2017-08-01 13:08



Saya yakin Anda telah menjawab pertanyaan Anda sendiri ...

System.totalMemory memberi Anda jumlah total memori yang "digunakan", tidak dialokasikan. Ini akurat bahwa aplikasi Anda mungkin hanya menggunakan 20mb, tetapi memiliki 5mb yang gratis untuk alokasi di masa mendatang.

Saya tidak yakin apakah dokumen Adobe akan menjelaskan cara mengelola memori ...


14
2017-08-01 14:03



Sayangnya ketika datang ke manajemen memori di Flash / actionscript tidak banyak yang bisa Anda lakukan. ActionScript dirancang untuk mudah digunakan (sehingga mereka tidak ingin orang harus khawatir tentang manajemen memori)

Berikut ini adalah solusi, bukannya membuat ByteArray variabel coba ini.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

Dimana byteArray adalah properti dinamis byteObject, Anda dapat membebaskan memori yang dialokasikan untuk itu.


14
2017-08-01 13:14



Jadi, jika saya memuat mengatakan 20MB dari MySQL, di Task Manager RAM untuk aplikasi naik sekitar 25MB. Kemudian ketika saya menutup koneksi dan mencoba membuang ByteArray, RAM tidak pernah membebaskan. Namun, jika saya menggunakan System.totalMemory, flash player menunjukkan bahwa memori sedang dirilis, yang tidak demikian.

Apakah flash player melakukan sesuatu seperti Java dan memesan ruang heap dan tidak melepaskannya sampai aplikasi berhenti?

Yah ya dan tidak, karena Anda mungkin telah membaca dari blogposts yang tak terhitung jumlahnya GC di AVM2 optimis dan akan bekerja itu sendiri cara misterius. Jadi itu bekerja agak mirip Java dan mencoba untuk cadangan ruang tumpukan, namun jika Anda membiarkannya cukup lama dan mulai melakukan operasi lain yang mengkonsumsi beberapa memori signifikan itu akan membebaskan ruang sebelumnya. Anda dapat melihat ini menggunakan profiler di malam hari dengan beberapa tes yang berjalan di atas aplikasi Anda.


9
2017-09-17 10:09



Jadi, jika saya memuat mengatakan 20MB dari MySQL, di Task Manager RAM untuk aplikasi naik sekitar 25MB. Kemudian ketika saya menutup koneksi dan mencoba membuang ByteArray, RAM tidak pernah membebaskan. Namun, jika saya menggunakan System.totalMemory, flash player menunjukkan bahwa memori sedang dirilis, yang tidak demikian.

Pemain "melepaskan" memori. Jika Anda meminimalkan jendela dan mengembalikannya Anda akan melihat bahwa memeori sekarang lebih dekat dengan yang ditunjukkan oleh System.totalMemory.

Anda mungkin juga tertarik menggunakan alat profil FlexBuilder yang dapat menunjukkan apakah Anda benar-benar memiliki kebocoran memori.


8
2017-10-06 18:16



Gunakan sumber daya ini:

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html

dan ini

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html


6
2017-07-24 04:48