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ữ String
literals 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)?