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
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/
Nếu bạn đang sử dụng hệ thống hỗ trợ GTK, bạn có thể thử sử dụng JMP.
Sử dụng một hồ sơ như JProfiler hoặc YourKitProfiler
JProfiler làm việc rất tốt cho tôi ....
http://www.ej-technologies.com/products/jprofiler/overview.html
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.
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.
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.
Đâ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.
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
- 1. Làm thế nào tôi có thể thấy những gì capybara được tìm thấy trong một bước dưa chuột thất bại?
- 2. Làm thế nào tôi có thể thấy những khóa vim nghĩ tôi đang đánh?
- 3. Làm thế nào tôi có thể xem những gì tôi đang gõ vào telnet?
- 4. Làm thế nào tôi có thể xác định IP của router/cổng của tôi trong Java?
- 5. Làm thế nào tôi có thể tìm thấy OWNER của một đối tượng trong Oracle?
- 6. Làm thế nào tôi có thể nhận được trực quan có thể nhìn thấy của UITableView?
- 7. Làm thế nào tôi có thể tìm thấy plugin VIM nào có lỗi vì quá tải CPU của tôi
- 8. Trong mercurial làm thế nào tôi có thể tìm thấy changesets có chứa một chuỗi?
- 9. Làm thế nào tôi có thể tìm thấy màu chủ đạo của một hình ảnh?
- 10. Làm thế nào tôi có thể thực hiện, "Tôi là ông của riêng tôi", trong Prolog?
- 11. Làm thế nào tôi có thể thấy các cam kết đến trong git?
- 12. Làm thế nào tôi có thể tìm thấy điểm giao nhau của ba mặt phẳng?
- 13. Làm thế nào tôi có thể tìm ra nơi một BufferedImage có Alpha trong Java?
- 14. Làm thế nào tôi có thể viết thư cho Rails logger trong đá quý của tôi
- 15. Làm thế nào tôi có thể tìm thấy số lượng khóa trong một băm trong Perl?
- 16. Làm thế nào tôi có thể tìm thấy tất cả các đơn vị trong ứng dụng Delphi của tôi?
- 17. Tôi có thể (và tôi có bao giờ muốn) thiết lập kích thước heap tối đa trong .net không?
- 18. Làm thế nào tôi có thể chia sẻ các nếp gấp của tôi trong VIM?
- 19. Trong nhật thực, làm thế nào tôi có thể thấy các lớp java được tải từ đâu?
- 20. Làm thế nào tôi có thể trao đổi hai bit của số nguyên trong Java?
- 21. Android: Làm thế nào tôi có thể giải quyết cho những hình ảnh trong GridView?
- 22. Tôi có thể làm gì với RaisePropertyChanged?
- 23. làm thế nào tôi có thể tìm thấy css không sử dụng trong ứng dụng ajax?
- 24. Làm thế nào tôi có thể tìm thấy đường dẫn đến một bao gồm trong Symfony2?
- 25. Làm thế nào tôi có thể tăng kích thước heap toàn cầu cho java trên Mac OSX
- 26. Làm thế nào tôi có thể đặt ApplicationController trong Ember.Router
- 27. Làm cách nào tôi có thể thấy giá trị cụ thể của sql_mode?
- 28. Django: Làm thế nào tôi có thể tìm thấy mô hình nào của tôi đề cập đến một mô hình
- 29. Làm thế nào tôi có thể có nếp gấp cho C++/Java trong Emacs?
- 30. Làm thế nào tôi có thể thấy ai đã kích hoạt một hành động trong Delphi?
Visual VM và Netbeans Profiler cho phép bạn thực hiện tương tự như EMA. –
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 cho EMA - phao cứu sinh. –