Computer >> Máy Tính >  >> Lập trình >> Javascript

Làm thế nào để tham chiếu vòng tròn có thể gây rò rỉ bộ nhớ trong JavaScript?

Tham chiếu vòng tròn

Tham chiếu vòng tròn được hình thành khi hai biến tham chiếu đến nhau ở đó bằng cách cho mỗi đối tượng số tham chiếu là 1. Trong hệ thống thu gom rác thuần túy, tham chiếu vòng có thể không thành vấn đề khi các biến liên quan không có tham chiếu. Các biến đã khai báo sẽ được thu thập rác. Trong hệ thống đếm tham chiếu, không đối tượng nào sẽ bị phá hủy, vì số lượng tham chiếu không thể bằng không.

Trong hệ thống kết hợp, nơi đếm tham chiếu và thu thập rác được sử dụng, rò rỉ bộ nhớ sẽ xảy ra do hệ thống không xác định được tham chiếu vòng.

Ví dụ

Ví dụ sau cho thấy một tham chiếu vòng giữa đối tượng javascript và đối tượng DOM. Đối tượng javascript có tham chiếu đến đối tượng DOM (Div) và đối tượng Dom (Div), thông qua thuộc tính "expando", có tham chiếu đến đối tượng javascript (obj). Vì cả hai đối tượng đã được tham chiếu đến nhau nên không có đối tượng nào có thể bị phá hủy ở đó bằng cách gây rò rỉ bộ nhớ.

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   };
</script>
</body>
</html>

Tránh rò rỉ bộ nhớ

Trong ví dụ sau, ban đầu cả đối tượng javascript và đối tượng DOM đều ở trong tham chiếu vòng tròn nhưng khi null được gán cho đối tượng javascript thì cả hai đối tượng (đối tượng javascript và DOM) sẽ ở trong tình thế tiến thoái lưỡng nan để tìm ra đối tượng mà họ đang tham chiếu đó có phải là đối tượng javascript đang tham chiếu hay không null hoặc đối tượng DOM ở đó bằng cách phá vỡ tham chiếu vòng tròn.

Ví dụ

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   obj = null        // this breaks circular reference
   };
</script>
</body>
</html>