2009-11-30 21 views
12

Tôi cần một cách để yêu cầu bãi chứa đống từ trong ứng dụng.Yêu cầu bãi chứa java heap (lõi dump) từ trong ứng dụng

Lý do: Khi tôi gặp phải một tình trạng lỗi cụ thể, tôi muốn đổ đống, để tôi có thể xem những gì đang giữ trên bộ nhớ.

Nhưng tôi muốn tự động hóa điều này (Ví dụ, khi tôi phát hiện thấy một số tình trạng cụ thể đã xảy ra. Hoặc khi một cơ quan giám sát không nhận được ping của nó nữa. Khi một số kiểm tra thất bại). Vì vậy, tôi cần một cách để đổ đống từ bên trong ứng dụng riêng của mình. Tôi dường như không thể tìm thấy nó với các công cụ đậu MX. Mặc dù MX Đậu có thể cung cấp cho dấu vết ngăn xếp rất tốt đẹp với màn hình và thông tin "đồng bộ hóa riêng", bế tắc và thông tin tranh chấp, tôi dường như không thể tìm thấy một cách để yêu cầu một bãi chứa đống. Có cách nào như vậy không? Hoặc bởi một số phương tiện gián tiếp, ví dụ như thế nào những điều JVisualVM làm điều đó? Và người ta có thể nói với JVM để đổ lõi vào OutOfMemoryExceptions ..?

Trả lời

16

Nếu nó không đủ để dump heap on OutOfMemoryError, có một cách phụ thuộc HotSpot là programmatically dumping heap from Java applications, nếu đó là OK.

+0

Tuyệt vời, chỉ là những gì tôi đang tìm kiếm, Cảm ơn! Tôi thấy thật tuyệt vời khi tôi không tìm thấy bài đăng trên blog đó trong quá trình googling của tôi. Dưới sun.management, có vẻ rất nhiều niềm vui! – stolsvik

+0

Một bình luận nữa, mặc dù (quay lại các ý tưởng được đăng trong OP): Từ liên kết "dump heap on OutOfMemoryError", tôi có thể đọc: "Dumper heap được xây dựng sẵn cũng có thể được sử dụng để chụp nhanh heap tại lần khác. Điều này được thực hiện bằng cách sử dụng tiện ích dòng lệnh jmap hoặc bảng điều khiển quản lý và giám sát jconsole. ". Những công cụ này sau đó có thể sử dụng MXBean độc quyền mà liên kết thứ hai đề cập đến? Tôi thấy lạ rằng các hạt tiêu chuẩn MX không có phương thức dumpHeap (fileName, live) này. – stolsvik

+0

Phân loại phiền toái, vâng, nhưng tôi đoán đó là một chức năng tiêu chuẩn, định dạng kết xuất đống phải được chuẩn hóa. Ít nhất, tôi tưởng tượng rằng sẽ có rất nhiều công việc, và nó có thể có thể giới hạn các nhà cung cấp tự do có trong triển khai VM của họ. – gustafc

4

Điều gì về việc sử dụng tùy chọn VM -XX:+HeapDumpOnOutOfMemoryError để yêu cầu máy ảo HotSpot tạo một vùng lưu trữ khi hết bộ nhớ?

+0

+1: "điều kiện lỗi cụ thể" duy nhất mà OP có thể biết một cách hợp lý rằng có thứ gì đó đang nắm giữ trên bộ nhớ, là một lỗi OutOfMemoryError; trong trường hợp này, đống đổ rác tại thời điểm này sẽ cho kết quả mong muốn. –

+0

@Andrzej: Tại sao đó lại là tình trạng lỗi "hợp lý" duy nhất? Có rất nhiều cách để nhận ra tình trạng bộ nhớ của máy ảo từ bên trong, ví dụ: WeakReference, kiểm tra các bộ đếm bộ nhớ của Runtime và MX beans etc (trước và sau System.gc()) - boatloads. Đá JProfiler, nhưng tôi muốn có một giải pháp có lập trình, không phải là JProfiler. Đây là một người khác có vấn đề tôi có thể liên quan đến: http://www.velocityreviews.com/forums/t275440-dump-complete-java-vm-state-as-core-dump-not-via-os-possible.html I cá là anh ta sẽ yêu thích giải pháp mà tôi đã được đưa ra ở đây! – stolsvik

Các vấn đề liên quan