(Translated by https://www.hiragana.jp/)
垃圾回收 (計算機科學) - 维基百科,自由的百科全书 とべ转到内容ないよう

垃圾回收かいしゅう (計算けいさん科學かがく)

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

ざい計算けいさん科學かがくちゅう垃圾回收かいしゅう英語えいごGarbage Collection縮寫しゅくしゃためGC)ゆびいちしゅ自動的じどうてき記憶きおくたい管理かんりせいとうぼう个程じょうらないようてき一部分内存空间不再被这个程序访问时,这个ほどじょかいじょ垃圾回收かいしゅう算法さんぽうこう操作そうさけい统归还这部分ぶぶんないそんそら间。垃圾回收かいしゅう以减轻程しきいんてき負擔ふたん,也減少げんしょうほどじょちゅうてき错误。垃圾回收かいしゅう最早もはや起源きげんLISP语言。[1][2]目前もくぜん許多きょたげんSmalltalkJavaC#GoD语言支援しえん垃圾回收かいしゅう

原理げんり

[编辑]

垃圾回收かいしゅうゆう兩個りゃんこ基本きほんてき原理げんり

  1. 考慮こうりょぼう個物こぶつけんざい未来みらいてきほどしき執行しっこうちゅうはたかいそん
  2. 回收かいしゅう這些物件ぶっけんしょうらないようてき記憶きおくたい[3]

ぶん

[编辑]

收集しゅうしゅう实现

[编辑]

引用いんよう计数收集しゅうしゅう

[编辑]

最早もはやてき也是さい简单てき垃圾回收かいしゅう实现方法ほうほう,这种方法ほうほう为占よう物理ぶつりそら间的对象附加ふかいち个计すうとうゆう其他对象引用いんよう这个对象时计すういちたん引用いんよう解除かいじょ时减いち。这种算法さんぽうかい定期ていき检查ひさし回收かいしゅうてき对象てき计数,为零てき话则回收かいしゅう其所うらない物理ぶつりそら间,いん为此时的对象やめ经无ほう访问。这种方法ほうほう无法回收かいしゅう循环引用いんようてきそん储对ぞう

跟踪收集しゅうしゅう

[编辑]

きん现代てき垃圾回收かいしゅう实现方法ほうほう,这种算法さんぽうかい定期ていきへん历它管理かんりてきないそんそら间,从若干じゃっかん储存对象开始查找与あい关的そん储对ぞうしかきさき标记其余てきぼつゆう关联てきそん储对ぞうさいきさき回收かいしゅう这些ぼつゆう关联てきそん储对ぞううらないようてきないそんそら间。

回收かいしゅう算法さんぽう

[编辑]

もと于其标记回收かいしゅうぎょう为,またぶん若干じゃっかん细致方法ほうほう

标记-しんじょ

[编辑]

さき暂停せい个程じょてき全部ぜんぶ运行线程,让回收かいしゅう线程以单线程进行扫描标记,并进ぎょう直接ちょくせつきよしじょ回收かいしゅうしかきさき回收かいしゅう完成かんせいきさき,恢复运行线程。這樣かい产生大量たいりょうてきそら闲空间碎へん使だい容量ようりょう对象容易ようい获得连续てきないそんそら间,而造成ぞうせいそら间浪费。

标记-压缩

[编辑]

かず“标记-しんじょ相似そうじ不同ふどうてき回收かいしゅう间同时会しょう保留ほりゅうてきそん储对ぞう搬运汇集いた连续てきないそんそら间,从而整合せいごうそら闲空间,避免ないそん碎片さいへん

复制

[编辑]

需要じゅようほどじょしょうしょ拥有てきないそんそら间分なり两个部分ぶぶんほどじょ运行しょ需的そん储对ぞうさきそん储在其中いち个分てい义为“ぶん0”)。どう样暂停せい个程じょてき全部ぜんぶ运行线程,进行标记きさき回收かいしゅう间将保留ほりゅうてきそん储对ぞう搬运汇集いた另一个分てい义为“ぶん1”),完成かんせい回收かいしゅうほどじょざいほん回收かいしゅうきさきしょうせっらい产生てきそん储对ぞうかいそん储到“ぶん1”。ざいしたいち回收かいしゅう时,两个ぶんてきかくしょく对调。[3]

这种方式ほうしき非常ひじょう简单,ただしいん为只ゆういち个“はんそら间”(semi-space)よう分配ぶんぱい对象,ないそん使用しようしょう较于其他算法さんぽう其两ばい。这种わざ术也さけべ做“停止ていし并复せい”。Cheney算法さんぽうあらため进的はんそら分配ぶんぱい

增量ぞうりょう回收かいしゅう

[编辑]

