2009-08-25 27 views
7

Tôi có một ứng dụng đang chạy trên Máy chủ ứng dụng Websphere 6.0 và ứng dụng này gặp sự cố gần như mỗi ngày do Out-Of-Memory. Từ chi tiết GC chắc chắn có rò rỉ bộ nhớ (nhiều trong số chúng)Làm cách nào để phát hiện trạng thái Hết bộ nhớ?

Thật không may ứng dụng được cung cấp bởi nhà cung cấp bên ngoài và việc khắc phục sự cố là chậm quá trình gây khó khăn. Là một phần của quá trình tôi cần phải thu thập các bản ghi và heapdumps mỗi khi OOM xảy ra.

Bây giờ tôi đang tìm cách để tự động hóa nó. Vấn đề cơ bản là làm thế nào để phát hiện tình trạng OOM. Một cách để tạo kịch bản lệnh shell sẽ định kỳ tìm kiếm các heapdumps mới. Cách tiếp cận này có vẻ như tôi là một kẻ bẩn thỉu. Một cách tiếp cận khác có thể là sử dụng JMX bằng cách nào đó. Nhưng tôi có ít hoặc không có kinh nghiệm trong lĩnh vực này và không có nhiều ý tưởng làm thế nào để làm điều đó.

Hoặc là trong WAS một số loại kích hoạt/móc cho điều này? Cảm ơn bạn rất nhiều vì mọi lời khuyên!

Trả lời

4

Tôi thấy hai tùy chọn nếu bạn muốn tự động đổ đống tự động nhưng @Mark's solution với khối đệm trên OOM không thỏa đáng.

  1. Bạn có thể sử dụng để phát hiện MemoryMXBean áp lực bộ nhớ cao, và sau đó programmatically create a heap dump nếu việc sử dụng (hoặc đồng bằng cách sử dụng) có vẻ cao.
    • Bạn có thể định kỳ nhận thông tin sử dụng bộ nhớ và tạo các vùng đống bằng tập lệnh shell cron'd sử dụng jmap (hoạt động cả cục bộ lẫn từ xa).

Nó sẽ được tốt đẹp nếu bạn có thể có một callback trên oom, nhưng, uhm, callback mà có lẽ chỉ có thể sụp đổ với một lỗi oom. :)

9

Bạn có thể chuyển các đối số sau đây cho JVM khi khởi động và một vùng heap sẽ được tạo tự động trên OutOfMemoryError. Đối số thứ hai cho phép bạn chỉ định đường dẫn cho tệp kết xuất đống. Bằng cách sử dụng này ít nhất bạn có thể kiểm tra sự tồn tại của một tập tin cụ thể để xem nếu một đống đống đã xảy ra.

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<value> 
+0

Cảm ơn bạn. Tôi đang sử dụng này, nhưng tôi cần một số loại thông báo rằng heapdump đã được tạo ra. Và tôi đang tìm cách tiếp cận tốt hơn so với định kỳ quét hệ thống tập tin. –

+0

Tôi đã cập nhật câu trả lời của mình để bạn chỉ cần kiểm tra sự tồn tại của một tệp cụ thể. Tôi không chắc là có cách tiếp cận tốt hơn. – Mark

+2

Chỉ cần sử dụng một cái gì đó như thế này để thông báo cho bạn: -XX: OnOutOfMemoryError = "echo PID% p vừa tạo ra một heapdump | mail [email protected]" để gửi thư cho bạn hoặc chạy bất cứ lệnh nào bạn muốn thông báo cho bạn. – HaveAGuess

1

Và thay thế cho chờ đợi cho đến khi ứng dụng đã bị rơi có thể là kịch bản khởi động lại kiểm soát như mỗi đêm nếu bạn lạc quan rằng nó có thể tồn tại trong mười hai giờ ..

Thậm chí có thể WebSphere thể làm điều đó cho bạn !?

+0

tốt, điều này sẽ giúp tôi trong một thời gian ngắn. Từ một bàn tay khác tôi cần phải có các rò rỉ cố định. Và cách tiếp cận này sẽ ngăn cản tôi thu thập các bản ghi khi OOM xảy ra. –

+0

