2016-10-12 17 views
8

Việc tạo các biểu tượng ES6 chưa được khai thác, năng động, có thể dẫn đến việc sử dụng bộ nhớ không thể khôi phục?Có phải rác thu thập ký hiệu toàn cầu ES6 được thu thập không?

Trong Erlang (và trước đây là Ruby), việc tạo các nguyên tử/ký hiệu không phải là rác được thu thập.

Dường như biểu tượng được tạo trong đăng ký biểu tượng toàn cầu (Symbol.for('string')) không thể thu thập rác và vẫn duy trì trên toàn cầu nhưng tôi có thể thiếu thứ gì đó. Điều này dường như không được tôi đưa ra bởi thông số ES6.

+0

Câu hỏi trong tiêu đề của bạn hoàn toàn là chủ đề. Tuy nhiên, câu hỏi trong văn bản * của bạn là không có chủ đề (dựa trên ý kiến). –

+4

Ký hiệu là bản gốc. [The spec] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-symbol.for) không nói bất cứ nơi nào mà các bản ghi trong danh sách * GlobalSymbolRegistry * (giữ phím và biểu tượng tương ứng) được giữ yếu. Vì vậy, tôi đoán (do đó không phải là một câu trả lời) rằng các hồ sơ không GC'd. Nhưng bạn phải tạo ra rất nhiều thứ cho họ. –

+2

Như @ T.J.Crowder đã viết các biểu tượng trong JS là nguyên thủy. Nguyên thủy không bị thu gom rác ngay từ đầu. Tất cả các động cơ có thể làm là để loại bỏ một mục từ một danh sách. Dù bằng cách nào thì điều này cũng không có ý nghĩa gì cả. Nếu bạn đặt một cái gì đó vào một cơ quan đăng ký, thì động cơ không thể dự đoán liệu bạn có cố gắng lấy nó trong tương lai hay không. – zeroflagL

Trả lời

2

Ký hiệu là nguyên thủy không có nghĩa là chúng không thể được triển khai bằng cách sử dụng tham chiếu và phân bổ. Chỉ cần suy nghĩ về các chuỗi nguyên thủy trong js. Các trình duyệt có thể thực hiện các biểu tượng theo cách này, làm cho chúng phải chịu gc. Một thử nghiệm nhanh chóng for(;;) Symbol(); (không chạy nó) trong chrome gây ra một hồ sơ bộ nhớ sawtooth vì vậy tôi giả sử các biểu tượng được phân bổ và thu gom rác thải.

+1

'for (;;) Symbol();' không kiểm tra các ký hiệu toàn cục, nó chỉ kiểm tra các biểu tượng địa phương. Để kiểm tra nếu có một rò rỉ với db biểu tượng toàn cầu, hãy sử dụng: '(function f() { let first_char = String.fromCharCode (0); let s = first_char; let NextString = _1 => s.charCodeAt (0) ! == 65535? String.fromCharCode (s.charCodeAt (0) +1) + s.substring (1): first_char + s; cho (let x = 1; x <= 200000; ++ x) Symbol.for (s), s = NextString (s); console.log ('thực hiện một vòng. tiếp theo trong 5 giây'); setTimeout (f, 5000); })() '. Tôi tin rằng Chrome không kiểm tra nếu các biểu tượng được sử dụng nằm trong phạm vi, nói cách khác, Chrome có thể bị rò rỉ bộ nhớ. – Pacerier

+0

Ngoài ra, trước tiên hãy đảm bảo khẳng định này là tốt: '{let r = 65536 + Math.floor (Math.random() * (Số.MAX_SAFE_INTEGER + 1-65536 + 1)); console.assert (String.fromCharCode (r) === String.fromCharCode (r% 65536))} ' – Pacerier

+0

Btw bạn sử dụng công cụ nào để làm hồ sơ? – Pacerier

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