Actionscript 3 kullanarak bir ByteArray yükünü kaldırma


91

ByteArrayActionScript 3'ü kullanarak bir bellekten zorla nasıl kaldırırım ?

Aşağıdakileri denedim:

// 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;
}

Yanıtlar:


35

Endişelenecek bir şeyin olduğunu sanmıyorum. Eğer System.totalMemoryiner sen rahatlatacaktır. Yeni boşaltılan belleği geri almayan işletim sistemi çok iyi olabilir (Flash Player'ın bir dahaki sefere daha fazla bellek isteyeceği beklentisiyle).

Bellek yoğun başka bir şey yapmayı deneyin ve eminim ki Flash Player'a ayrılan belleğin azalacağını ve bunun yerine diğer işlem için kullanılacağını fark edeceksiniz.

Anladığım kadarıyla, modern işletim sistemlerinde bellek yönetimi, her işlem için tahsis edilen miktarlara veya hatta tahsis edilen toplam miktara bakmak açısından sezgisel değildir.

Mac'imi 5 dakika kullandığımda 3 GB RAM'imin% 95'i kullanılıyor ve bu şekilde kalacak, asla düşmüyor. İşletim sisteminin belleği işleme şekli budur.

Başka bir yerde ihtiyaç duyulmadığı sürece, bırakılan işlemlerin bile kendilerine atanmış bellekleri vardır (bu, örneğin bir sonraki sefer daha hızlı başlamalarını sağlayabilir).


25

(Bu konuda olumlu değilim, ama ...)

AS3, deterministik olmayan bir çöp toplama kullanır; bu, çalışma zamanı böyle hissettiğinde başvurulan belleğin serbest bırakılacağı anlamına gelir (genellikle çalıştırılması pahalı bir işlem olduğundan çalıştırılması için bir neden olmadığı sürece). Bu, çoğu modern çöp toplama dilinin (C # ve Java gibi) kullandığı yaklaşımın aynısıdır.

Tarafından işaret edilen belleğe byteArrayveya dizinin kendi içindeki öğelere başka başvurular olmadığını varsayarsak byteArray, bildirilen kapsamdan çıktıktan sonra bellek bir noktada serbest kalacaktır .

Çöp toplamaya zorlayabilirsiniz, ancak gerçekten yapmamalısınız. Eğer yaparsanız, bunu sadece test için yapın. Bunu üretimde yaparsanız, performansa yardım etmekten çok daha fazla zarar verirsiniz.

GC'yi zorlamak için şunu deneyin (evet, iki kez):

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

Daha fazlasını buradan okuyabilirsiniz .


20

Bu makaleye bir göz atın

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

IANA actionscript programcısı, ancak benim aldığım his şu, çünkü çöp toplayıcı istediğiniz zaman çalışmayabilir.

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

Bu yüzden koleksiyon kodlarını denemenizi ve yardımcı olup olmadığına bakmanızı öneririm.

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();
}

16

Maalesef Flash / actionscript'te bellek yönetimi söz konusu olduğunda yapabileceğiniz pek bir şey yok. ActionScript kullanımı kolay olacak şekilde tasarlandı (bu nedenle insanların bellek yönetimi konusunda endişelenmesini istemediler)

Aşağıda bir ByteArraydeğişken oluşturmak yerine geçici bir çözüm bulabilirsiniz .

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

byteArrayDinamik özelliği nerede ise byteObject, onun için ayrılan belleği boşaltabilirsiniz.


16

Kendi sorunuzu yanıtladığınıza inanıyorum.

System.totalMemorysize tahsis edilmeyen, "kullanılan" toplam bellek miktarını verir. Uygulamanızın yalnızca 20 MB kullanıyor olabileceği doğrudur, ancak gelecekteki tahsisler için ücretsiz olan 5 MB'ye sahiptir.

Adobe belgelerinin belleği yönetme biçimine ışık tutup tutmayacağından emin değilim.


11

Yani, MySQL'den 20MB yüklersem, Görev Yöneticisinde uygulama için RAM yaklaşık 25MB artar. Sonra bağlantıyı kapattığımda ve ByteArray'i atmaya çalıştığımda, RAM asla serbest kalmıyor. Ancak, System.totalMemory kullanırsam, flash player, durum böyle değil, belleğin serbest bırakıldığını gösteriyor.

Flash player, Java gibi bir şey yapıyor ve yığın alanı ayırıyor ve uygulama kapanana kadar onu serbest bırakmıyor mu?

Evet ve hayır, sayısız blog gönderisinden AVM2'deki GC'nin iyimser olduğunu ve kendi gizemli yollarını çalışacağını okumuş olabileceğiniz gibi. Yani biraz Java gibi çalışıyor ve yığın alanı ayırmaya çalışıyor. Bununla birlikte, yeterince uzun süre bırakırsanız ve önemli miktarda bellek tüketen diğer işlemleri yapmaya başlarsanız, önceki alanı boşaltacaktır. Bunu, uygulamanızın üzerinde çalışan bazı testlerle birlikte bir gecede profil oluşturucuyu kullanarak görebilirsiniz.


10

Yani, MySQL'den 20MB yüklersem, Görev Yöneticisinde uygulama için RAM yaklaşık 25MB artar. Sonra bağlantıyı kapattığımda ve ByteArray'i atmaya çalıştığımda, RAM asla serbest kalmıyor. Ancak, System.totalMemory kullanırsam, flash player, durum böyle değil, belleğin serbest bırakıldığını gösteriyor.

Oynatıcı hafızayı "serbest bırakıyor". Pencereyi simge durumuna küçültüp geri yüklerseniz, anının artık System.totalMemory'nin gösterdiğine çok daha yakın olduğunu görmelisiniz.

Ayrıca, gerçekten bellek sızıntılarınız olup olmadığını size gösterebilecek FlexBuilder'ın profil oluşturma araçlarını kullanmak da ilginizi çekebilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.