2010-06-26 22 views
5

Java'da, bellek bitmeden hemen önce bir şey yapmanın bir yolu var mı? Örneğin, önceki belge durumlarının bir listesini (geri almak için) tutmak ve bellek tükenmek üzereyken yalnızca çok eski durumları kaldırmak mı? ÖrneğinBellek bitmeden hemen önce bir şey yapın

+0

http://stackoverflow.com/questions/2679330/catching-java-lang-outofmemoryerror 'nin olası kopyası, http://stackoverflow.com/questions/1692230/is-it-possible-to-catch-out- bellek-istisna-in-java ve http://stackoverflow.com/questions/3058198/can-the-jvm-recover-from-an-outofmemoryerror-without-a-restart – BalusC

+1

Onlar OOME yakalamak hakkında bunun olmasını engellemekle ilgili. –

cevap

2

, (geri al) Önceki belge durumlarının listesini tutmak ve bellek tükenebilir üzere olduğunda yalnızca çok eski durumları kaldırır?

SoftReference ile bir şeyler yapabilirsiniz. Ayrıca java.lang.ref paketinin genel belgelerine de dikkat edin. Nesnelere yalnızca bir SoftReference aracılığıyla erişilebiliyorsa, yetersiz bellek hatası oluşmadan önce bunlar toplanacaklardır. Bununla birlikte, VM'lerin bu tür bir olaydan önce bu referansları saklamasının gerekmediğini veya hangi sırayla temizlenebileceğine dair herhangi bir garanti vermediğini unutmayın. Bunları, bir tür kalıcılık ile en iyi şekilde birleştirebilirsiniz.

1

Evet, kesinlikle mümkündür.

Muhtemelen önceki belge durumlarınız için SoftReference s listesini kullanırdım. Bellek yetersizliği oluşmadan önce bunların imha edilmesi garanti edilir.

Bazı periyodik aralıklarla, boş referansları listeden temizleyebilirsiniz.

hep en az bir :-) geri garanti edemez böylece aynı zamanda en son durumuna normal bir başvuru tutarak öneriyoruz

Bu JVM uygulanmasına bağlıdır, ancak eğer şanslıysanız JVM şunu yapacaktır En yeni eyaletleri tutun ve en eskileri atın. Bu, JVM özelliklerinde kesinlikle gerekli değildir, ancak önerilen davranıştır.

İlgili konular