2011-11-10 15 views
24

Java uygulamamın (tomcat6 üzerinde çalışır) sonlandırılmayan bir çok iş parçacığı oluşturduğunu fark ettim. Beklemedeki/uykudaki sorunların nedenini bulma

Bu yüzden bir iş parçacığı dökümü oluşturulur ve bu gibi bekleyen iş parçacığı ton olduğunu fark:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) 
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:680) 
    Locked ownable synchronizers: 
    - None 

Şimdi soru şu: NE Bu konu bekliyorsun? Bu konuları ürettikleri sanılan bir şüpheli sınıfım var ama bu konuların tam olarak ne yaptığını bilmiyorum.

Sınıfı birbirinden ayırmak ve iş parçacığı davranışını takip etmek dışında bunun nedenini bulmak için yapabileceğim bir şey var mı?

+1

Bir kuyrukta engelleniyorlar. Özellikle, bir sıra boş olduğunda sonsuza kadar engelleyen 'LinkedBlockingQueue.take()'. –

+1

Bu ne anlama geliyor? Hangi sıra ve ne yaparsın? – Timo

+1

Erm, bu senin kodun ... biz medyum değiliz. Sadece iplik döküntüsünün sana söylediği şeyi söylüyorum. –

cevap

19

Tomcat üzerinde, genellikle birinin bağlanmasını bekleyen çalışan iş parçacıklarını talep ederler. Endişelenecek bir şey yok. Sunucunuza bir kerede bağlanan 100 kullanıcıyı işlemeye hazırlar.

+0

Bu olamaz. Uygulamamda bu konuları içeren bir düğmeyi açıkça tıklayabilirim. Tıklandığında, bu konular görüntülenir.Bir süre sonra bu iş parçacıkları, sunucunun çöktüğü çok fazla bellek tüketir. – Timo

+0

Bir iş parçacığı engellenirse (örneğin, bir kuyrukta beklerken), daha fazla bellek tüketemezler - çalışmıyorlar ve bu nedenle herhangi bir istekte bulunamazlar. Eğer bir şey varsa, yığınları bir süre bekledikten sonra disk belleği alabilir ve gerçek RAM kullanımını azaltabilir. –

+5

Bu konuda @ptyx ile aynı fikirdeyim. Uygulamanızdaki bir düğmeyi tıklamak Tomcat sunucusuna istek gönderir. Tahminimce, Tomcat'e girişimci olmak istediğiniz için çok fazla sayıda talebi karşılayabileceğini söyleyen kötü bir konfigürasyonunuz var. Tomcat, 'threadPoolExecutor' içinde' 'ThreadPoolSize'' öğesine ulaşmadığından yeni bir' Thread' yapmaya devam ediyor. Sonuçta çok sayıda iş parçacığı için yapılandırdığınız ancak bu iş parçacıkları için gereken tüm yığın alanını ayırmak için yeterli belleğe izin verilmediğinden sunucunuzu çökertir. Ama bu benim tahminim. –

6

Bu konular, ThreadPool'un bir parçasıdır. Daha özel java.util.concurrent.ThreadPoolExecutor. İş parçacığı havuza gönderilecek bir Runnable/Callable üzerinde bekliyor. Örneğin

ExecutorService e = Executors.newFixedThreadPool(10); 

için

e.submit(new Runnable(){ 
    public void run(){ ...} 
}); 

Sonra bir iplik bildirilecektir kadar bir bekleme oturup o katedilebilen çağıracağı 10 konuları yaratacaksınız. Ne için kullanıldığını söyleyemem. İplik havuzunu neyin başladığını bulmanız gerekecek. Belki de işleme müşterisi uygulama sunucusuna talepte bulunur.

+0

Düşünme. Bu iş parçacığı sabit değil. Kullanıcı uygulama ile etkileşime girdiğinde dinamik olarak oluşturulurlar. Uzun kullanımdan sonra yüzlerce tanesi var, sadece 10 değil. – Timo

+0

Kullanıcı etkileştikten sonra ne olacağını öğrenmek zorundasınız. Örneğimde gördüğünüz gibi herkes bu konuları oluşturabilir. Bize neler olduğu hakkında daha fazla bilgi alırsanız size yardımcı olabiliriz. –

İlgili konular