Ahh, tôi nghĩ bạn chỉ cần đợi cho đến khi nhà cung cấp bên ngoài của bạn khắc phục được sự cố ... Chắc chắn, nếu bạn cần các bãi băm cho báo cáo hơn là một câu chuyện khác :) –

1

Bạn có thể thêm một trình lắng nghe (Lớp phiên hoặc Phạm vi ứng dụng nghe) thuộc tính sẽ được gọi mỗi khi một đối tượng mới được thêm vào trong phạm vi phiên/ứng dụng.

Trong này - bạn có thể thử để kiểm tra tổng bộ nhớ được sử dụng bởi ứng dụng (Log nó) như là cuộc gọi chạy gc (lưu ý rằng cách gọi nó sẽ không bao hàm sự gc sẽ luôn luôn chạy)

(Trên đây là cho phần ghi nhật ký và gc dựa trên tăng trưởng sử dụng)

Đối với gc được lập biểu: Ngoài ra, bạn có thể giữ một lớp nhiệm vụ hẹn giờ chạy sau vài giờ và thực hiện yêu cầu cho gc.

+0

Cảm ơn câu trả lời của bạn. Thật không may chạy GC không giúp đỡ nếu có rò rỉ bộ nhớ (= tham chiếu không mong muốn cho các đối tượng) Từ đồ thị GC Verbose tôi có thể thấy rằng Garbage Collector đang được kích hoạt rất thường xuyên trước OOM. –

+0

Trong trường hợp đó, nếu bạn biết các đối tượng đang hoạt động bổ sung, không sử dụng, bạn có thể xóa chúng khỏi phạm vi (ứng dụng/phiên) sau một khoảng thời gian xác định. – techzen

3

Bạn đã xem JConsole chưa? Nó sử dụng JMX để cung cấp cho bạn khả năng hiển thị của một loạt các chỉ số JVM, bao gồm thông tin bộ nhớ. Nó có lẽ sẽ được giá trị giám sát ứng dụng của bạn bằng cách sử dụng này để bắt đầu, để có được một cảm giác như thế nào/khi bộ nhớ được tiêu thụ. Bạn có thể thấy bộ nhớ được tiêu thụ thống nhất trong ngày hoặc khi sử dụng một số tính năng nhất định.

Hãy xem phần detecting low memory của liên kết ở trên.

Nếu bạn cần, bạn có thể viết JMX client để xem ứng dụng tự động và kích hoạt bất kỳ hành động nào được yêu cầu. JConsole sẽ chỉ ra phương pháp JMX nào bạn cần để thăm dò ý kiến.

0

Bạn đã xem xét công cụ jvisualvm trong Java 6 JDK mới nhất chưa?

Thật tuyệt vời khi kiểm tra mã đang chạy.

0

Tôi muốn tranh chấp rằng bạn cần các vùng heap khi OOM xảy ra. Thu thập định kỳ thông tin theo thời gian nên cho hình ảnh về những gì đang xảy ra.

Như đã được quan sát thấy các công cụ khác nhau tồn tại để phân tích những vấn đề này. Tôi đã thành công với ITCAM cho WebSphere, như một IBMer tôi đã sẵn sàng truy cập vào đó. Chúng tôi đã nhanh chóng có thể xác định chính xác các dòng mã trong tình huống vấn đề.

Nếu có bất kỳ cách nào bạn có thể có được một công cụ có tính chất đó thì đó là con đường để đi.

1

Trải nghiệm của chúng tôi với ITCAM đã kém hơn so với quan điểm từ quan điểm giám sát. Chúng tôi đã bán nó cho CA Wily Introscope.

0

Có thể viết một chương trình đơn giản để lấy danh sách tiến trình từ nhân và quét nó để xem quá trình WS của bạn có đang chạy hay không. Trên một hộp Unix bạn có thể có thể roi lên một cái gì đó trong Perl trong một vài phút (nếu bạn biết Perl), không chắc chắn nó sẽ khó khăn như thế nào dưới Windows. Chạy nó như là một nhiệm vụ theo lịch trình sau mỗi năm phút hoặc lâu hơn, và nếu quá trình này không hiển thị, bạn có thể ngắt nó ra khỏi một tiến trình khác có thể xử lý vùng lưu trữ và khởi động lại WAS.

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