Skip to content

Commit

Permalink
update translation
Browse files Browse the repository at this point in the history
  • Loading branch information
wuzhengyan2015 committed Jan 20, 2019
1 parent 5448d83 commit ebc3855
Showing 1 changed file with 9 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@

照片来自 [Unsplash](https://unsplash.com/?utm_source=medium&utm_medium=referral) 上的 [Dlanor S](https://unsplash.com/@dlanor_s?utm_source=medium&utm_medium=referral)

内存管理的主要目标是在请求时为系统动态地分配内存,然后释放那些不再使用的对象的内存。像 C、C++ 这样的语言有基本的内存分配函数,如 ``malloc()``而一些高级语言计算机体系结构(如JavaScript)包含垃圾回收器来完成这项工作。它跟踪内存分配并识别这些分配的内存是否不再使用,如果是就自动释放。但是这种算法不能完全决定内存是否仍被需要。因此,对于程序员来说,理解并决定一段特定的代码是否需要内存是非常重要的。让我们了解一下 JavaScript 中的垃圾收集是如何工作的:
内存管理的主要目标是在需要的时候为系统动态地分配内存,然后释放那些不再使用的对象的内存。像 C、C++ 这样的语言有基本的内存分配函数,如 `malloc()`而一些高级语言计算机体系结构(如 JavaScript)包含垃圾回收器来完成这项工作。它跟踪内存分配并识别这些分配的内存是否不再使用,如果是就自动释放。但是这种算法不能完全决定内存是否仍被需要。因此,对于程序员来说,理解并决定一段特定的代码是否需要内存是非常重要的。让我们了解一下 JavaScript 中的垃圾收集是如何工作的:

#### 垃圾回收

JavaScript 引擎的垃圾回收器基本上是寻找从内存中删除的无法访问的对象。这里我想解释两种垃圾回收算法,如下所示:
JavaScript 引擎的垃圾回收器基本上是寻找内存中被删除的无法访问的对象。这里我想解释两种垃圾回收算法,如下所示:

* 引用计数垃圾回收
* 标记清除算法
Expand Down Expand Up @@ -55,15 +55,15 @@ var obj_property1 = obj2.property1;
obj2 = "some random text"
```

通过更新为 `"some random text"` 来取消 `obj2` 对对象的引用。因此,之前拥有的这个对象似乎没有引用了,并且可以被垃圾回收了。但是,由于 `obj_property1` 具有 `obj2.property1` 的引用,所以这可能是错误的
通过更新为 `"some random text"` 来取消 `obj2` 对对象的引用。因此,之前的这个对象似乎没有被引用了,所以它可以被垃圾回收。但是,由于 `obj_property1` 具有 `obj2.property1` 的引用,因此它不会被垃圾回收

```
obj_property1 = null;
```

当我们把 `obj_property1` 引用删除,现在最初 `obj1` 指向的对象没有引用了。所以现在它可以被垃圾回收。

#### 这个算法在哪里失败了?
#### 这个算法在哪里失败了

```
function example() {
Expand All @@ -86,7 +86,7 @@ example();

#### 标记清除算法

这个算法查找从根开始无法访问的对象,这个根是 JavaScript 的全局对象。该算法克服了引用计数算法的局限性。没有引用的对象是不可访问的,反之亦然
这个算法查找从根开始无法访问的对象,这个根是 JavaScript 的全局对象。该算法克服了引用计数算法的局限性。没有引用的对象是不可访问的,但是反过来就不一定了

```
var obj1 = {
Expand All @@ -106,19 +106,19 @@ obj1 = null

现在,当我们将 `obj1` 的值设置为 `null` 时,该对象从根开始无法被访问,因此它可以被垃圾回收。

该算法从根开始,遍历所有其他对象,同时标记它们。它进一步遍历被遍历的对象并标记它们。这个过程一直持续到算法在标记所有已遍历的节点时没有子节点或任何可遍历的路径。现在垃圾回收器会忽略所有可访问对象,因为它们在遍历时被标记。因此,所有未标记的对象显然都是从根节点开始无法访问的,这使得它们可以被垃圾回收,稍后通过删除这些对象释放内存。让我们通过下面的例子来试着理解一下:
该算法从根开始,遍历所有其他对象,同时标记它们。它进一步遍历被遍历的对象并标记它们。这个过程将被重复直到所有已被遍历的节点没有任何子节点和可遍历的路径。现在垃圾回收器会忽略所有可访问对象,因为它们在遍历时被标记。因此,所有未标记的对象显然都是从根节点开始无法访问的,这意味着它们可以被垃圾回收,稍后通过删除这些对象释放内存。让我们通过下面的例子来试着理解一下:

![](https://cdn-images-1.medium.com/max/800/1*xndeuwtgCays2lrx2OKoMQ.png)

如上所示,这就是对象结构的样子。我们可以注意到无法从根目录访问的对象,但是让我们尝试了解在这种情况下标记清除算法是如何工作的。
如上所示,这就是对象结构的样子。我们可以注意到无法从根开始访问的对象,但是让我们尝试了解在这种情况下标记清除算法是如何工作的。

![](https://cdn-images-1.medium.com/max/800/1*TRr31SbiGWjPHnOwC1oB3w.png)

算法开始标记那些从根开始遍历到的对象。上面的图片中,我们可以注意到在对象上标记的绿色圆圈。这样它就可以将对象标识为可从根开始可以访问到。
算法从根开始标记遍历到的对象。上面的图片中,我们可以注意到在对象上标记的绿色圆圈。这样它就可以将对象标识为可从根开始可以访问到。

![](https://cdn-images-1.medium.com/max/800/1*oRCgCwBeCTfS457p43_hPg.png)

那些未标记的对象事无法从根开始被访问到。因此,他们利用被垃圾回收
未被标记的对象是无法从根开始被访问到的。因此它们可以被垃圾回收

#### 局限性

Expand Down

0 comments on commit ebc3855

Please sign in to comment.