2010-11-14 26 views
8

Tôi rất tò mò muốn tìm hiểu cách các JVM mới nhất xử lý bộ nhớ thu gom rác được bảo lưu theo phương pháp sau.Phương thức liệt kê subList() có ngăn chặn việc thu gom rác trong phần còn lại của danh sách không?

public List<Player> getHallOfFame() { 
    ArrayList<Player> listToSort = new ArrayList<Player>(map.values()); 
    Collections.sort(listToSort, comparator); 

    return listToSort.subList(0, 5); 
} 

Tại tồi tệ nhất tôi có thể tưởng tượng JVM giữ toàn bộ nội dung của listToSort trong bộ nhớ chừng nào vẫn còn tham chiếu đến sublist. Có ai biết nếu đó thực sự là trường hợp? Tôi đặc biệt quan tâm đến các liên kết có thể chứng minh điều này theo cách này hay cách khác cho các JVM cụ thể.

+0

Tôi nghĩ rằng .subList trả về một Danh sách mới và listToSort sẽ nằm ngoài phạm vi, vì vậy nó sẽ bị thu gom rác. –

+3

@Paul: Tài liệu có quy định khác. –

+0

Có, chìa khóa ở đây là nó được hỗ trợ bởi danh sách ban đầu vì vậy bất kỳ thay đổi trong danh sách ban đầu được phản ánh trong danh sách phụ. – CoolBeans

Trả lời

10

Có, subList chỉ là "chế độ xem" vào danh sách hiện có. Tất cả dữ liệu thực sự nằm trong danh sách gốc. Từ tài liệu:

Danh sách trả về được hỗ trợ bởi danh sách này, vì vậy các thay đổi phi cấu trúc trong danh sách được trả về được phản ánh trong danh sách này và ngược lại.

Do đó, trả lại danh sách phụ sẽ giữ danh sách gốc khỏi bị thu gom rác.

Nếu bạn không muốn hiệu ứng đó, về cơ bản bạn cần tạo một bản sao của danh sách phụ có liên quan. Ví dụ:

return new ArrayList<Player>(listToSort.subList(0, 5)); 
+0

Cảm ơn Jon. Lý do duy nhất tôi nghĩ mọi thứ có thể khác nhau là phân tích tĩnh có thể chứng minh rằng danh sách gốc không thể thay đổi được nữa. – Caoilte

+3

@Caoilte: Những thứ như phản ánh khiến phân tích như vậy rất khó. –

0

Tôi nghĩ bạn đúng. Vì danh sách con được hỗ trợ bởi danh sách gốc. Từ các tài liệu java:

Trả một cái nhìn của phần danh sách này giữa fromIndex quy định, toàn diện và toIndex, độc quyền. (Nếu fromIndex và toIndex đều bình đẳng, các danh sách trả về là rỗng.) Các trở danh sách được hỗ trợ bởi danh sách này, vì vậy thay đổi phi cấu trúc trong trở lại danh sách được phản ánh trong danh sách này, và ngược lại. Danh sách trả lại hỗ trợ tất cả các hoạt động danh sách tùy chọn được danh sách này hỗ trợ.

1

subList tạo phiên bản mới AbstractList.SubList, giữ tham chiếu đến danh sách gốc. Vì vậy, nếu bạn giữ biến trở lại bởi getHallOfFame, nó sẽ ngăn chặn gc để làm sạch listToSort.

Các vấn đề liên quan