30 Mayıs 2015 Cumartesi

OutOfMemory hatasına bağlı Thread Hung durumu

Threadlerin hung durumunda kalması müşterilerin ve yazılımcılarını en çok başını ağrıtan durumlardan birisidir.

Problemin kaynağını incelerken outofmemory almasına sebep olan durumu incelememiz gerekiyor. Anlık artan isteklerde sistemin kapasitesine bağlı yetersiz olması ya da memory üzerinde çalışan yazılımların kodlamasından kaynaklı olabilir.


Buradaki durumda monitor objesine sahip thread monitor objesini bırakmamaktadır. Aynı zamanda kuyrukta bekleyen threadlerde iş yapması için monitor objesini beklemektedir. Bu threadler belirli bir sayıyı geçince uygulama sunucusu alert vermeye başlar.İşte olay bu noktadan sonra kopmaya başlar J

JVM Analizinde “Hung” durumundaki threadler


Hung durumunda uygulama sunucusu(WebSphere AppServer örnek alındı) aşağıdaki gibi bir hata mesajı fırlatmaktadır.

Hung durumundaki threadlerin tespit edilmesi ayrı bir inceleme konusudur. Uygulama sunucuları burada kullanıcının da müdahale edebileceği çeşitli poliçeler yürütür. Örnek olarak WebSphere App Server da bir thread 10 dakikadan fazla wait durumunda kalırsa sunucu direk konsola hata logu fırlatmaya başlar. 

ThreadMonitor W   WSVR0605W: Thread "WebContainer : 0" (00000029) has been active for 647279 milliseconds and may be hung.  There is/are 49 thread(s) in total in the server that may be hung.


Hung durumundaki threadlerin memory segment analizine bakıldığında Free Memory oranları %10 un altına düşmüş bir seviyededir. Aşağıdaki tablo jvm in heap memory si değildir. Non-heap[1] memory kategorisindedir.


Threadlere dönecek olursak başımıza gelen senaryoyu ilk paragrafta özet olarak söylemiştim. Detayına inersek olay şöyle gerçekleşti. Block durumundaki bir threadin stacktrace ine bakıldığında,


WebContainer:333 threadinin iş yapması için Monitor nesnesini beklediğini belirtmektedir. Monitor nesnesi, thread senkronizasyonunda kullanılmaktadır. Veri tabanı sistemlerindeki “lock” gibi düşünebiliriz. Monitor e sahip olan thread işini bitirene kadar bu nesneyi bırakmaz. Bu sırada diğer threadler kuyrukta “blocked” durumunda ve “notify” edilmeyi beklerler.



Monitor nesnesine sahip olan thread e bakıldığında burada ilgili kod bloğuna bakılması gerekilir.


Kod bloğuna gidildiği vakit hatanın sebebi ortaya çıkmaktadır. Monitor nesnesi memoryde bir problem olduğunu tespit etmiştir bu sebeple hiç bir şekilde imageThreadMonitor.notifyAll() satırına erişememektedir. Bu satıra erişebilseydi “block” durumundaki threadleri tekrar çalışır duruma ve sistemi hizmet verebilir duruma getirebilirdi.