Nếu chuỗi được định nghĩa là chữ theo thời gian biên dịch [ví dụ: String str = "java";
] thì nó sẽ được thu gom rác?
Có thể là không. Các đối tượng mã sẽ chứa một hoặc nhiều tham chiếu đến các đối tượng String
đại diện cho các chữ. Vì vậy, miễn là các đối tượng mã có thể truy cập được, các đối tượng String
sẽ đến.
Có thể các đối tượng mã không thể truy cập được, nhưng chỉ khi chúng được nạp động ... và trình nạp lớp của chúng bị hủy.
Nếu tôi sử dụng phương pháp tập luyện [e.g: String str = new String("java").intern()
] sau đó nó sẽ được thu gom rác?
Đối tượng được trả về bằng lệnh intern
sẽ là cùng một đối tượng đại diện cho số "java"
chuỗi. (Các "java"
đen là thực tập nội trú vào thời điểm lớp tải. Khi bạn sau đó thực tập sinh mới được xây dựng String
đối tượng trong đoạn mã của bạn, nó sẽ tra cứu và trả lại trước thực tập nội trú "java"
chuỗi.)
Tuy nhiên, thực tập nội trú chuỗi mà không phải là giống hệt với chuỗi literals có thể là rác được thu thập khi chúng trở nên không thể truy cập được. Không gian PermGen là rác được thu thập trên tất cả các JVM HotSpot gần đây. (Trước Java 8 ... mà giọt PermGen hoàn toàn.)
Ngoài ra nó sẽ được đối xử khác với chuỗi chữ tại điểm 1.
Không ... vì nó là cùng một đối tượng như chuỗi chữ.
Và thực sự, một khi bạn hiểu những gì đang diễn ra, rõ ràng là các chuỗi ký tự không được xử lý đặc biệt. Nó chỉ là một ứng dụng của quy tắc "khả năng tiếp cận" ...
Một số nơi được đề cập rằng các bản sao sẽ chỉ được thu gom rác khi lớp học String
sẽ được tải xuống? Nó có ý nghĩa bởi vì tôi không nghĩ rằng lớp học String
sẽ không bao giờ được dỡ xuống.
Bạn nói đúng. Nó không có ý nghĩa. Các nguồn nói rằng không chính xác. (Sẽ hữu ích nếu bạn đăng URL để chúng tôi có thể đọc những gì họ đang nói cho chính mình ...)
Nguồn
2013-03-10 16:15:37
1 - http://stackoverflow.com/questions/2202162/garbage-collection-and-strings; 2 - http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java; 3 - String a = new String ("asd") -> "a" tham chiếu sẽ được thu thập rác, nhưng chỉ là một tham chiếu đến "asd" và "asd" sẽ ở đó mãi mãi. – user1050755
Nếu bạn tìm kiếm nhiều hơn, bạn sẽ tìm thấy các địa điểm đề cập đến các chuỗi ký tự được tạo bằng cách sử dụng thực tập có thể được thu thập rác khi chúng sử dụng tham chiếu yếu nhưng tôi không thể xác nhận nó và đó là lý do tại sao tôi đã đăng như có rất nhiều phản ứng hỗn hợp. – Lokesh