Làm cách nào để phân tích tệp .hprof?


227

Tôi có một máy chủ sản xuất đang chạy với cờ sau: - XX: + HeapDumpOnOutOfMemoryError

Đêm qua nó đã tạo ra một tệp java-38942.hprof khi máy chủ của chúng tôi gặp lỗi heap. Nó chỉ ra rằng các nhà phát triển của hệ thống biết về cờ nhưng không có cách nào để có được bất kỳ thông tin hữu ích nào từ nó.

Có ý kiến ​​gì không?

Câu trả lời:


215

Nếu bạn muốn có một công cụ khá tiên tiến để thực hiện một số thao tác nghiêm túc, hãy xem dự án Bộ phân tích bộ nhớ tại Eclipse, được đóng góp cho chúng bởi SAP.

Một số điều bạn có thể làm là cực kỳ tốt trong việc tìm kiếm rò rỉ bộ nhớ, v.v. - bao gồm chạy một dạng SQL giới hạn (OQL) đối với các đối tượng trong bộ nhớ, tức là

CHỌN toString (FirstName) TỪ com.yourcompany.somepackage.User

Hoàn toàn rực rỡ.


18
Tôi chỉ muốn thêm +100 cho Trình phân tích bộ nhớ Eclipse. Tôi hiện đang cố gắng lọc một tệp kết xuất heap 400mb + và phải mất hơn 70 phút để đọc tệp, trước khi nó gây ra sự cố JVM hoàn toàn. EMA có thể mở nó trong <5 phút.
matt b

3
Tôi liên tục nhận được các lỗi phân tích cú pháp khi mở các tệp HPROF bằng Trình phân tích bộ nhớ Eclipse (thực tế cũng bị Eclipse đổ!). Đáng tiếc .. thở dài.
mất_bits1110

3
MAT vẫn có thể yêu cầu khá nhiều RAM [ít hơn JHAT nhưng vẫn khá ít]. Xem stackoverflow.com/questions/7254017/ cho lời khuyên nếu bạn gặp phải điều đó.
rogerdpack 30/03/2015

71

Bạn có thể sử dụng JHAT , Công cụ phân tích vùng heap Java được cung cấp theo mặc định với JDK. Đó là dòng lệnh nhưng khởi động máy chủ web / trình duyệt bạn sử dụng để kiểm tra bộ nhớ. Không thân thiện với người dùng nhất, nhưng ít nhất nó đã được cài đặt ở hầu hết các nơi bạn sẽ đến. Một quan điểm rất hữu ích là liên kết "biểu đồ heap" ở dưới cùng.

Ví dụ: jhat -port 7401 -J-Xmx4G dump.hprof

jhat cũng có thể thực thi OQL "những ngày này" (liên kết dưới cùng "thực hiện OQL")


Sau khi chạy lệnh trên Trong bảng điều khiển, bạn sẽ nhận được thông báo int thiết bị đầu cuối "máy chủ đã sẵn sàng" Cổng: 7401. Sau đó, mở URL này: localhost: 7401 "bạn có thể xem chi tiết trong cửa sổ trình duyệt".
Laxman G

35

Bạn cũng có thể sử dụng HeapWalker từ Netbeans Profiler hoặc công cụ độc lập Visual VM . Visual VM là một thay thế tốt cho JHAT vì nó độc lập, nhưng dễ sử dụng hơn nhiều so với JHAT.

Bạn cần Java 6+ để sử dụng hoàn toàn Visual VM.


Bạn nên thêm một lưu ý rằng đây chỉ dành cho Java 6 và 7.
Nick Stinemates

AFAIK, HeapWalker và VisualVM không yêu cầu Java 6/7 để đọc các tệp HPROF.
James Schek

Tôi vừa thử tải nó bằng Java 5 và nó nói 'Vui lòng sử dụng Java 6 hoặc 7' Tôi đang làm gì sai?
Nick Stinemates

Hừm. Có lẽ bạn phải chạy Java 6, nhưng có thể đọc HPROF của Java 5 (có thể đó là cách tôi đã làm cho nó hoạt động). Tôi biết bạn không thể tạo một đống heap từ Visual VM trên một ứng dụng chạy Java 5. Sẽ cập nhật.
James Schek

Bạn cũng có thể sử dụng JVM trực quan, từ java SDK - tìm jvisualvm.exetại JAVASDK/binthư mục
xxxvodnikxxx

11

Chỉ cần lấy Trình phân tích bộ nhớ Eclipse . Không có gì tốt hơn ngoài đó và nó miễn phí.

JHAT chỉ có thể sử dụng cho "ứng dụng đồ chơi"


3
JHAT là cần thiết để gây ấn tượng với những tin tặc "l33t", những người tự tay xây dựng một bản phân phối BSD bắt đầu với LILO. Đợi đã ... họ sẽ không bao giờ sử dụng java. :-)
James Schek

Tôi nghĩ rằng đây là một nhận xét nhiều hơn ...: \
rogerdpack


5

Nếu bạn muốn thực hiện một phân tích tùy chỉnh về heapdump của mình thì có:

Thư viện này nhanh nhưng bạn sẽ cần viết mã phân tích bằng Java.

Từ các tài liệu:

  • Không tạo bất kỳ tệp tạm thời nào trên đĩa để xử lý kết xuất heap
  • Có thể làm việc trực tiếp bãi rác nén GZ
  • Ký hiệu HeapPath

2

Cá nhân tôi thích VisualVM. Một trong những tính năng tôi thích trong VisualVM là so sánh heap dump. Khi bạn đang thực hiện phân tích đống heap, có nhiều cách khác nhau để tìm ra nguyên nhân gây ra vụ tai nạn. Một trong những cách tôi thấy hữu ích là so sánh các bãi rác chất đống với sức khỏe không lành mạnh.

Sau đây là các bước bạn có thể làm theo cho nó:

  1. Nhận được một đống OutOfMemoryError hãy gọi nó là "oome.hprof". Bạn có thể nhận được điều này thông qua tham số JVM HeapDumpOnOutOfMemoryError.
  2. Khởi động lại ứng dụng cho phép nó chạy trong một thời gian lớn (phút / giờ) tùy thuộc vào ứng dụng của bạn. Nhận một đống heap khác trong khi ứng dụng vẫn đang chạy. Hãy gọi nó là "khỏe.hprof".
  3. Bạn có thể mở cả hai bãi chứa này trong VisualVM và thực hiện so sánh kết xuất đống. Bạn có thể làm điều đó ở cấp độ hoặc gói. Điều này thường có thể chỉ cho bạn vào hướng của vấn đề.

liên kết: https://visualvm.github.io

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.