Sử dụng tham số HeapDumpOnOutOfMemoryError để kết xuất heap cho JBoss


182

Tôi được cho biết rằng tôi có thể thêm -XX:+HeapDumpOnOutOfMemoryErrortham số vào các tùy chọn khởi động JVM của mình vào tập lệnh khởi động JBoss của mình để nhận được một đống heap khi chúng tôi gặp lỗi trong bộ nhớ trong ứng dụng của mình. Tôi đã tự hỏi nơi dữ liệu này được đổ? Nó chỉ đến bàn điều khiển, hoặc một số tệp nhật ký? Nếu nó chỉ vào bảng điều khiển, nếu tôi không đăng nhập vào máy chủ Unix thông qua bảng điều khiển thì sao?


1
Đó là thư mục hiện tại, tôi đoán.
Valentin Tihomirov

Câu trả lời:


246

Đây là những gì tài liệu của Oracle đã nói:

Theo mặc định, heap dump được tạo trong một tệp có tên java_ pid .hprof trong thư mục làm việc của VM, như trong ví dụ trên. Bạn có thể chỉ định một tên tệp hoặc thư mục thay thế với -XX:HeapDumpPath=tùy chọn. Ví dụ -XX:HeapDumpPath=/disk2/dumps sẽ làm cho heap dump được tạo trong /disk2/dumps thư mục.


16
Điều này cũng liệt kê ra tất cả các tùy chọn liên quan đến hiệu suất VM: java.sun.com/javase/technology/hotspot/iêu
Ravi Gupta

4
Quan trọng! Các cờ HeapDump chỉ có sẵn từ Java 1.5.0_07.
rustyx

14
Ngoài ra, điều quan trọng là phải nhận ra rằng JVM sẽ KHÔNG ghi đè lên một đống heap hiện có trong HeapDumpPath, bạn sẽ thấy một cái gì đó tương tự như "Unable to create /tmp/java_pidpid.hprof: File exists"trong tiêu chuẩn của bạn. Hãy chắc chắn di chuyển tệp kết xuất của bạn ra khỏi đường dẫn kết xuất để dọn đường cho bất kỳ tệp kết xuất nào trong tương lai; và sử dụng <pid>trình giữ chỗ trong tên tệp để tăng entropy trong tên tệp.
Ben

1
Nó cực kỳ hữu ích. Chỉ mất vài phút để tìm ra rò rỉ với Trình phân tích bộ nhớ Eclipse.
Aron Lorincz

Điều gì xảy ra nếu chúng ta đưa đường dẫn đến thư mục không tồn tại trong hệ thống? Nó sẽ tạo thư mục và đẩy bướu trong thư mục đó chứ?
Vinit89

47

Bạn có thể xem kết xuất này từ bảng điều khiển UNIX.

Đường dẫn cho bãi chứa heap sẽ được cung cấp dưới dạng một biến ngay sau khi bạn đã đặt biến được đề cập.

Ví dụ:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

Bạn có thể xem kết xuất từ ​​bảng điều khiển trên đường dẫn đã đề cập.


4

Tôi thấy thật khó để giải mã ý nghĩa của "thư mục làm việc của VM". Trong ví dụ của tôi, tôi đã sử dụng chương trình Java Service Wrapper để thực thi một tệp jar - các tệp kết xuất được tạo trong thư mục nơi tôi đã đặt chương trình trình bao bọc, ví dụ: c: \ myapp \ bin. Lý do tôi phát hiện ra điều này là vì các tệp có thể khá lớn và chúng đã lấp đầy ổ cứng trước khi tôi phát hiện ra vị trí của chúng.


Thư mục làm việc của bạn có thể được tìm thấy thông qua lệnh pwdx <PID>. Đầu tiên làm một ps -ef | grep java, tìm PID của bạn cho ứng dụng java của bạn, sau đó chạy pwdx <PID>. Nó sẽ cho bạn biết thư mục làm việc.
RCG

2

Nếu bạn không sử dụng tùy chọn "-XX: HeapDumpPath" thì trong trường hợp JBoss EAP / Theo mặc định, tệp heap dump sẽ được tạo trong thư mục "JBOSS_HOME / bin".

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.