2013-08-09 55 views
7

Sau khi khám phá các chuỗi nội bộ của java, tôi đã nhầm lẫn về cái được gọi là "khoảng trống". Sự hiểu biết của tôi ban đầu về nó là nó được giữ Stringliterals cũng như dữ liệu meta lớp như được giải thích trong this question.Bộ sưu tập rác trên các chuỗi nội bộ, String Pool và perm-space

Tôi cũng đã đọc về phương thức String.intern() và đặt địa chỉ String s vào Chuỗi hồ bơi trả lại tham chiếu đến phiên bản duy nhất của nó. Đó là sự hiểu biết của tôi rằng đây là cùng một chuỗi hồ chứa String literals tồn tại trong không gian của JVM. Nó dường như không thể cho tôi rằng "không gian uốn" có thể thay đổi được, (nó vĩnh viễn sau khi tất cả, phải không?). Nhưng Sau đó, tôi tìm thấy this question trong đó nhận xét bình chọn hàng đầu của EJP về câu trả lời được chấp nhận giải thích rằng

Chuỗi đã được GC có thể trong một vài năm nay.

Ngụ ý rằng GC chạy trên vùng trống không có vẻ rất vĩnh viễn. Làm thế nào điều này hòa giải? GC có kiểm tra mọi thứ trong không gian không? Liệu GC có kiểm tra mọi thứ trong nhóm chuỗi bao gồm các chuỗi ký tự chuỗi từ nguồn không? Có một chuỗi thứ hai chuỗi cho chuỗi intern'd? Liệu GC chỉ biết xem xét các chuỗi thực tập khi thu thập? Hoặc là nhận xét này nhầm lẫn và intern'ing một chuỗi ngăn chặn nó từ bao giờ được GC'd (mà tôi hy vọng không phải là trường hợp)?

Trả lời

7

Chuỗi ký tự are interned. Kể từ Java 7, HotSpot JVM đặt các chuỗi được lưu trữ trong heap, chứ không phải permgen.

Trước java 7, hotspot đặt các chuỗi được lưu trong permgen. Tuy nhiên, interned Strings in permgen were garbage collected. Rõ ràng, Class objects in permgen are also collectable, vì vậy mọi thứ trong permgen đều có thể thu thập được, mặc dù bộ sưu tập permgen có thể không được bật theo mặc định trong một số JVM cũ.

Chuỗi ký tự, được tập trung, sẽ là tham chiếu được tổ chức bằng cách khai báo đối tượng Class cho đối tượng String trong nhóm thực tập. Vì vậy, chuỗi ký tự được thực hiện sẽ chỉ được thu thập nếu đối tượng Lớp được tham chiếu đến nó cũng được thu thập.