Chúng tôi có một ứng dụng tạo ra các JVM mới và thực hiện mã thay mặt cho người dùng của chúng tôi. Đôi khi những người hết bộ nhớ, và trong trường hợp đó hành xử theo những cách rất khác nhau. Đôi khi họ ném ra một OutOfMemoryError, đôi khi họ đóng băng. Tôi có thể phát hiện sau này bằng một sợi nền rất nhẹ dừng lại để gửi tín hiệu nhịp tim khi chạy thấp trên bộ nhớ. Trong trường hợp đó, chúng tôi giết JVM, nhưng chúng tôi không bao giờ có thể hoàn toàn chắc chắn lý do thực sự cho việc không nhận được nhịp tim là gì. (Nó cũng có thể là vấn đề về mạng hoặc lỗi phân đoạn.)Cách tốt nhất để xử lý các điều kiện bộ nhớ trong Java là gì?
Cách tốt nhất để phát hiện đáng tin cậy các điều kiện bộ nhớ trong JVM là gì?
Về lý thuyết, các -XX: OnOutOfMemoryError tùy chọn sẽ hứa hẹn, nhưng nó là một cách hiệu quả không sử dụng được do lỗi này: https://bugs.openjdk.java.net/browse/JDK-8027434
Bắt một OutOfMemoryError là thực sự không phải là một lựa chọn tốt vì các lý do nổi tiếng (ví dụ như bạn không bao giờ biết nó xảy ra ở đâu), mặc dù nó hoạt động trong nhiều trường hợp.
Các trường hợp còn lại là những trường hợp JVM bị đóng băng và không ném lỗi OutOfMemoryError. Tôi vẫn chắc chắn rằng bộ nhớ là lý do cho vấn đề này.
Có giải pháp thay thế hay giải pháp nào khác không? Thiết lập bộ sưu tập rác để làm cho JVM kết thúc chính nó thay vì đóng băng?
EDIT: Tôi có toàn quyền kiểm soát cả công cụ forking và JVM được chia rẽ cũng như mã đang được thực hiện bên trong, cả hai đều chạy trên Linux và sử dụng các tiện ích cụ thể của OS nếu điều đó có ích.
Có vẻ như những gì bạn thực sự quan tâm là phát hiện khi một bộ nhớ ngoài đã xảy ra trong * một quy trình khác *; một điểm quan trọng mà thậm chí không bị ám chỉ bởi tiêu đề của câu hỏi của bạn. – supercat
Cảm ơn. Tôi đã cố gắng làm rõ hơn trong bài đăng, nhưng tôi đã không thay đổi tiêu đề cho đến nay, vì tất cả các tiêu đề thay thế mà tôi có thể đưa ra đều gây hiểu lầm. Đặc biệt, tôi không quan tâm liệu chúng ta có lấy thông tin từ bên trong JVM hay không, từ JVM đang gọi, bằng cách xem nó như một JVM với hành vi cụ thể của nó, hoặc bằng cách chỉ xem nó như là một quá trình. –
Nếu bạn không cải thiện tiêu đề của mình, nhiều người có thể trả lời thậm chí không thể mở bài đăng của bạn. Có lẽ "Kích hoạt một báo động nếu một quá trình Java VM hết bộ nhớ" sẽ là một tiêu đề tốt hơn? – supercat