Làm thế nào để lấy Java Heap đáng tin cậy?


9

Nhóm của tôi đang gặp khó khăn khi cố gắng thực hiện các cú heap tốt được kích hoạt bởi OutOfMemoryErrors. Vì các lý do cụ thể, chúng tôi hiện đang thực hiện các kết xuất với jmap được gọi từ tập lệnh bash thay vì sử dụng cờ HeapDumpOnOutOfMemoryError. Chúng tôi đang sử dụng JVM 64 bit với kích thước heap khoảng 3 GB. Đống đống của chúng tôi thất bại 90% thời gian (dự đoán).

Có bất cứ điều gì chúng ta có thể làm để cải thiện tỷ lệ nhận được một đống heap sạch mà chúng ta có thể sử dụng để khắc phục sự cố bộ nhớ không? Tôi đã đọc rằng jmap có các vấn đề lớn trong Java 1.4 nhưng những vấn đề đó nên được giải quyết chủ yếu ngay bây giờ.


4
Tôi đề cử câu hỏi này cho "âm thanh kinh tởm nhất vô tình".
phoebus

1
Hah- Tôi đã nghĩ về việc làm cho nó nghe có vẻ kinh tởm nhưng tôi mới ở đây và tôi không chắc cộng đồng sẽ làm thế nào :).
karlcyr

Câu trả lời:


7

Đó là hệ điều hành của bạn? (Tôi không thể thêm ý kiến).

Đối với Solaris, chúng tôi nhận được kết quả tốt hơn trước tiên khi buộc kết xuất lõi ( gcore <pid>) và sau đó đính kèm jmap vào tệp kết xuất lõi ( jmap -heap:format=b <path to java bin> <path to core>)

gcorelà một tiện ích * nix để tạo hình ảnh của một chương trình đang chạy. Xem liên kết .


đã thử nó với gdb trên linux và nó hoạt động rất tốt.
Christian

JDK nào có "gcore"? Của tôi, Sun 32 bit jdk cho linux 1.6.0.20 không có nó.
djangofan

Chỉnh sửa với làm rõ gcore.
fglez

2

chúng tôi có một tệp truy vấn ManagementFactory.getThreadMXBean () và tạo một báo cáo. Có thể không hữu ích khi ứng dụng bị sập, nhưng nếu bạn thăm dò ý kiến ​​mỗi phút hoặc lâu hơn, bạn sẽ biết được điều gì đang xảy ra.

Thêm thông tin ở đây.


2

bạn có thể theo dõi ứng dụng của mình thông qua jmx từ bên ngoài. khi bạn biết một số số liệu chỉ ra OutOfMemory sắp tới, bạn có thể kích hoạt chạy jmap trước khi ném ngoại lệ.


Cảm ơn Christian- jmap có đáng tin cậy hơn trước khi lỗi được đưa ra không?
karlcyr

jmap vẫn sẽ cần một chút thời gian để giúp bạn có được một đống. nhưng bạn sẽ nhận được một heapdump đầy đủ miễn là jvm / tomcat của bạn chủ yếu chịu trách nhiệm.
Christian

Tôi nghĩ rằng công cụ sạch nhất và dễ nhất để làm điều này là "Visual VM". Nó có thể nằm ngoài phạm vi nhưng việc tạo một plugin tùy chỉnh cho VisualVM phát hiện điều kiện và lấy kết xuất tự động từ bên trong VisualVm sẽ là IMHO tuyệt vời.
djangofan

2

Cảm ơn tất cả các bạn cho lời đề nghị của bạn.

Những gì chúng tôi cố gắng làm là viết một kịch bản để chủ động theo dõi nhật ký thu gom rác. Theo kinh nghiệm của chúng tôi, Full GC back-to-back hầu như luôn luôn đứng trước một OOM, vì vậy tập lệnh của chúng tôi phát hiện sự kiện này, loại bỏ máy chủ một cách duyên dáng khỏi nhóm cân bằng tải và buộc đổ đống. Điều này đã làm tăng đáng kể hiệu quả của chúng tôi.


2

Đây là một câu hỏi khá cũ, nhưng tôi sẽ đặt câu trả lời với hy vọng ai đó có thể thấy điều này hữu ích.

jmap có tùy chọn -F (lực). Điều này đã được chứng minh là không hoạt động tốt trong quá khứ đối với tôi. Nếu bạn sử dụng tùy chọn -F, tôi khuyên bạn cũng nên chỉ định thư mục java.io.tmp là một phần của lệnh jmap. Đã xảy ra sự cố với phiên bản JVM 1.6.22 khi tiện ích jmap không hoạt động chính xác do cài đặt thư mục tạm thời.

Bạn cũng có thể thử lấy một bãi chứa lõi thông qua gdb. Một khi bạn có lõi, jmap có thể chuyển đổi lõi thành một đống heap.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.