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.