需要じゅようほどじょしょうしょ拥有てきないそんそら间分なり若干じゃっかんぶんほどじょ运行しょ需的そん储对ぞうかい分布ぶんぷざい这些ぶんちゅう每次まいじただ对其ちゅう一个分区进行回收操作,从而避免暂停所有しょゆうただしざい运行てき线程らい进行回收かいしゅうまこと部分ぶぶん线程ざいかげ回收かいしゅうぎょう为下保持ほじ运行,并且くだてい回收かいしゅう时间,增加ぞうかほどじょ响应速度そくど

ぶんだい

[编辑]

よし于“复制”算法さんぽう对于そんかつ时间长,だい容量ようりょうてき储存对象需要じゅよう耗费さらてきうつり动时间,存在そんざい储存对象てきそんかつ时间てき异。需要じゅようほどじょしょうしょ拥有てきないそんそら间分なり若干じゃっかんぶん,并标记为ねん轻代そら间和ねんろうだいそら间。ほどじょ运行しょ需的そん储对ぞうかいさきそんざいとし轻代ぶんねん轻代ぶん区会くかい较为频密进行较为げき进垃圾回收かいしゅうぎょう为,每次まいじ回收かいしゅう完成かんせいこうそんてきそん储对ぞうないてき寿命じゅみょう计数いち当年とうねん轻代ぶんそん储对ぞうてき寿命じゅみょう计数达到一定阈值或存储对象的占用空间超过一定阈值时,则被うつり动到ねんろうだいそら间,ねんろうだいそら间会较少运行垃圾回收かいしゅうぎょう为。一般いっぱんじょう况下,还有永久えいきゅうだいてきそら间,よう于涉及程じょせい个运ぎょう生命せいめい周期しゅうきてき对象そん储,れい如运ぎょうだい码、かずすえつねりょうとう,该空间通常つうじょう进行垃圾回收かいしゅうてき操作そうさつう过分だいそんかつざい局限きょくげんいきしょう容量ようりょう寿命じゅみょうたんてきそん储对ぞうかい快速かいそく回收かいしゅうそんかつざい全局ぜんきょくいきだい容量ようりょう寿命じゅみょう长的そん储对ぞう就较しょう回收かいしゅうぎょう为处扰。

現今げんこんてきGC(如Java.NET使用しようぶんだい收集しゅうしゅう(generation collection),あきら物件ぶっけんそんかつ時間じかんてき長短ちょうたん使用しよう不同ふどうてき垃圾收集しゅうしゅう演算えんざんほう,以達いたさいこのみてき收集しゅうしゅう效能こうのう

以Javaためれいよしないそん管理かんりほどじょ管理かんりてきうずたか以切わりなりため两個部分ぶぶん

  1. Young:
    1. Eden:そんしん生物せいぶつけん
    2. Survivor:そん經過けいか垃圾回收かいしゅうぼつゆうきよしじょてき物件ぶっけん
    3. semi-Spaces:かずSurvivor做Copying collection。
  2. Tenured:物件ぶっけんつぎ回收かいしゅうぼつゆうきよしじょのりうつりいた該區かたまり

JVM对不同ふどうてき世代せだい使用しよう不同ふどうてきGC演算えんざんほう

  1. Minor collection:
    YOUNG世代せだい使用しようはたEdenかえゆうSurvivor內的資料しりょう利用りようsemi-space做複せい收集しゅうしゅう(Copying collection),
    なみはた原本げんぽんSurvivor內經過多かた垃圾收集しゅうしゅう仍然そんかつてき物件ぶっけん移動いどういたTenured。
  2. Major collectionそくかい進行しんこうMinor collection,Tenured世代せだいそく進行しんこう標記ひょうき壓縮あっしゅく收集しゅうしゅう[4]

さく

[编辑]

GCつくえせい以是よしほどしきげん本身ほんみ提供ていきょうてきこうのう(如Java、C#),也可以是ほどじょ语言以外いがいてきだいさんぽうはこしきれいかい姆垃圾收集しゅうしゅう就是いちしゅ支援しえんC/C++かたりげんてき自動じどう記憶きおくたい管理かんり工具こうぐ

まいり

[编辑]

参考さんこう文献ぶんけん

[编辑]
  1. ^ Recursive functions of symbolic expressions and their computation by machine, Part I. Portal.acm.org. [29 March 2009]. 
  2. ^ Recursive functions of symbolic expressions and their computation by machine, Part I. [29 May 2009]. (原始げんし内容ないようそん档于2013-10-04). 
  3. ^ 3.0 3.1 吴, ひろし; , しゅう. 一种基于半空间的不完全拷贝垃圾回收机制. 哈尔滨工业大がくがく报. 2011, 43 (11): 60–64 [2020-03-27]. ISSN 0367-6234. (原始げんし内容ないようそん于2020-05-28). 
  4. ^ ぶんだい-JVMぶん. [2020-03-28]. (原始げんし内容ないようそん于2020-03-28) えい语).