như ECMAScriptv5, mỗi lần khi kiểm soát vào một mã, enginge tạo ra một LexicalEnvironment (LE) và một VariableEnvironment (VE), cho chức năng mã, những 2 đối tượng là chính xác tài liệu tham khảo cùng đó là kết quả của gọi NewDeclarativeEnvironment (ECMAScript v5 10.4.3), và tất cả các biến khai báo trong chức năng mã được lưu trữ trong hồ sơ môi trường componentof VariableEnvironment (ECMAScript v5 10.5), và đây là các khái niệm cơ bản cho việc đóng cửa.Về việc đóng cửa, LexicalEnvironment và GC
gì nhầm lẫn tôi là như thế nào rác Thu thập công trình với cách tiếp cận đóng cửa này, giả sử tôi có mã như:
function f1() {
var o = LargeObject.fromSize('10MB');
return function() {
// here never uses o
return 'Hello world';
}
}
var f2 = f1();
sau dòng var f2 = f1()
, đồ thị đối tượng của chúng tôi sẽ là:
global -> f2 -> f2's VariableEnvironment -> f1's VariableEnvironment -> o
do đó, từ kiến thức nhỏ của tôi, nếu công cụ javascript sử dụng phương pháp tính tham chiếu để thu thập rác, đối tượng o
có tại le ase 1 refenrence và sẽ không bao giờ được GCed. Xuất hiện điều này sẽ dẫn đến lãng phí bộ nhớ vì o
sẽ không bao giờ được sử dụng nhưng luôn được lưu trữ trong bộ nhớ.
Ai đó có thể cho biết động cơ đều biết rằng f2 của VariableEnvironment không sử dụng f1 của VariableEnvironment, vì vậy VariableEnvironment toàn bộ f1 của sẽ GCed, do đó là một đoạn mã có thể dẫn đến tình hình phức tạp hơn:
function f1() {
var o1 = LargeObject.fromSize('10MB');
var o2 = LargeObject.fromSize('10MB');
return function() {
alert(o1);
}
}
var f2 = f1();
trong trường hợp này, f2
sử dụng đối tượng o1
mà các cửa hàng trong VariableEnvironment f1 của, vì vậy VariableEnvironme f2 của nt phải giữ một tham chiếu đến f1 Biến số môi trường, kết quả là o2
cũng không thể được GC, điều này dẫn đến lãng phí bộ nhớ.
vì vậy tôi sẽ hỏi, cách công cụ javascript hiện đại (JScript.dll/V8/SpiderMonkey ...) xử lý tình huống như vậy, có quy tắc được chỉ định chuẩn hay không. đồ thị đối tượng như vậy khi thực hiện Bộ sưu tập rác.
Cảm ơn.
bản sao có thể có của [thu thập rác với node.js] (http://stackoverflow.com/questions/5326300/garbage-collection-with-node-js) – Bergi