Dulu saya berpikir itu bukan, tapi kemarin saya harus melakukannya. Ini adalah aplikasi yang menggunakan Akka (implementasi sistem aktor untuk JVM) untuk memproses pekerjaan yang tidak sinkron. Salah satu aktor melakukan beberapa manipulasi PDF, dan karena perpustakaannya bermasalah, ia mati StackOverflowError
setiap saat.
Aspek kedua adalah bahwa Akka dikonfigurasi untuk mematikan seluruh sistem aktornya jika ada kesalahan fatal JVM (mis. StackOverflowError) tertangkap.
Aspek ketiga adalah bahwa sistem aktor ini tertanam di dalam aplikasi web (untuk WTF-ish, warisan, alasan), jadi ketika sistem aktor dimatikan, aplikasi web tidak. Efek bersihnya adalah bahwa pada StackOverflowError
aplikasi pemrosesan pekerjaan kita menjadi hanya aplikasi web kosong.
Sebagai perbaikan cepat saya harus menangkap StackOverflowError
pelemparan, sehingga kumpulan benang dari sistem aktor tidak dirobohkan. Ini membuat saya berpikir bahwa mungkin kadang-kadang tidak apa-apa untuk menangkap kesalahan seperti itu terutama dalam konteks seperti ini? Kapan ada kumpulan thread yang memproses tugas sewenang-wenang? Tidak seperti OutOfMemoryError
saya tidak dapat membayangkan bagaimana seorang StackOverflowError
dapat meninggalkan aplikasi dalam keadaan tidak konsisten. Tumpukan dihapus setelah kesalahan seperti itu, sehingga perhitungan dapat berjalan secara normal. Tapi mungkin aku melewatkan sesuatu yang penting.
Juga, perlu dicatat bahwa saya semua untuk memperbaiki kesalahan di tempat pertama (sebenarnya saya sudah memperbaiki BUMN di aplikasi yang sama beberapa hari yang lalu), tapi saya benar-benar tidak tahu kapan ini situasi semacam itu mungkin muncul.
Mengapa lebih baik memulai kembali proses JVM daripada menangkap StackOverflowError
, menandai pekerjaan itu gagal, dan melanjutkan bisnis saya?
Apakah ada alasan kuat untuk tidak pernah menangkap BUMN? Kecuali "praktik terbaik", yang merupakan istilah tidak jelas yang tidak memberi tahu saya apa pun.
StackOverflowException
s biasanya karena rantai panggilan metode yang tidak berhenti - meningkatkan ruang stack kemudian akan meningkatkan biaya memori utas baru tanpa manfaat.
:-)