Tôi không biết làm thế nào để có được chính xác biên giới của thế hệ trẻ và già (thậm chí không chắc chắn nó có thể). Trong trường hợp G1 nó trở nên phức tạp hơn vì nó được phép có nhiều hơn một khu vực thế hệ cũ do cấu trúc heap đặc biệt của G1.
Nhưng bạn có thể sử dụng phương pháp phỏng đoán khôn lanh để xác định xem đối tượng có ở thế hệ cũ hay không mà không biết biên giới của thế hệ.
Hãy sử dụng một số
ma thuật đen
kiến thức bí mật về hotspot internals: mọi đối tượng chứa tiêu đề với tất cả các thông tin cần thiết về khóa, hashcode danh tính, và quan trọng nhất, tuổi. tuổi Extracting sẽ trông như thế này:
return unsafe.getByte(targetObject, 0L) & 0x78;
nơi 0x78 tương ứng mặt nạ trong phần đầu đối tượng so với tuổi của nó (bit từ 4 đến 7 bao gồm).
Lấy MaxTenuringThreshold
tham số qua Management API:
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
server,
"com.sun.management:type=HotSpotDiagnostic",
HotSpotDiagnosticMXBean.class);
int threshold = Integer.valueOf(bean.getVMOption("MaxTenuringThreshold").getValue());
Bây giờ bạn biết tuổi của đối tượng và tenuring ngưỡng của ứng dụng của bạn, vì vậy bạn có thể giả định rằng nếu tuổi lớn hơn ngưỡng, đó là trong thế hệ cũ.
CẢNH BÁO: Đó là phỏng đoán dựa trên kiến thức bí mật và bí mật.
- Nó sẽ không làm việc, nếu ai đó sẽ đồng bộ hóa trên đối tượng mục tiêu trong khi bạn đang đọc nó tuổi, bởi vì VM sẽ di chuyển tiêu đề để ngăn xếp và thay thế tiêu đề với con trỏ để ngăn xếp
- Nó sẽ không làm việc với
XX:+UseAdaptiveSizePolicy
, vì vậy bạn nên vô hiệu hóa nó một cách rõ ràng.
- Một số đối tượng có thể được phân bổ thẳng vào thế hệ cũ (ví dụ bởi vì kích thước của nó)
- Type I error dễ
- Cách tiếp cận này là bất hợp pháp, không an toàn và có thể là không chính xác và JVM phụ thuộc
Thậm chí nếu bạn có thể nhận thông tin đó, nó sẽ là cũ khi bạn nhận được nó vì GC có thể chạy trong thời gian chờ đợi và di chuyển ranh giới thế hệ (G1 tái chỉ định khu vực, các GC khác có thể di chuyển trẻ/ranh giới cũ). Tương tự như vậy, bất kỳ số học con trỏ nào bạn làm sẽ chỉ là lỗi thời do các đối tượng bị di chuyển. – the8472
Tôi đề nghị bạn có một cái nhìn tại https://github.com/serkan-ozal/jillegal Đây có thể là thư viện tốt nhất để đào xung quanh trong nội bộ của JVM bằng cách sử dụng không an toàn. Thay vì nhìn vào địa chỉ bạn có thể nhận được số lượng GC mà đối tượng đã sống sót. Điều này có thể cho bạn biết vùng đó nằm ở đâu. –