Tôi không biết về bất kỳ công cụ/tiện ích nào hoạt động với các JVM thế hệ hiện tại.
Nhưng mặt trái là tôi không thấy tiện ích này hữu ích như thế nào.
Thời gian GC dài thường xảy ra do heap của bạn quá đầy. Khi heap đạt đến 100% đầy đủ, lượng thời gian dành cho GC có xu hướng tăng theo cấp số nhân. Trong trường hợp xấu nhất, heap đầy hoàn toàn và ứng dụng của bạn nhận được OutOfMemoryError
. Có hai giải pháp khả thi:
Nếu nguyên nhân gốc rễ là đống là quá nhỏ (đối với kích thước của vấn đề mà ứng dụng của bạn đang cố gắng để giải quyết) sau đó, hoặc tăng kích thước heap, hoặc tìm kiếm một cách để giảm bộ làm việc của ứng dụng; tức là số lượng/kích thước của các đối tượng cần phải có "hoạt động" trong khi tính toán.
Nếu nguyên nhân gốc là rò rỉ bộ nhớ, hãy tìm và sửa chữa nó.
Trong cả hai trường hợp, sử dụng một hồ sơ bộ nhớ sẽ giúp bạn phân tích vấn đề. Nhưng bạn không cần phải biết những vật thể nào trong thế hệ cũ. Nó không liên quan đến nguyên nhân gốc rễ của vấn đề hoặc giải pháp cho vấn đề.
Tôi muốn biết đối tượng là "người sống sót" những gì còn lại trong khu vực cũ, để biết rằng những đối tượng sáng tạo để tối ưu hóa.
Điều này bắt đầu có ý nghĩa hơn một chút. Có vẻ như bạn cần phải tìm ra những đối tượng nào tồn tại lâu dài ... chứ không phải đặc biệt là không gian nào chúng sinh sống. Bạn có thể làm điều đó bằng cách sử dụng jhat
để so sánh chuỗi các ảnh chụp nhanh heap. (Có thể có cách tốt hơn ...)
Tuy nhiên, tôi vẫn không nghĩ rằng cách tiếp cận này sẽ hữu ích. Vấn đề là một GC đầy đủ cần phải đi qua tất cả các đối tượng có thể truy cập (cứng, mềm, yếu, phantom). Và nếu bạn đã có một đống 32Gb đó là 30% đầy đủ bạn vẫn còn có rất nhiều đối tượng để đánh dấu/quét/di dời. Tôi nghĩ rằng giải pháp có khả năng là sử dụng một bộ thu đồng thời và điều chỉnh nó để nó có thể theo kịp với tỷ lệ phân bổ đối tượng của ứng dụng của bạn.
Có vẻ như bạn có thể đang gọi số System.gc()
trực tiếp từ mã của bạn. Đừng làm thế! Gọi System.gc()
sẽ (thường) khiến JVM thực hiện toàn bộ bộ sưu tập rác. Đó là khá nhiều đảm bảo để tạm dừng.Tốt hơn hết là rời JVM để quyết định thời điểm chạy bộ thu.
Cuối cùng, không rõ ý bạn là gì bằng cách "tối ưu hóa tạo đối tượng". Bạn có nghĩa là giảm tỷ lệ tạo đối tượng? Hay bạn đang nghĩ đến điều gì đó khác để quản lý việc lưu giữ các đối tượng tồn tại lâu dài (được lưu trong bộ nhớ cache)?
Nguồn
2012-06-12 11:56:13
Tôi chỉ sử dụng [Visualvm] (http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html), [Visualgc] (http: //java.sun. com/performance/jvmstat/visualgc.html) và [Jconsole] (http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html#gc). Tôi không nhớ bất kỳ trong số này có thể liệt kê các đối tượng được thuê. Họ sẽ cung cấp cho bạn tuy nhiên một số số liệu thống kê trên khu vực được thuê. Vì vậy, tôi chỉ đề nghị bài viết này http://java.sun.com/docs/hotspot/gc/index.html và +1 – bpgergo
Tập hợp đầy đủ các thông số khởi động JVM của bạn là gì? – moodywoody