2010-11-22 31 views
0

Kendi portunda bir com portundan veri okuyan ve bir veritabanına koyan bir java programı yazdım. İstisnalar oluştuğunda (veritabanı veya com) runtime.exec ile kendini yeniden başlatır. Bir günden ya da sonra program bazen donuyor. Bunun tam olarak gerçekleştiğini takip edemiyorum ama bir süre sonra olduğu görülüyor. Sizden biri sorunun ne olabileceğini biliyor mu? Teşekkür ederiz! sadece IO durumları yakalamak ve Runtime.exec yaparsanızJava programı donuyor

+0

Bağlantı noktası veya okuma verisi ne sıklıkla dinlenir? –

+1

Bu, bir noktada uygulamanızın uygulamanızın başka bir kopyasını çalıştıran, uygulamanızın başka bir kopyasını çalıştıran ve bunun gibi (istisna sayısına bağlı olarak) olduğu anlamına mı geliyor? – extraneon

+0

Olası http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems çoğaltması – Raedwald

cevap

1

, nedeniyle çok fazla JVM'lerle için, bellek yetersiz alabilirsiniz ... Eğer eski program emin (ve JVM) Are tamamen gitti yeni yaparken Runtime.exec? Yani, @extraneon'un söylediği gibi, programınızın programınızın başka bir örneğini oluşturmayacağından emin misiniz?

0

yazılımınızı uygulanan yönteme bağlı bir tasarım sorun olabilir.

Bir starter uygulamasından Runtime.exec() kullanırsanız, bu iyi olur. Eğer böyle bir şey varsa:

try { 
    doStuff(); 
} catch(Throwable t) { 
    Runtime.exec(...); 
} 

Eğer yazılımın birden fazla kopyası her bazı kaynaklar alarak ve asla bu geri vererek çalışan alacak. Böyle bir durumda, sadece arızalı ipliği temizlemeli ve yeni bir iş parçacığı başlatmalısınız (eğer mümkünse).

Daha açıkçası, bana göre bir marş uygulaması ana içinde olan bir şeydir pek fazla: Eğer() Runtime.exec ile süreçleri başlıyor stdout tüketiyor

while(true) { 
    Process p = Runtime.exec(your COM communication program); 
    if (p.waitFor() == 0 { // Clean exit 
     break; // exit while loop. 
    } 
    // Otherwise p closed with an error and a new process should be started 
    // which is done in the next iteration of the loop 
} 
0

ve stderr akışları? Hayır ise, uygulama işletim sistemi arabelleği dolduğunda donuyordu. Uygulama ne kadar çıktı üretirse ve ne sıklıkta istisnalar atarsa, sayılarınız değişebilir.