Öyle olmadığını düşünürdüm, ama dün yapmak zorunda kaldım. Asenkron işleri işlemek için Akka'yı (JVM için bir aktör sistemi uygulaması) kullanan bir uygulamadır . Oyunculardan biri bir miktar PDF manipülasyonu yapıyor ve kütüphane buggy olduğu için StackOverflowError
her seferinde ölüyor .
İkinci yönü, herhangi bir JVM ölümcül hatanın (örneğin StackOverflowError) yakalanması durumunda Akka'nın tüm aktör sistemini kapatacak şekilde yapılandırılmış olmasıdır.
Üçüncü husus, bu oyuncu sisteminin bir web uygulamasına (WTF-ish, miras, nedenler için) yerleştirilmiş olmasıdır, bu nedenle oyuncu sistemi kapatıldığında web uygulaması değildir. Net etki, bir StackOverflowError
iş işleme uygulamamızın sadece boş bir web uygulaması haline gelmesidir.
Hızlı bir düzeltme StackOverflowError
olarak, atılmayı yakalamak zorunda kaldım , böylece aktör sisteminin iplik havuzu bozulmadı. Bu bana, özellikle bu gibi durumlarda bu tür hataları yakalamanın belki de yolunda olabileceğini düşünmemi sağladı? Bir iş parçacığı havuzu keyfi görevleri işleme olduğunda? Bir aksine, bir uygulamanın tutarsız bir durumda OutOfMemoryError
nasıl bırakılabileceğini hayal edemiyorum StackOverflowError
. Yığın böyle bir hatadan sonra silinir, böylece hesaplama normal şekilde devam edebilir. Ama belki de önemli bir şeyi özlüyorum.
Ayrıca, hatayı ilk etapta hatayı düzelttiğime dikkat edin (aslında birkaç gün önce bu aynı uygulamada bir SOE'yi düzelttim), ancak bunun ne zaman olduğunu bilmiyorum Böyle bir durum ortaya çıkabilir.
StackOverflowError
İşi yakalamak yerine JVM işlemini yeniden başlatmak, bu işi başarısız olarak işaretlemek ve işime devam etmek neden daha iyi olsun ?
SOE'leri asla yakalayamamak için zorlayıcı bir sebep var mı? Bana hiçbir şey söylemeyen belirsiz bir terim olan "en iyi uygulamalar" dışında.
StackOverflowException
s genellikle sonlandırılmayan bir yöntem çağrısı zincirinden kaynaklanır - yığın alanını artırmak, yeni bir iş parçacığının bellek maliyetini hiçbir fayda sağlamaz.
:-)