2010-02-25 35 views
6

Hãy cho tôi biết cách tốt nhất để xác định thành phần bộ nhớ thế hệ trẻ được quảng cáo cho thế hệ cũ, sau mỗi sự kiện GC trẻ là gì?Java GC: các lớp đối tượng hàng đầu được quảng cáo (theo kích thước)?

Lý tưởng nhất là tôi muốn biết tên lớp có trách nhiệm nói, với 80% đống trong mỗi đoạn quảng cáo "gen trẻ -> gen cũ";

Ví dụ: Tôi có 600 triệu gen trẻ, mỗi nhiệm kỳ quảng bá 6 triệu; Tôi muốn biết những đối tượng sáng tác 6M này.

Cảm ơn bạn.

Trả lời

6

Không có cách nào dễ dàng để thực hiện việc này, tuy nhiên, gần đây tôi đã phân tích hiệu suất bộ nhớ của các ứng dụng java lớn và có thể chia sẻ một số trải nghiệm.

Dưới đây là cách tôi tìm thấy những gì đối tượng đang được thăng cũ gen:

Trước tiên, bạn cần phải xác định những đối tượng đang ở trong "cũ gạo cội /" không gian. Đây là cơ bản bạn tiêu chuẩn phân tích heap java. Đối với điều này tôi khuyên bạn nên jmap. Nó là một phần của mặt trời jvm. chạy: jmap -dump:file=heap.hprof PID để lấy một vùng lưu trữ. Thao tác này sẽ tạm dừng jvm trong quá trình đổ (~ 30 giây trên một đống 2GB)

Bây giờ tải tệp .prof vào Memory analyser (công cụ tốt nhất cho việc này, tay xuống) Tôi sẽ dành một ngày để chơi với bộ phân tích bộ nhớ để hiểu nó, hãy xem screencam (cần đăng nhập, nhưng đáng giá).

Bây giờ bạn sẽ biết những đối tượng nào nằm trong vùng heap của bạn.

Đây là mẹo: Trong màn hình tổng quan của Bộ phân tích bộ nhớ, có một liên kết đến: "Biểu đồ đối tượng không thể truy cập". Bây giờ các đối tượng này đều được thu thập trong GC tiếp theo. Nhưng một số có lẽ trong eden, một số trong người sống sót và một số ở cũ.

Bây giờ, có được một số hồ sơ với khả năng định hình bộ nhớ, tôi thích yourKit. Chạy ứng dụng của bạn với bộ nhớ của bạn và phân bổ đối tượng bản ghi.

Chạy và ghi lại đối tượng. Một khi bạn có một danh sách các đối tượng được tạo, hãy sử dụng cả ba danh sách để có được một bức tranh về những gì đang diễn ra. Làm những gì con người làm tốt nhất, xem các mẫu.

  • Đối tượng nào được tạo và có thể truy cập. (Memory phân tích)
  • Objects unreachable trong đống (Memory phân tích)
  • Đối tượng được tạo ra trong quá trình chạy (Profiler)

Một cách khác để tiếp cận là YourKit generations view. Bạn có thể chụp nhanh heap của bạn và so sánh những đối tượng nào vẫn còn sống giữa các ảnh chụp nhanh. Nếu bạn sử dụng điều này với visualgc, bạn có thể xác định thời gian một đối tượng phải còn sống để được quảng bá cho gen cũ và chụp nhanh các khoảng thời gian này để xem những đối tượng nào vẫn còn sống.

Vâng, chúc may mắn. /JT

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