> For the complete documentation index, see [llms.txt](https://mistborn.gitbook.io/til-coding/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mistborn.gitbook.io/til-coding/javascript/garbage-collection.md).

# Garbage collection

## Reachability

主要管理記憶體的核心是可取得性，JavaScript 引擎裡有垃圾搜集器，監控並移除未使用的物件。

* 目前函式的參數或變數
* 內嵌函式所用到的變數及參數
* 全域變數

## A simple example

```javascript
// user has a reference to the object
let user = {
  name: "John"
};

// 物件被移除，得不到物件的值 John
user = null;
```

## Two references

```javascript
// user has a reference to the object
let user = {
  name: "John"
};

let admin = user;

// 只修改 user 的指向，admin 仍存在物件，因此物件依然存在
user = null;
```

## Interlinked objects

```javascript
function marry(man, woman) {
  woman.husband = man;
  man.wife = woman;

  return {
    father: man,
    mother: woman
  }
}

let family = marry({
  name: "John"
}, {
  name: "Ann"
});
```

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJEnGO9JcREmjrS1Nb%2F-LhJJ72PUICiEtVAHoGA%2Ffamily%402x.png?alt=media\&token=70b98f34-d464-43ac-bf2e-17f01622de76)

```javascript
delete family.father;
delete family.mother.husband;
```

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJEnGO9JcREmjrS1Nb%2F-LhJJMzdJQth6GbYDloU%2Ffamily-delete-refs%402x.png?alt=media\&token=62a40f7f-09e6-4128-ba5d-4ff8c0a6732f)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJEnGO9JcREmjrS1Nb%2F-LhJJQlZhDxd6oLYIfZ_%2Ffamily-no-father%402x.png?alt=media\&token=cf82e4a7-3865-4d70-a1b4-6f4664871eda)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJEnGO9JcREmjrS1Nb%2F-LhJJYTGfdxVc0JDNzOO%2Ffamily-no-father-2%402x.png?alt=media\&token=55667b1e-c1f5-43a5-8074-0878deefc79c)

## Unreachable island

```javascript
family = null;
```

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJEnGO9JcREmjrS1Nb%2F-LhJLVGFqcU6L7xnplMh%2Ffamily-no-family%402x.png?alt=media\&token=a79a3f3c-6832-47f8-a1ac-226cbaee27dc)

## Internal algorithms

基本的垃圾蒐集演算法為 `mark-and-sweep`

* 垃圾搜集器找尋所有根並標註。
* 標註所有根指向的記憶，繼續往下一層標註記憶體直到沒有新的物件。
* 未被標註的記憶體進行刪除。

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJN8vgKIus1PYMkYMi%2F-LhJO-ekIcDWAQh-wZ2I%2Fgarbage-collection-1%402x.png?alt=media\&token=5d615fb3-6272-4f0a-bb40-f08d2b3e44bb)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJN8vgKIus1PYMkYMi%2F-LhJO2E0ukjCd35ytE2R%2Fgarbage-collection-2%402x.png?alt=media\&token=48a1044c-cebc-4387-be71-0a858fb16a86)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJN8vgKIus1PYMkYMi%2F-LhJO3rpdserl98dMj6M%2Fgarbage-collection-3%402x.png?alt=media\&token=6920d7ad-ab84-474e-a8d1-53397b42bd84)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJN8vgKIus1PYMkYMi%2F-LhJO68CJ-Qx--P3Oo6p%2Fgarbage-collection-4%402x.png?alt=media\&token=a86a98e3-13fc-47e1-a014-11acf81b6132)

![](https://2384301684-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LS3vj0v55HiJ9Pkdigx%2F-LhJN8vgKIus1PYMkYMi%2F-LhJO8Dg4TP_q2x9WiHe%2Fgarbage-collection-5%402x.png?alt=media\&token=26f71900-bd5c-441d-9217-47b260fa03b5)
