2012-05-07 40 views
8

Nếu tôi tạo một đối tượng mà không gán nó cho bất cứ thứ gì, khi nào thì Javascript rác sẽ thu thập đối tượng này? Dưới đây là một ví dụ:Các đối tượng ẩn danh được thu thập trong Javascript như thế nào?

alert(new Date().getTime()); 

Nếu không thu gom rác thải như vậy được thực hiện, điều này sẽ gây ra một sự rò rỉ bộ nhớ?

for (var i = 0; i < 99999999; i++) { 
    console.info(new Date().getTime()); 
} 
+0

Bạn có một vấn đề? –

+1

Câu trả lời trực tiếp cho câu hỏi của bạn ("đối tượng được thu thập đôi khi sau khi không còn được tham chiếu" và "không, nó sẽ không gây ra rò rỉ") có lẽ không phải là những gì bạn đang thực sự tìm kiếm. Bạn thực sự muốn biết điều gì? – Phrogz

+2

@AshBurlaczenko và Phrogz - tôi không nghĩ có gì sai khi hỏi về thứ như thế này. Nếu bạn đang cố gắng tối ưu hóa một số mã, có lẽ để giảm mức sử dụng bộ nhớ, đây là một điều rất tốt để biết, và nó không phải được gắn với một vấn đề cụ thể. – nickf

Trả lời

7

Nếu không có ai trong phạm vi tham chiếu đến các đối tượng ẩn danh, chúng sẽ bị thu thập rác trong lần chạy tiếp theo của GC.

Vì vậy, sau khi Console.info kết thúc chạy, chúng sẽ sẵn sàng để thu thập rác. Nếu bạn đặt bất kỳ biến trong phạm vi nào để chỉ chúng, thì chúng sẽ không.

4

Vẻ đẹp của thu gom rác thải là bạn không biết khi nào bộ nhớ sẽ được khai hoang, cũng không phải bạn nên quan tâm (trừ khi nó đang xảy ra quá thường xuyên).

Trong trường hợp này, thời gian chạy cuối cùng sẽ xác nhận lại các trường hợp Date đó, nhưng không có gì bạn làm thực sự sẽ thay đổi nhanh như thế nào. Ngoài ra, điều này không gây ra rò rỉ bộ nhớ.

4

JavaScript chạy GC (bộ thu gom rác) tự động khôi phục bộ nhớ bị chiếm bởi chuỗi, đối tượng, mảng và chức năng không còn được sử dụng nữa.

Tính năng chính của bộ sưu tập rác là bộ thu gom rác phải có thể xác định khi nào an toàn để lấy lại bộ nhớ. Rõ ràng, nó không bao giờ lấy lại các giá trị vẫn đang được sử dụng và chỉ nên thu thập các giá trị không còn có thể truy cập được nữa; có nghĩa là, các giá trị không thể được tham chiếu qua bất kỳ biến nào, thuộc tính đối tượng hoặc phần tử mảng trong chương trình.

tham khảo:Here.

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