Chạy một mã rất đơn giản để thử xem cách trình thu gom rác hoạt động như thế nào.Hành vi GC không mong đợi: một số dữ liệu luôn đi vào thế hệ nhiệm vụ
String a = null;
while (true) {
a = new String(" no... ");
}
Tôi đang sử dụng ParallelGC. Tôi đã in kết quả GC và đây là GC đầu tiên (nhỏ).
[GC [PSYoungGen: 16448K->1616K(19136K)] 16448K->1624K(62848K), 0.0022134 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
youngGen đi xuống bởi 14880K
tuy nhiên fullHeap đi xuống bằng cách chỉ 14872K
Điều này có nghĩa 8k đã chuyển sang thế hệ nhiệm kỳ? Sự hiểu biết của tôi là GC có thể đã được gọi là một số instanced của lớp 'a' phải đã được đánh dấu còn sống và chuyển đến thế hệ nhiệm kỳ. Sự hiểu biết này có đúng không? Ngoài ra, đây có phải là "Floating Garbage" không? Làm thêm giờ các thế hệ nhiệm kỳ không được lấp đầy và yêu cầu fullGC, tuy nhiên phải mất một lúc.
Ngoài ra, trong trường hợp cụ thể này, không phải toàn bộ bộ sưu tập nhỏ được thu thập và lý tưởng không có gì xảy ra trong thế hệ quyền sở hữu? Tất cả đều là những vật thể sống ngắn.
cảm ơn. nếu chuỗi các đối tượng không bao giờ đi vào thế hệ cũ, tại sao heap (chậm nhưng đều đặn) nhận được đầy đủ sau đó một GC đầy đủ được yêu cầu. Bạn nghĩ gì đang lấp đầy gen già của mình? –
Có ít nhất 20 luồng khác đang chạy trong JVM, không chỉ là chuỗi "Chính" của bạn, do đó, nó khá hợp lý khi một số đối tượng được tạo. Ví dụ: các chủ đề Timer hoặc các chủ đề GC. Điều quan trọng là sau một GC đầy đủ, bạn đòi lại rất nhiều bộ nhớ. –
@ N.M. Như một bên lề, lưu ý rằng Pierre nói rằng các đối tượng Strings trong ví dụ của bạn sẽ không đi vào gen cũ, không phải là các đối tượng chuỗi nói chung không bao giờ đi vào cũ. – monkjack