Actionscript 3'ü kullanan bir ByteArray Boşaltma

oy
72

Nasıl zorla bir boşaltıyorlar ByteArrayActionScript 3 kullanarak hafızayı?

Ben aşağıdaki 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;
}
Oluştur 01/08/2008 saat 13:30
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
29

Ben endişelenecek bir şey olduğunu sanmıyorum. Eğer System.totalMemoryiner sen rahatlatacaktır. Çok iyi (Flash Player fazla bellek için soracaktır dahaki sefere beklentisiyle) yeni serbest bellek geri gelmez OS olabilir.

Çok yoğun bellek başka bir şey yapmayı deneyin ve sana Flash Player'a ayrılan bellek azalacak ve bunun yerine diğer işlem için kullanılacak fark edeceksiniz eminim.

Onu anladım gibi, modern işletim yıllarda bellek yönetimi her işlem veya tahsis edilen hatta toplam miktarın tahsis miktarlarda bakarak açısından sezgisel değildir.

Benim 3 GB RAM% 95 kullanılır ve bu şekilde kalacak 5 dakika boyunca benim Mac kullandım, bu aşağı gitmez. Bu sadece işletim sistemi belleği işleme yoludur.

başka bir yerde gerekli değil sürece hala çıkmak bile süreçler kendilerine tahsis hafızaya sahip (bu onları örneğin, hızlı bir dahaki sefere başlatmak yapabilirsiniz).

Cevap 14/08/2008 saat 18:05
kaynak kullanıcı

oy
19

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

AS3 olmayan bir deterministik çöp toplama kullanır. Hangi çalışma zamanı gibi hissediyor ne zaman (çalıştırmak için bir neden yok sürece yürütmek için pahalı bir operasyon beri, değil tipik) başvurulmayan bellek kadar serbest olacağı anlamına gelir. Bu (C # ve Java yanı gibi) en modern çöp toplanan dillerde tarafından kullanılan aynı yaklaşımdır.

Belleğe başka bir başvuru olmaması varsayarsak tarafından şurada işaret byteArrayyoksa kapsamını çıktıktan sonra dizinin kendi içindeki öğeleri, hafıza bir noktada serbest bırakılacak byteArraybildirildi.

Gerçi gerçekten olmamalı bir çöp toplama zorlayabilir. Eğer yaparsanız, üretimde yaparsanız, bunu yardım çok daha fazla performansını olumsuz edeceğiz ... sadece test için bunu.

Bir GC zorlamak için (evet, iki kez) deneyin:

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

Daha buradan okuyabilirsiniz .

Cevap 01/08/2008 saat 14:08
kaynak kullanıcı

oy
15

Bu yazıda göz at

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

IANA actionscript programcı, ancak ben alıyorum duygu siz istediğiniz zaman çöp toplayıcı çalışmayabilir, çünkü olmasıdır.

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

Bu yüzden koleksiyon koduna denediğiniz tavsiye ve yardımcı olmadığını görmek istiyorum

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();
}
Cevap 01/08/2008 saat 14:08
kaynak kullanıcı

oy
13

Bence kendi soru cevap var inanıyorum ...

System.totalMemorySize "kullanılan" olan toplam bellek miktarını, tahsis değil verir. Sizin uygulama sadece 20 MB kullanıyor olabileceğini doğrudur, ancak gelecekte tahsisleri için ücretsizdir 5MB vardır.

Adobe dokümanlar belleği yönetir yolda ışık tutacak olsaydı emin değilim ...

Cevap 01/08/2008 saat 15:03
kaynak kullanıcı

oy
13

O bellek yönetimi konusunda maalesef zaman Flaş / actionscript yapabileceğiniz bir sürü yoktur. ActionScript kullanımı kolay olacak şekilde tasarlanmıştır (böylece insanların hafıza yönetimi hakkında endişelenmenize gerek istemiyordu)

Aşağıdaki yerine yaratma, bir geçici çözüm olduğunu ByteArraydeğişken bunu deneyin.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

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

Nerede byteArraydinamik bir özelliktir byteObject, bunun için ayrılan belleği siz serbest olabilir.

Cevap 01/08/2008 saat 14:14
kaynak kullanıcı

oy
9

Ben Görev Yöneticisi, MySQL dan 20 MB demek yüklerseniz Yani, uygulama için RAM yaklaşık 25MB tarafından artar. Bağlantıyı kapatmak ve ByteArray elden çalıştığınızda Sonra, RAM boşaltır olmadı. Ben System.totalMemory kullanmak Ancak, flash player bellek durum böyle değil ki, serbest bırakıldıktan olduğunu göstermektedir.

flash player Java gibi bir şey yapıyor ve yığın yeri ayrılması ve uygulama sonlandırılıyor kadar serbest değil midir?

sayısız blogposts okunan edilebileceği gibi evet ve hayır, AVM2'de GC iyimser ve vardır kendi gizemli yollarını çalışacaktır. Yani bu o önceki boşluk kurtaracak yeterince uzun izin vermedi ve bazı önemli bellek tüketen diğer faaliyetlere başlaması ancak eğer, Java gibi biraz çalışmak yapar ve yığın yer ayırtmak çalışır. Bazı testler uygulamanızın üst üzerinde çalışan ile gece boyunca Profilcinin kullanarak görebilirsiniz.

Cevap 17/09/2008 saat 11:09
kaynak kullanıcı

oy
7

Ben Görev Yöneticisi, MySQL dan 20 MB demek yüklerseniz Yani, uygulama için RAM yaklaşık 25MB tarafından artar. Bağlantıyı kapatmak ve ByteArray elden çalıştığınızda Sonra, RAM boşaltır olmadı. Ben System.totalMemory kullanmak Ancak, flash player bellek durum böyle değil ki, serbest bırakıldıktan olduğunu göstermektedir.

oyuncu belleği "serbest" olan. Pencereyi simge ve geri Eğer memeory neyi System.totalMemory gösterilere şimdi çok daha yakın olduğunu görmelisiniz.

Eğer gerçekten bellek sızıntılarını varsa da gösterebilir FlexBuilder en profilleme araçlarını kullanarak ilginizi çekebilir.

Cevap 06/10/2008 saat 19:16
kaynak kullanıcı


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more