Hầu hết thời gian, trong các ứng dụng doanh nghiệp, heap Java đưa ra lớn hơn kích thước lý tưởng tối đa 12 đến 16 GB. Tôi đã gặp khó khăn để làm cho trình hồ sơ NetBeans hoạt động trực tiếp trên các ứng dụng java lớn này.
Nhưng thường thì điều này là không cần thiết. Bạn có thể sử dụng tiện ích jmap đi kèm với jdk để nhận một đống heap "trực tiếp", đó là jmap sẽ kết xuất heap sau khi chạy GC. Thực hiện một số thao tác trên ứng dụng, đợi cho đến khi hoàn thành thao tác, sau đó lấy một đống heap "sống" khác. Sử dụng các công cụ như MAT MAT để tải các heapdumps, sắp xếp trên biểu đồ, xem các đối tượng nào đã tăng hoặc mức nào cao nhất, Điều này sẽ cho một manh mối.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
Chỉ có một vấn đề với cách tiếp cận này; Các đống lớn, ngay cả với tùy chọn trực tiếp, có thể quá lớn để chuyển ra vòng phát triển và có thể cần một máy có đủ bộ nhớ / RAM để mở.
Đó là nơi biểu đồ lớp đi vào hình ảnh. Bạn có thể kết xuất biểu đồ lớp trực tiếp bằng công cụ jmap. Điều này sẽ chỉ cung cấp biểu đồ lớp sử dụng bộ nhớ. Về cơ bản, nó sẽ không có thông tin để xâu chuỗi tham chiếu. Ví dụ, nó có thể đặt mảng char ở trên cùng. Và lớp String ở đâu đó bên dưới. Bạn phải tự vẽ kết nối.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Thay vì lấy hai đống, hãy lấy hai biểu đồ lớp, như mô tả ở trên; Sau đó so sánh biểu đồ lớp và xem các lớp đang tăng lên. Xem nếu bạn có thể liên kết các lớp Java với các lớp ứng dụng của bạn. Điều này sẽ cho một gợi ý khá tốt. Dưới đây là một kịch bản pythons có thể giúp bạn so sánh hai bãi chứa biểu đồ jmap. histogramparser.py
Cuối cùng, các công cụ như JConolse và VisualVm rất cần thiết để xem sự tăng trưởng bộ nhớ theo thời gian và xem có bị rò rỉ bộ nhớ hay không. Cuối cùng, đôi khi vấn đề của bạn có thể không phải là rò rỉ bộ nhớ, mà là việc sử dụng bộ nhớ cao. Để điều này cho phép ghi nhật ký GC, sử dụng một công cụ nén mới tiên tiến hơn và mới hơn như G1GC; và bạn có thể sử dụng các công cụ jdk như jstat để xem hành vi của GC trực tiếp
jstat -gccause pid <optional time interval>
Các tài liệu tham khảo khác cho google cho -jhat, jmap, GC đầy đủ, phân bổ hài hước, G1GC