2015-09-25 13 views
5

Tôi không thể tìm ra việc thực hiện một số thao tác cho các chuỗi bất biến của Scala. Tôi sẽ sử dụng ví dụ này làm ví dụ:Quản lý bộ nhớ cho bộ sưu tập Scala hoạt động như thế nào?

def example: List[Int] = { 
    val list0 = List.range(1,10) 

    list0.tail 
} 

Khi chức năng kết thúc danh sách 0 hiện nằm ngoài phạm vi. Đầu list0 sẽ bị xóa khỏi bộ nhớ, hay list0 sẽ giữ nguyên cho đến khi toàn bộ danh sách là rác được thu thập?

+0

Scala sử dụng bộ thu gom rác như Java. Vì vậy, danh sách này sẽ được loại bỏ khỏi bộ nhớ khi gc sẽ được đưa ra bởi jvm một lần nữa và nhận ra rằng đối tượng này có thể được thu thập. – Everv0id

Trả lời

6

Trong ví dụ của bạn, người đứng đầu của list0 sẽ được để lại cho bộ thu gom rác để thu thập, vì không có gì sẽ tham chiếu đến nó. Các mục còn lại (đuôi), tuy nhiên, sẽ tiếp tục tồn tại khi thoát khỏi hàm (miễn là kết quả của cuộc gọi được gán cho một cái gì đó).

Mỗi ô trong danh sách duy trì tham chiếu đến ô kế tiếp trong danh sách (hoặc tới Nil), nhưng không ngược lại.

+0

Không thực tế là đầu có một tham chiếu đến một nút khác ngăn không cho nó bị thu gom rác? Tham chiếu đó có bị xóa khi nó vượt quá phạm vi không? – user3599828

+6

Không, bộ thu gom rác không quan tâm nếu một mục có tham chiếu riêng của nó với những thứ khác; nó chỉ quan tâm rằng mục không có gì khác đề cập đến * nó *. Miễn là điều đó đúng, mục đó là một ứng cử viên cho việc thu gom rác thải. – kes

1

Bạn đang tạo tổng cộng 12 (có thể) tổ chức

  1. list0 - Một danh sách có chứa từ 1 đến 10
  2. 10 yếu tố cá nhân trong phạm vi từ 1 đến 10. Đây có thể được thực tập nội trú, nhưng đó là một cuộc thảo luận khác.
  3. Giá trị trả về, list0.tail, chứa các phần tử 2-10.

Dưới đây là bộ nhớ đồ thị khái niệm ngay trước khi cú đúp xoăn cuối cùng, đây là những tài liệu tham khảo

  Somewhere on JVM Stack list0(head)->1->2 ... ->10 
               | 
Top of JVM Stack, contains returnList with head->| 

Khi chức năng được thực hiện, các tài liệu tham khảo list0 sẽ được popped tắt và sẽ được hưởng thu gom rác thải. Vì list0 là thứ duy nhất được tham chiếu 1, 1 là trò chơi công bằng để thu thập rác thải.

Các phần tử 2-10 cũng như danh sách trả lại chứa chúng sẽ vẫn nằm trên heap vì bất kỳ ai đang tham chiếu example vẫn có thể truy cập được bằng mã đang chạy.

Hy vọng điều này sẽ hữu ích.

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