Vì vậy, mỗi vài ngày, quá trình java của tôi trên Ubuntu bị giết tự động và tôi không thể hiểu tại sao.Điều gì đó tiếp tục giết chết quá trình Java của tôi trên Ubuntu, bất cứ ai cũng biết tại sao?
Hộp của tôi có 35,84 GB RAM, khi tôi khởi chạy quá trình Java, tôi chuyển thông số -Xmx28g, vì vậy nó nên sử dụng ít hơn RAM tối đa có sẵn.
Tôi chạy jstat như sau:
# jstat -gccause -t `pgrep java` 60000
Một vài dòng cuối cùng của sản lượng từ jstat ngay lập tức trước khi quá trình bị giết là:
Time S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
14236.1 99.98 0.00 69.80 99.40 49.88 1011 232.305 11 171.041 403.347 unknown GCCause No GC
14296.2 93.02 0.00 65.79 99.43 49.88 1015 233.000 11 171.041 404.041 unknown GCCause No GC
14356.1 79.20 0.00 80.50 99.55 49.88 1019 233.945 11 171.041 404.986 unknown GCCause No GC
14416.2 0.00 99.98 24.32 99.64 49.88 1024 234.945 11 171.041 405.987 unknown GCCause No GC
này có vẻ là những gì đã đi xuống trong/var/log/syslog trong khoảng thời gian này: https://gist.github.com/1369135
Thực sự không có gì chạy trên máy chủ này ngoài ứng dụng java của tôi. Chuyện gì vậy?
chỉnh sửa: Tôi đang chạy phiên bản java 1.6.0_20, thông số đáng chú ý duy nhất tôi chuyển đến java khi khởi động là "-server -Xmx28g". Tôi không sử dụng máy chủ ứng dụng nhưng ứng dụng của tôi nhúng "khung web đơn giản".
RAM vật lý tối đa không tương đương với quá trình có thể sử dụng. Eric Lippert có một bài đăng tuyệt vời về. Tôi biết bài viết là Windows/.NET centric, nhưng nó cũng rất đáng kinh ngạc. Chỉ cần ra khỏi tò mò, bạn có thể cố gắng để bắt một OutOfMemoryError và đăng nhập này để xác nhận/từ chối rằng đây là nguyên nhân? –
Tôi đang đăng nhập stdout và stderr, mà tôi tin là nơi một OOM sẽ đi, và tôi không thấy bất cứ điều gì mà sẽ chỉ ra một ngoại lệ OOM ... Trong kinh nghiệm của tôi một kết quả OOM trong ứng dụng bỏ, không bị giết. Trong trường hợp này có vẻ như ứng dụng đã bị hệ điều hành giết. – sanity