BU JAVA 9 İLE ESKİ OLMALIDIR!
Onun java.util.Cleaner
yerine kullanın ! (Veya sun.misc.Cleaner
daha eski JRE'de)
Orijinal gönderi:
PhantomReferences'ın kullanımının, sonlandırıcı yöntemlerle neredeyse aynı miktarda tuzağa sahip olduğunu buldum (ancak doğru anladığınızda daha az sorun var). Java 8 için küçük bir çözüm (PhantomReferences kullanmak için çok küçük bir çerçeve) yazdım. Nesne kaldırıldıktan sonra çalıştırılacak geri çağırmalar olarak lambda ifadelerinin kullanılmasına izin veriyor. Kapatılması gereken iç kaynaklar için geri aramaları kaydedebilirsiniz. Bununla benim için işe yarayan ve onu çok daha pratik hale getiren bir çözüm buldum.
https://github.com/claudemartin/java-cleanup
Bir geri aramanın nasıl kaydedildiğini gösteren küçük bir örnek:
class Foo implements Cleanup {
public Foo() {
this.registerCleanup((value) -> {
try {
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
Ve sonra, yukarıdakinin aynısını yapan, otomatik kapatma için daha da basit bir yöntem var:
this.registerAutoClose(this.resource);
Sorularınızı cevaplamak için:
[o zaman ne işe yarar]
Var olmayan bir şeyi temizleyemezsin. Ancak hala var olan ve kaldırılabilmeleri için temizlenmesi gereken kaynaklara sahip olabilirdi.
Ama bu kavramın / sınıfın faydası nedir?
Hata ayıklama / günlüğe kaydetme dışında herhangi bir etkiye sahip bir şey yapmak zorunlu değildir. Ya da belki istatistikler için. Bunu daha çok GC'den bir bildirim hizmeti gibi görüyorum. Nesne kaldırıldıktan sonra alakasız hale gelen birleştirilmiş verileri kaldırmak için de kullanmak isteyebilirsiniz (ancak bunun için muhtemelen daha iyi çözümler vardır). Örnekler genellikle veritabanı bağlantılarının kapatılacağından bahsediyor, ancak bunun işlemlerle çalışamadığınız için nasıl iyi bir fikir olduğunu anlamıyorum. Bir uygulama çerçevesi bunun için çok daha iyi bir çözüm sağlayacaktır.
Bunu hiç bir projenizde kullandınız mı veya bunu kullanmamız gereken herhangi bir örneğiniz var mı? Yoksa bu kavram sadece görüşme açısından mı yapılmıştır;)
Çoğunlukla sadece kayıt için kullanıyorum. Böylece kaldırılan öğeleri izleyebilir ve GC'nin nasıl çalıştığını ve ince ayar yapılabileceğini görebilirim. Bu şekilde herhangi bir kritik kod çalıştırmam. Bir şeyin kapatılması gerekiyorsa, o zaman bir kaynakla dene ifadesinde yapılmalıdır. Bellek sızıntısı olmadığından emin olmak için bunu birim testlerinde kullanıyorum. Jontejj'in yaptığı gibi. Ama benim çözümüm biraz daha genel.