2008-09-28 35 views
15

Tôi đã quản lý để có được một bộ nhớ 'rò rỉ' trong một ứng dụng java tôi đang phát triển. Khi chạy bộ kiểm thử JUnit của tôi, tôi đã thoát khỏi các ngoại lệ bộ nhớ một cách ngẫu nhiên (java.lang.OutOfMemoryError). Tôi có thể sử dụng những công cụ nào để kiểm tra đống ứng dụng java của mình để xem những gì đang sử dụng hết đống để tôi có thể tìm ra những gì liên quan đến các đối tượng có thể thu gom rác.Làm thế nào tôi có thể thấy những gì có trong heap của tôi trong Java?

Trả lời

23

VisualVM được bao gồm trong các bản phát hành gần đây nhất của Java. Bạn có thể sử dụng điều này để tạo ra một đống kết xuất, và nhìn vào các đối tượng trong đó.

Ngoài ra, bạn cũng có thể tạo một commandine heapdump sử dụng jmap (trong jdk/bin dir của bạn):

jmap -dump:format=b,file=heap.bin <pid> 

Bạn thậm chí có thể sử dụng để có được một biểu đồ nhanh chóng của tất cả các đối tượng

jmap -histo <pid> 

Tôi có thể giới thiệu Bộ phân tích bộ nhớ Eclipse (http://eclipse.org/mat) để phân tích nâng cao các vùng đống. Nó cho phép bạn tìm hiểu chính xác lý do tại sao một đối tượng hoặc tập hợp các đối tượng nào đó vẫn còn hoạt động. Dưới đây là một mục blog cho bạn thấy những gì bộ phân tích bộ nhớ có thể làm: http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

+0

Visual VM và Netbeans Profiler cho phép bạn thực hiện tương tự như EMA. –

+1

Tôi không biết về netbeans, nhưng tôi chắc chắn đã không tìm thấy 'con đường ngắn nhất để gc root' trong hình ảnh vm. – Tom

+1

+1 cho EMA - phao cứu sinh. –

0

Nếu bạn đang sử dụng hệ thống hỗ trợ GTK, bạn có thể thử sử dụng JMP.

6

Nếu bạn cần một cái gì đó miễn phí, hãy thử VisualVM

Từ mô tả của dự án :

VisualVM là một công cụ trực quan tích hợp các công cụ JDK dòng lệnh và khả năng lược tả nhẹ. Được thiết kế cho cả việc phát triển và sử dụng thời gian sản xuất.

0

Bạn có thể thử bộ phát hiện rò rỉ bộ nhớ là một phần của bộ công cụ kiểm soát nhiệm vụ JRockit. Nó cho phép bạn kiểm tra heap trong khi JVM đang chạy. Bạn không cần chụp ảnh mọi lúc. Bạn chỉ có thể kết nối trực tuyến với JVM và sau đó xem cách thay đổi đống giữa các bộ sưu tập rác. Bạn cũng có thể kiểm tra các đối tượng, theo các tham chiếu đồ họa và nhận các dấu vết ngăn xếp từ nơi ứng dụng của bạn hiện đang phân bổ các đối tượng. Dưới đây là tóm tắt introduction.

Công cụ này miễn phí để sử dụng để phát triển và bạn có thể tải xuống số here.

1

Sử dụng bãi đống Eclipse Memory Analyzer

Không có công cụ nào khác mà tôi biết của bất kỳ công cụ mà đến gần nó là chức năng và hiệu suất và giá cả (miễn phí và mã nguồn mở) khi phân tích.

2

Đây là câu hỏi khá cũ. Rất nhiều người có thể đã bắt đầu sử dụng IntelliJ kể từ khi nó được trả lời ban đầu. IntelliJ có một plugin có thể hiển thị mức sử dụng bộ nhớ được gọi là JVM Debugger Memory View.

+0

Sau khi chơi xung quanh với các công cụ khác nhau cho một chút, tôi thấy rằng IntelliJ cũng có một [plugin cho VisualVM] (https://plugins.jetbrains.com/plugin/7115-visualvm-launcher) (được đề cập trong một câu trả lời khác). Sự kết hợp đó đã kết thúc tốt nhất cho tôi. – mkasberg

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