Tôi có một danh sách rất lớn các số, trải qua rất nhiều thao tác toán học. Tôi chỉ quan tâm đến kết quả cuối cùng. Để mô phỏng hành vi này, hãy xem mã ví dụ của tôi bên dưới:Các vấn đề về phạm vi và bộ nhớ trong Scala
object X {
def main(args:Array[String]) = {
val N = 10000000
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep(5000)
val y = x.map(_*5)
println(y.slice(0,10))
Thread.sleep(5000)
val z = y.map(_+4)
println(z.slice(0,10))
Thread.sleep(5000)
}
}
Vì vậy x là danh sách rất lớn. Tôi chỉ quan tâm đến kết quả z. Để có được z, trước tiên tôi phải thao tác toán học x để có được y. Sau đó, tôi thao tác y để có được z. (Tôi không thể đi từ x đến z trong một bước, bởi vì các thao tác khá phức tạp. Đây chỉ là một ví dụ.)
Vì vậy, khi tôi chạy ví dụ này, tôi hết bộ nhớ có lẽ vì x, y và z tất cả trong phạm vi và tất cả đều chiếm bộ nhớ.
Vì vậy, tôi thử như sau:
def main(args:Array[String]) = {
val N = 10000000
val z = {
val y = {
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep(5000)
x
}.map(_*5)
println(y.slice(0,10))
Thread.sleep(5000)
y
}.map(_+4)
println(z.slice(0,10))
Thread.sleep(5000)
}
Vì vậy, bây giờ chỉ z là trong phạm vi. Vì vậy, có lẽ x và y được tạo ra và sau đó rác thu thập được khi chúng đi ra khỏi phạm vi. Nhưng đây không phải là những gì xảy ra. Thay vào đó, tôi lại hết bộ nhớ!
(Lưu ý: Tôi sử dụng java -Xincgc, nhưng nó không giúp)
Câu hỏi:. Khi tôi có bộ nhớ đủ để chỉ có 1 danh sách lớn, tôi có thể bằng cách nào đó vận dụng nó chỉ sử dụng val (tức là không có có thể thay đổi các vars hoặc ListBuffers), có thể dùng scoping để ép gc? Nếu vậy, làm thế nào? Cảm ơn
Bạn sẽ luôn cần bộ nhớ cho hai danh sách. Trong tò mò, bạn đã thiết lập vùng heap Java của mình chưa? Được coi là 'Array'? –
Đúng, tôi sẽ luôn cần bộ nhớ cho 2 Danh sách mà tôi có. Nhưng tôi không cần bộ nhớ cho 3 danh sách mà tôi không có. Bạn có đồng ý không? Trong mọi trường hợp, kể từ khi x và y đi ra khỏi phạm vi, tại sao họ không thu thập rác một khi VM nhận ra ngắn của nó trên bộ nhớ và các biến không nằm trong phạm vi? –