2010-02-04 35 views
5

Tôi có một số nghi ngờ liên quan đến StringsBộ sưu tập và chuỗi thu gom rác

Chúng có hoạt động trên nhóm Heap hoặc String không?

Và nếu trên Heap thì chúng sẽ được thu thập rác, nếu chúng không thể truy cập được bằng bất kỳ chuỗi trực tiếp nào.

Và nếu trên nhóm Chuỗi thì cách chúng sẽ bị xóa hoặc xóa vì chúng tôi biết Garbage Collection chỉ xảy ra trên heap.

Trả lời

8
String s = new String("abc"); 

đối tượng chuỗi giới thiệu bởi s sẽ được trên heap và chuỗi chữ "abc" sẽ nằm trong hồ bơi chuỗi. Các đối tượng trong nhóm chuỗi sẽ không được thu gom rác. Họ đang có để được tái sử dụng trong suốt cuộc đời của chương trình, để cải thiện hiệu suất.

+0

Nếu bạn đang đề cập đến pool_ _constant mà là một phần của định nghĩa lớp, sau đó bạn _can_ dỡ bỏ các hồ bơi thường xuyên, miễn là bạn có thể dỡ bỏ các lớp (mà thường đòi hỏi dereferencing các bộ nạp lớp và tất cả các tài liệu tham khảo để nó tải các lớp học). Khó hơn nhiều so với chương trình điển hình của bạn, nhưng Tomcat thực hiện nó. –

4

Họ đều là những lưu trữ trong đống, nhưng intern() chuỗi ed (bao gồm xâu trong nguồn) là tham chiếu từ một hồ bơi trong lớp String.

Nếu chúng xuất hiện dưới dạng chữ trong mã nguồn, bao gồm các biểu thức chuỗi không đổi (ví dụ: "a" + "b") thì chúng cũng sẽ được tham chiếu từ Class xuất hiện, thường có nghĩa là chúng sẽ kéo dài miễn là quá trình chạy.

Sửa: Khi bạn gọi intern() trên một chuỗi trong mã của bạn nó cũng được bổ sung vào hồ bơi này, nhưng vì nó sử dụng tài liệu tham khảo yếu chuỗi thể vẫn được thu gom rác nếu nó không còn được sử dụng.

Xem thêm: interned Strings : Java Glossary

Trích dẫn từ bài viết rằng:

Bộ sưu tập của Strings đăng ký tại HashMap này đôi khi được gọi là chuỗi bi-a. Tuy nhiên, chúng là các đối tượng bình thường và sống trên heap giống như bất kỳ thứ gì khác (có lẽ theo một cách tối ưu vì các chuỗi nội bộ có xu hướng tồn tại lâu dài).

0

Chuỗi Alex đi vào hồ bơi đen, vẫn có chừng quá trình chạy (hoặc ứng dụng web vẫn được nạp.) Như đã nói bởi finnw và không bao giờ thu gom rác thải. String name2 không cấp phát bộ nhớ cho "Alex" và tái sử dụng bộ nhớ đó từ hồ bơi theo nghĩa đen.

PS: Hồ bơi theo nghĩa đen cũng nằm trên vùng heap.

Đối với chuỗi John hai đối tượng được tạo với tên tham chiếu3 và tên4 là bộ sưu tập rác.

String name = "Alex"; 
String name2 = "Alex"; 

String name3 = new String("John"); 
String name4 = new String("John");