2013-10-21 19 views
7

Tôi khá mới đối với Scala.Bộ sưu tập Scala Garbage?

Nếu tôi có một cấu trúc như thế này,

sampleFile.map(line => line.map { 
    var myObj = new MyClass(word); 
    myObj.func(); 
}) 

tôi có thể tạo một đối tượng của MyClass và làm điều gì đó bên trong một phương pháp học (func()). Tôi lặp lại điều này cho tất cả các dòng trong một tập tin (thông qua map). Vì vậy, tôi tạo ra một đối tượng ở mọi bước lặp của tôi (cho mỗi dòng). Phạm vi của myObj sẽ bị vô hiệu khi tôi bắt đầu lặp lại tiếp theo (chúng sẽ bị hủy ở cuối khối, hoặc chúng sẽ bị mồ côi trong bộ nhớ?). Nghi ngờ của tôi là khi nào thì bộ sưu tập rác thải được kích hoạt? Ngoài ra, nó là tốn kém để tạo ra một đối tượng ở mỗi bước của iteration? Điều này có bất kỳ ý nghĩa hiệu suất nào khi số lượng các dòng tăng lên 1 triệu?

Trả lời

7

Đối tượng của bạn tất cả sẽ bị thu gom rác một cách nhanh chóng (giả sử myObj.func() không lưu trữ con trỏ tới myObj ở một nơi khác ...). Trên JVM, bất kỳ đối tượng unreferenced nào cũng sẽ nhận được rác được thu thập - và tham chiếu cuối cùng của bạn cho đối tượng mới biến mất ngay sau khi myObj vượt quá phạm vi.

Thu gom rác của đối tượng ngắn ngủi nói chung là rất rẻ và hiệu quả, vì vậy bạn có lẽ không nên lo lắng về điều đó (ít nhất là cho đến khi bạn có các tiêu chuẩn/vấn đề hiệu suất đo đó chứng minh điều ngược ....)

Cụ thể, vì bạn có vẻ đang làm IO (đọc từ một tệp mẫu?) Thì tôi mong đợi chi phí của GC là không đáng kể so với chi phí hoạt động IO đĩa của bạn.

1

Thu gom rác thải là trách nhiệm của JVM, không phải là Scala. Vì vậy, các chi tiết chính xác phụ thuộc vào JVM bạn đang chạy. Không có thời gian xác định mà bộ sưu tập rác được kích hoạt; JVM cố gắng làm điều đó khi nó là cơ hội hoặc cần thiết.

Ai đó hiểu biết hơn về chủ đề thuật toán GC và điều chỉnh JVM có thể cung cấp cho bạn một số giải thích cụ thể để giải quyết các mối quan tâm về hiệu suất của bạn, nhưng nói chung tôi nên nói rằng bạn nên tin tưởng rằng JVM "thông minh".

+1

Không hoàn toàn. Có một điểm bên ngôn ngữ - chức năng ẩn danh trong Scala được đại diện bởi đối tượng Function và cách nó được cấp phát (onle once hoặc every iteration) có thể ảnh hưởng đến hiệu năng. –

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