2010-08-27 20 views
13

Sistem testinde yeni bir dağıtımdan sonra, servletlerimizden biri her zamankinden çok daha fazla vuruldu ve belleklerin tırmanmaya başladığını ve weblogic'in sonunda öleceğini fark ettik. Stajyerim, çok gururlandım, bellek sızıntısının kaynağını keşfettim. Bir istek halinde gelseJAXBContext.newInstance bellek sızıntısı

, bu hat çağrılan: Nedense

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”); 

, nesne çöp toplandı geçmez. Statik hale getirdiğimizde ve başlattığımız yere taşındıktan sonra bellek sızıntımız kayboldu.

Geliştiricilerinden bir diğeri, bağımsız bir java uygulamasında bir süre bu çizgiyi koydu ve hafızanın yukarı ve yukarı doğru kaydığını gördü.

Bu nesnenin neden çöp toplanmamasına dair herhangi bir fikri var mı?

Teşekkür

cevap

8

Hangi uygulama & JAXB sürümünü kullanıyorsunuz? Java SE 6 ile birlikte gelen referans uygulamasını kullanıyorsanız, o zaman Metro (https://jaxb.dev.java.net/). Eğer o zaman hata ayıklama yardımcı olabilir Moxy uygulanmasını (http://www.eclipse.org/eclipselink/moxy.php) kullanıyor olursanız

:

İşte orada hafıza ile ilgili hataların bazıları.

İyi haber şu ki, JAXBContext iş parçacığı için güvenli ve yalnızca bir kez oluşturulmalı ve yeniden kullanılmalıdır. JAXBContext'i tekrar kullanmak, bellek sızıntınızı çözüyor gibi görünüyor. Daha fazla bilgi için

bkz:

+2

Bağlantı güncelleme: http://jaxb.java.net/guide/Performance_and_thread_safety.html –

+0

@ThangPham - Sağolun, sağladığınız yeni bağlantı ile benim cevap güncelledik. –

+0

Bu, JAXB for Java 7 sürümü ile ilgili bilinen bir sorun mu? Verdiğiniz çözüm hala geçerli olsa da, bunun hala aktif olarak izlenmesi gereken bir şey olup olmadığını bilmek iyi olur. –

1

Evet, bir sızıntı var. Bu yöntem her çağrıldığında "ruby.oracle_servlet.schemas" sınıfını yükler.

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)