[52] [[HTML]] や [[DOM]] は様々な[[オブジェクト]]やそれに類するもので構成されています。
それらは[[文書]] ([[Webアプリケーション]]) を構成する要素として存在していたり、
[[スクリプト]]によって操作されたりします。どこからも[[参照]]されなくなり、
[[スクリプト]]上も[[利用者界面]]上も意義を失った[[オブジェクト]]等は[DFN[[RUBYB[ごみ収集]@en[garbage collection]]]]され、
破棄されます。それはすなわち [[Webブラウザー]]実行環境の[[メモリー]]から削除され、
動作もアクセスもできなくなることを意味します。

* 仕様書

[REFS[
- [2] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#garbage-collection>
- [6] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#playing-the-media-resource>
- [9] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#best-practices-for-authors-using-media-elements>
- [11] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#garbage-collection-and-browsing-contexts>
- [20] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dedicated-workers-and-the-dedicatedworkerglobalscope-interface>
- [24] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dedicated-workers-and-the-worker-interface>
- [22] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors-0>
- [25] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#garbage-collection-0>
- [31] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#garbage-collection-1>
- [44] [CITE@en-US[DOM Standard]] ([TIME[2012-11-16 19:17:11 +09:00]] 版) <http://dom.spec.whatwg.org/#garbage-collection>
- [46] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#update-the-image-data>
- [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#proxying-canvases-to-workers>
- [53] [CITE@en-US[XMLHttpRequest Standard]] ([TIME[2012-11-14 13:48:01 +09:00]] 版) <http://xhr.spec.whatwg.org/#garbage-collection>
- [82] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-03-07 22:55:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#garbage-collect-the-regions>
- [36] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-12-03 22:48:19 +09:00]] 版) <https://html.spec.whatwg.org/#outstanding-rejected-promises-weak-set>
- [91] [CITE@en-US[Notifications API Standard]] ([TIME[2014-02-11 16:20:34 +09:00]] 版) <http://notifications.spec.whatwg.org/#garbage-collection>
]REFS]

* ごみ収集アルゴリズム

[107] [[Webブラウザー]]は[[ごみ収集]]を実装しなければなりません。

;; [108] [[スクリプト]]をまったく実装しない [[Webブラウザー]]は、
一般的に「[[ごみ収集]]」と呼ばれるものを実装せず、単に必要なくなった[[文書]]を[[解放]]するだけで済むかもしれません。

[109] 具体的な方法は規定されていません。実装は任意の方法を選択できます。

;; [42] 実際のところ、[[ごみ収集]]に関する規定はありますが、
[[ごみ収集]]を実装しなければならないという規定はどの[[仕様書]]にもありません。
しかし[[ごみ収集]]しない場合、[[メモリー]]上の利用可能領域は徐々に減少し、
いずれ [[Webブラウザー]]自体が動作しなくなります。
動作しなくなった時点で [[Webブラウザー]]は[[仕様書]]上の各規定に従うことができませんから、
(無限に大きな[[メモリー]]を有さない限り) [[ごみ収集]]しない
[[Webブラウザー]]は[[適合]]できません。

[110] 単なる[[参照カウンター]]では、[[循環参照]]を持ち外部から参照されなくなった[[オブジェクト]]群を回収できません。
[[著者]]の[[スクリプト]]が[[循環参照]]を破棄することは求められていませんから、
[[メモリリーク]]が発生してしまいます。[[仕様書]]の[[アルゴリズム]]も[[循環参照]]の破棄はしていませんから、
実装時には注意が必要です。

;; [111] [[メモリーリーク]]を発生させること自体は[[仕様書]]の規定に[[不適合]]であるとは言い切れず、
[[実装の品質]]の問題に過ぎないかもしれませんが、[[メモリーリーク]]により[[メモリー]]領域の確保ができず動作に支障が出るなら、
仕様違反ということになりそうです。
(そもそも[[仕様]]に違反するかどうか以前に、[[プログラム]]の動作に対する一般的な期待として、
[[メモリーリーク]]は[[不具合]]とみなされるとは思いますが...)

* 観測可能性

[84] [[Web]] と [[JavaScript]] においては[[ごみ収集]]の具体的な手法は[[実装依存]]となっており、
その挙動は[[著者]]から[[観測可能]]であるべきではないと考えられています。

[85] [[言語]]によっては[[オブジェクト]]が破棄される直前に特定の[[メソッド]]が呼び出されるなどの仕組みがありますが、
[[Web]] にはそれに類するものはありません。

[96] この原則に反する新機能の導入は避けるべきだと考えられており、
回避できないために断念された機能もあります。

[FIG(list)[
- [86] [[DOM3]] には [CODE(DOMi)@en[[[UserDataHandler]]]] 
を[[節点]]の破棄の直前に呼び出す仕組みがありましたが、
削除されました。詳しくは [CODE(DOMi)@en[[[UserDataHandler]]]] の項を参照してください。
- [97] [[ポート]]の一端が閉じられたことを通知する仕組みが提案されましたが、
実装されることはありませんでした (>>81)。
- [35] [CODE(DOMi)@en[[[PortCollection]]]] は実装されませんでした。
]FIG]

[98] [[ごみ収集]]の詳細を[[著者]] ([[スクリプト]]) から観測可能にしてしまうと、
[[Webブラウザー]]の実装の進化を阻害してしまう危険性があります。

[EG[
[99] 例えば[[ごみ収集]]には様々な手法が存在しますが、
特定のタイミングで特定の処理が実行されることを保証しようとすると、
それを実現可能な[[ごみ収集]]手法の実装を強制することになり、
[[ごみ収集]]手法の改良を妨げてしまうおそれがあります。
逆に当該処理の詳細な実行タイミングを定義しないと、
[[ごみ収集]]その他の実装の差異によって、実装ごとに異なるタイミングで処理が実行され、
[[相互運用性]]の問題が生じる可能性があります。
]EG]

[EG[
[100] [[live]] な[[コレクション]]は、対象となる[[DOM木]]の変更が反映されますが、
実装上はリアルタイムで変更を反映させる必要はなく、
[[スクリプト]]からアクセスがあった時まで変更の反映を遅延させることもできます。
あるいは、[[節点]]のリストを途中までだけ作成したり、
リストの一部だけ変更を反映させた状態にしたりと、
色々な実装方針が考えられ、どれを採用するかは各実装の裁量です。

[101] さて[[DOM木]]から[[節点]]が削除され、[[スクリプト]]からも参照されなくなった時、
その[[節点]]はおそらく[[コレクション]]からも削除されることになりますが、
[[ごみ収集]]が実行可能になるタイミングは、[[コレクション]]の更新のタイミングに依存します。
[[ごみ収集]]が観測可能になると、[[コレクション]]の実装方法にも制約が生じます。
]EG]

[EG[
[102] 多くの [[Webブラウザー]]では [CODE(JS)@en[[[console.log]]]]
により、あるいは開発者ツールにより [[JavaScript]] [[オブジェクト]]にアクセスできます。
つまり開発者ツールからオブジェクトへの参照が生じます。 [[スクリプト]]側での [[GC]]
のタイミングに制約があるとすると、開発者ツール側で参照が残っていてもスクリプト側では開放したことにしなければならず、
より実装が複雑になるかもしれません。 (少なくても実装方法への制約は強くなると思われます。)
]EG]

* ごみ収集と参照

[51] [[HTML]] も [[DOM]] も、「[DFN[[RUBY[ごみ収集][ガーベージ・コレクション]@en[garbage collection]]]]」、
「[DFN[[RUBYB[強参照]@en[strong reference]]]]」、「[DFN[[RUBYB[弱参照]@en[weak reference]]]]」
といった用語を定義なしで使っており、[[計算機科学]]分野での一般的な単語として用いていると思われます。
[WEAK[(なお [[HTML]] は「[[弱参照]]」という用語を使っていません。)]]

* 弱参照

[80] [[JavaScript]] には [CODE[WeakMap]] と [CODE[WeakSet]] があります。

[119] その他にいくつか[[仕様書]]上の概念が[[弱参照]]を使っています。

[EG[
[70] [[環境設定群オブジェクト]]の[F[[[未決拒絶された約束弱集合]]]]は、
そのメンバーに対して[[強参照]]を作っては[['''ならない''']] [SRC[>>36]]
と規定されています。
]EG]

[EG[
[120] [[変異オブザーバー]]は[[弱参照]]を持ちます。
]EG]

* 暗示強参照

[3] 既存の[[オブジェクト]]を返す[[IDL属性]]からは、その[[オブジェクト]]への[DFN[[RUBYB[[[暗示強参照]]]@en[implied strong reference]]]]があります。
[SRC[>>2]]

[EG[
[4] 例えば、 [CODE(JS)@en[[[window]].[[document]]]] [[IDL属性]]により、
[CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]から [CODE(DOMi)@en[[[Document]]]]
[[オブジェクト]]は[[強い参照]]があることとなります。

[5] [CODE(DOMi)@en[[[Document]]]] からその[[子孫節点]]へは [WEAK[(直接または間接の)]]
[[強い参照]]があります。

[112] 各[[節点]]から[[節点文書]]へは[[強い参照]]があります。
]EG]

** 歴史

[REFS[
- [67] [CITE@en[Web Applications 1.0 r2529        MAJOR CHANGES: ...]] ([TIME[2008-12-12 17:46:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2528&to=2529>
- [113] [CITE@en[Tie Location to the Window object · whatwg/html@fdd8216]] ([TIME[2016-02-04 20:54:13 +09:00]] 版) <https://github.com/whatwg/html/commit/fdd8216a902a065dd3e205cbbc1b5a6b527970a2>
]REFS]

* 内部的な属性値への参照

[79] [[オブジェクト]]には、しばしば [[IDL属性]]として直接外部から参照可能でなくとも、
内部的な属性のようなものとして別の[[オブジェクト]]が関連付けられていることがあります。
これも[[強参照]]が存在し、最初の[[オブジェクト]]が存在する限り関連付けられている[[オブジェクト]]も破棄されないものと思われます。

* 循環参照

[87] [[オブジェクト]]同士の参照は、直接または間接に循環していることがあります。例えば、
[[親節点]]から[[子節点]]へは [CODE(DOMa)@en[[[childNodes]]]] を通じて参照がありますし、
[[子節点]]から[[親節点]]へは [CODE(DOMa)@en[[[parentNode]]]] を通じて参照があり、循環しています。
また [[JavaScript]] によって[[著者]]が容易に[[循環参照]]を作り出すことができます。

[88] 従って [[Web]] における[[ごみ収集]]は、外部から参照されなくなった[[循環参照]]のある[[オブジェクト]]群を回収できる手法を用いる必要があります。

* ごみ収集による動作の停止

[93] [[ごみ収集]]の実装手法の中には、ごみ収集の処理のために本来の[[プログラム]]の動作をすべて停止する必要があるものもあります。

[94] 明示的な規定は存在していないものの、[[利用者]]に明確に判別可能なレベルで動作を停止させるような実装方法は、
好ましくないと考えられます。

[95] [[Acid3]] はその[[アニメーション]]が滑らかであることを要求しており、
この[[試験]]に通過するためには、実行途中で[[ごみ収集]]によって速度が変化するような実装であってはいけません。

[40] ただしこれは[[実装の品質]]の問題と考える人もいます。

* 閲覧文脈

[13] [[利用者エージェント]]は[[最上位閲覧文脈]]に対して[[強参照]]を持っています。 [SRC[>>11]]

;; [18] [[利用者エージェント]]から[[閲覧文脈]]への[[強参照]]は[[閲覧文脈を捨てる]][[算法]]で削除されます。

[12] [[閲覧文脈]]は、その [CODE(DOMi)@en[[[Document]]]] 群とその [CODE(DOMi)@en[[[WindowProxy]]]]
に対して[[強参照]]を持っています。 [SRC[>>11]]

;; [17] [[閲覧文脈]]から [CODE(DOMi)@en[[[Document]]]] への[[参照]]は[[[CODE(DOMi)@en[Document]]を捨てる]][[算法]]で削除されます。

[14] [CODE(DOMi)@en[[[Document]]]] はその [CODE(DOMi)@en[[[Window]]]] に対して[[強参照]]を持っています。逆に
[CODE(DOMi)@en[[[Window]]]] は [CODE(DOMa)@en[[[document]]]] [[属性]]を通じて[[暗示強参照]]を持っています。 [SRC[>>11]]

[15] [CODE(DOMi)@en[[[Window]]]] は [CODE(DOMi)@en[[[window]]]] など、
[CODE(DOMi)@en[[[Document]]]] は [CODE(DOMi)@en[[[defaultView]]]] などを通じて
[CODE(DOMi)@en[[[WindowProxy]]]] への[[暗示強参照]]を持っています。 [SRC[>>11]]

[16] [[スクリプト]]は[[スクリプト設定群オブジェクト]]への[[強い参照]]を持っており、
[[スクリプト設定群オブジェクト]]は[[大域オブジェクト]]、[[有責閲覧文脈]]、
[[有責文書]]に対して[[強参照]]を持っています。 [SRC[>>11]]

[19] [[最上位閲覧文脈]]でない[[閲覧文脈]]の [CODE(DOMi)@en[[[WindowProxy]]]] が[[ごみ収集]]の対象になると、
当該[[閲覧文脈]]は[[閲覧文脈を捨てる]][[算法]]により処理されなければなりません。 [SRC[>>11]]

** 歴史

[REFS[
- [68] [CITE@en[Web Applications 1.0 r2529        MAJOR CHANGES ...]] ([TIME[2008-12-12 17:46:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2528&to=2529>
]REFS]

* 変異観察器

[45] [[節点]]は、[[登録済み観察器]]のリストにある[[登録済み観察器]]に対する[[強参照]]を持ちます。
逆方向には[[弱参照]]を持ちます。 [SRC[>>44]]

* ワーカー

[21] [CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]]/[CODE(DOMi)@en[[[Worker]]]] は暗示的に関連付けられた [CODE(DOMi)@en[[[MessagePort]]]]
[[オブジェクト]]を有しますが、この [CODE(DOMi)@en[[[MessagePort]]]] は
[CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]]/[CODE(DOMi)@en[[[Worker]]]]
より先に[[ごみ収集]]しては[['''なりません''']]。 [SRC[>>20, >>24]]

[23] [[ワーカー]]の[[実行時誤り]]は [CODE(DOMe)@en[[[error]]]] [[事象]]として呼び出し元の [CODE(DOMi)@en[[[Worker]]]] や
[CODE(DOMi)@en[[[Document]]]] へと伝達されていきますが、その伝達先が既に[[ごみ収集]]されて消失している場合には
[CODE(DOMa)@en[[[onerror]]]] は [CODE@en[[[null]]]] であるものとして
[WEAK[(つまり何もしないで更に上位の呼び出し元へと伝達されるよう)]] 処理されます。 [SRC[>>22]]

[90] [[ワーカー]]は[[スクリプト設定群オブジェクト]]を介して[[ワーカー]]を起動した[[大域オブジェクト]]や
[CODE(DOMi)@en[[[Document]]]] への参照を保有しています。

@@ [118] [CODE(DOMi)@en[ServiceWorker]]

* [CODE(DOMi)@en[MessagePort]]

[39] [CODE(DOMi)@en[MessagePort]] については[[オブジェクト]]自身が[[著者]]の[[スクリプト]]から参照されなくなっても、
相手方が存在する限り存続することがあります。

;; [CODE(DOMi)@en[MessagePort]] 参照。

[HISTORY[
[81] [CODE(DOMi)@en[[[MessagePort]]]] の一端が失われた場合に他方に通知する方法も検討されたものの、
[[ごみ収集]]の挙動を[[スクリプト]]から観測できず、[[メモリーリーク]]もさせず、
[[bfcache]] も実装可能であるような手法が見つからず、議論がまとまりませんでした。

[39] [CODE(DOMi)@en[[[PortCollection]]]] は [CODE(DOMi)@en[[[MessagePort]]]]
を零個以上保有することができる[[オブジェクト]]ですが、[[強参照]]ではないので
[CODE(DOMi)@en[[[MessagePort]]]] の[[ごみ収集]]を防ぐ役割は持たず、
[[ごみ収集]]された [CODE(DOMi)@en[[[MessagePort]]]] は削除されていきます。
しかしこれも[[ごみ収集]]の実装の自由を損なうとして、実装されることはありませんでした。
]HISTORY]

* [CODE(DOMi)@en[BroadcastChannel]]

[38] [CODE(DOMi)@en[BroadcastChannel]] 参照。

* 画像

[47] [RUBYB[[[画像データの更新]]]@en[update the image data]][[算法]]の実行中は、
その対象となっている [CODE(HTMLe)@en[[[img]]]] [[要素]]の[[文書]]から当該[[要素]]への[[強参照]]があるとしなければ[['''なりません''']]。
[SRC[>>46]]

;; [48] [[[CODE(DOMi)@en[Document]]中]]にある[[要素]]なら自然に満たされますが、
そうではなく単独で存在する [CODE(HTMLe)@en[[[img]]]] [[要素]]であっても、
[[画像]]の読み込みが終わるまでは破棄されないことになります。

[HISTORY[
[50] [CODE(DOMi)@en[[[CanvasProxy]]]] は[[無効]]でなければ対応する[[画布要素]]への[[強参照]]があるとしなければ[['''なりません''']]。
[SRC[>>49]]
]HISTORY]

* ヒット領域

[83] [CODE(HTMLe)@en[[[canvas]]]] の[[ヒット領域]]は、削除されたり消去されて対応する[[画素]]がなくなり、
他の[[ヒット領域]]の[[子供]]でもないなら、[DFN[[RUBYB[領域をごみ収集する]@en[garbage-collect the regions]]]]手順により削除されます
[SRC[>>82]]。

* 媒体要素

[7] [[媒体要素]]は、それに対するすべての[[参照]]が削除されただけの理由で[RUBYB[[[再生]]]@en[playing]]を停止しては[['''なりません''']]。
それ以上[RUBYB[[[音声]]]@en[audio]]を再生できない状態になった時、当該[[媒体要素]]は[[ごみ収集]]して[['''構いません''']]。
[SRC[>>6]]

[8] [[要素]]に対して明示的に[[参照]]が存在しておらず、まだ[RUBYB[活性的に再生]@en[actively playing]]されていなくとも、
[[音声]]の[[再生]]のために存在し続けることがあります。例えばまだ[[参照]]されている[[現在媒体制御器]]があって[RUBYB[再生再開]@en[unpause]]できるかもしれませんし、
あるいは再生再開されていても[[バッファ]]待ちのため [[stall]] 中かもしれません。
[SRC[>>6]]

;; [10] 環境によっては同時再生数の制限が厳しいかもしれませんから、
再生が終わったらすべての[[参照]]を確実に削除するなど配慮することが特に好ましいとされています。 [SRC[>>9]]

* Blob

@@ [74] [[revokeObjectURL]]

* WebRTC

@@ [64] [CITE@en[WebRTC 1.0: Real-time Communication Between Browsers]] ([TIME[2012-11-15 19:30:32 +09:00]] 版) <http://dev.w3.org/2011/webrtc/editor/webrtc.html>

@@ [63] [CITE@en-us[Media Capture and Streams]] ([TIME[2012-11-15 19:30:32 +09:00]] 版) <http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack>

* XHR

[54] [CODE(DOMi)@en[[[XMLHttpRequest]]]] [[オブジェクト]]は次の場合[[ごみ収集]]しては[['''なりません''']]。
[SRC[>>53]]
- [55] 次のいずれかが成立し、
-- [56] 状態が [CODE(DOM)@en[[[OPENED]]]] であり [[[CODE(DOMm)@en[send()]]フラグ]]が設定されている
-- [57] 状態が [CODE(DOM)@en[[[HEADERS_RECEIVED]]]]
-- [58] 状態が [CODE(DOM)@en[[[LOADING]]]]
- [59] かつ次のいずれかが成立する場合
-- [60] [CODE(DOMe)@en[[[readystatechange]]]], [CODE(DOMe)@en[[[progress]]]], [CODE(DOMe)@en[[[abort]]]], 
[CODE(DOMe)@en[[[error]]]], [CODE(DOMe)@en[[[load]]]], [CODE(DOMe)@en[[[timeout]]]], [CODE(DOMe)@en[[[loadend]]]]
のいずれかの[[事象聴取器]]が登録されている場合
-- [61] [[アップロード完了フラグ]]が設定されておらず関連付けられた
[CODE(DOMi)@en[[[XMLHttpRequestUpload]]]] [[オブジェクト]]が
[CODE(DOMe)@en[[[progress]]]], [CODE(DOMe)@en[[[abort]]]], 
[CODE(DOMe)@en[[[error]]]], [CODE(DOMe)@en[[[load]]]], [CODE(DOMe)@en[[[timeout]]]], [CODE(DOMe)@en[[[loadend]]]]
のいずれかの[[事象聴取器]]が登録されている場合

[62] [CODE(DOMi)@en[[[XMLHttpRequest]]]] [[オブジェクト]]の[[接続]]が開いたまま[[ごみ収集]]される場合、
[[fetch]] をすべて取り消し、それらにより追加された[[タスク]]をすべて破棄し、
またそれらによりネットワークから受信しているデータがあれば破棄しなければ[['''なりません''']]。
[SRC[>>61]]

* 事象源

[26] [CODE(DOMi)@en[[[EventSource]]]] については、
- [28] [CODE(DOMa)@en[[[readyState]]]] が
[CODE[[[CONNECTING]]]] であり、かつ [CODE(DOMe)@en[[[open]]]], [CODE(DOMa)@en[[[message]]]],
[CODE(DOMa)@en[[[error]]]] のいずれかの[[事象聴取器]]が登録されている場合
- [27] [CODE(DOMi)@en[[[EventSource]]]] の [CODE(DOMa)@en[[[readyState]]]] が
[CODE[[[OPEN]]]] であり、かつ [CODE(DOMa)@en[[[message]]]],
[CODE(DOMa)@en[[[error]]]] のいずれかの[[事象聴取器]]が登録されている場合
- [29] [[遠隔事象タスク源]]に[[タスク]]が投入されている間

... には、 [CODE(DOMi)@en[[[EventSource]]]] の[[構築子]]が呼び出された [CODE(DOMi)@en[[[Window]]]]
または [CODE(DOMi)@en[[[WorkerUtils]]]] から [CODE(DOMi)@en[[[EventSource]]]]
への[[強参照]]がなければ[['''なりません''']]。 [SRC[>>26]]

[30] [CODE(DOMi)@en[[[EventSource]]]] の[[接続]]が開いている間に同オブジェクトが[[ごみ収集]]される場合、当該オブジェクトによって開かれた
[[fetch]] は中断しなければ[['''なりません''']]。 [SRC[>>26]]

** 歴史

[REFS[
- [69] [CITE@en[Web Applications 1.0 r2870 Drop <eventsource>. Replace the API with an EventSource object. Rename onclosed to onclose on WebSocket. Remove the mostly worthless event definitions. I'll add more useful intro text to replace them later. Defined garbage collection specialness for WebSocket and EventSource.]] ([TIME[2009-02-26 17:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2869&to=2870>
]REFS]

* Web Sockets

[32] [CODE(DOMi)@en[[[WebSocket]]]] [[オブジェクト]]は、
[[イベントリスナー]]や[[バッファー]]の状況次第で、[[ごみ収集]]してはなりません [SRC[>>31]]。

[37] また [CODE(DOMi)@en[[[WebSocket]]]] [[オブジェクト]]が[[接続]]が開いたまま[[ごみ収集]]される場合は、
接続を閉じる手順を実行しなければなりません [SRC[>>31]]。

;; [106] [[[CODE(DOMi)@en[WebSocket]]のごみ収集]]を参照。

* [CODE(DOMi)@en[Notification]]

[92] [CODE(DOMi)@en[[[Notification]]]] は、対応する[[通知]]が [[list of pending notifications]]
か [[list of active notifications]] に含まれていて、
[CODE(DOMe)@en[[[click]]]], [CODE(DOMe)@en[[[show]]]], [CODE(DOMe)@en[[[error]]]], [CODE(DOMe)@en[[[close]]]]
のいずれかの[[イベントリスナー]]を持つ間は、これを[[ごみ収集]]しては[['''いけません''']] [SRC[>>91]]。

* 歴史

[1] [[Web]] における[[ごみ収集]] ([[garbage collection]]) は [[HTML Living Standard]] ではじめて明示的に規定され、
その後他の仕様でも定義されるようになりました。

[REFS[
- [71] [CITE@en[Web Applications 1.0 r7573     Simplify the Blob release mechanism, at the cost of exposing the Web's innards a bit more to script authors.]]
( ([TIME[2012-12-08 07:57:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7572&to=7573>
- [72] [CITE@en[Navigation Timing]]
( ([TIME[2012-12-13 06:51:35 +09:00]] 版))
<http://www.w3.org/TR/2012/REC-navigation-timing-20121217/#garbage-collection>
]REFS]

- [66] [CITE@en[Web Applications 1.0 r2357    Define MessagePort such that they won't be garbage collected while a message is outstanding. (credit: ap)]] ([TIME[2008-10-21 04:18:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2356&to=2357>
- [65] [CITE@en[Web Applications 1.0 r2024 Simplify garbage collection for ports even further. Define dicarding of Document objects better for ports. Prevent inactive documents from receiving messages.]] ([TIME[2008-08-06 16:57:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2023&to=2024>

* メモ

[73] [[オブジェクト]]が[[著者]]がアクセスできる範囲の外から[[参照]]されることもあり得ます。例えば
[CODE(JS)@en[[[console.log]]]] [[メソッド]]に[[オブジェクト]]を渡すと、
その環境の[[デバッガー]]が当該オブジェクトへの参照を保持し、
[[スクリプト]]内から参照しなくなったとしても[[ごみ収集]]されずに残り続けることがあります。

[75] [CITE@en-US[Incremental GC in Firefox 16! | JavaScript]]
( ([TIME[2013-04-09 05:16:01 +09:00]] 版))
<https://blog.mozilla.org/javascript/2012/08/28/incremental-gc-in-firefox-16/>

[76] [CITE@en[JavaScript:SpiderMonkey:GC Futures - MozillaWiki]]
( ([TIME[2013-04-02 17:53:25 +09:00]] 版))
<https://wiki.mozilla.org/JavaScript:SpiderMonkey:GC_Futures>

[77] [CITE[substructural: Programming, Entrepreneurship, and the Markets: Garbage Collection in JavaScript, Part 1]]
( ([TIME[2013-03-20 10:45:20 +09:00]] 版))
<http://www.typedynamic.com/2012/03/garbage-collection-in-javascript.html>

[78] [CITE@en[Web Applications 1.0 r2529        MAJOR CHANGES: Revamp the way scripts are specified, along with their interaction with resolving relative URLs, etc. Give enough detail to justify objects in the DOM not being garbage collected randomly when still in use. Define script groups, to handle scripts going away during document.open() and session history navigation. Define why and how setTimeout(), database transactions, etc, handle page transitions. Drop the terms 'with' and 'without' script, use script is 'enabled'/'disabled' instead. Define 'unload' and 'beforeunload'. Rework how onfoo='' and .onfoo event handler attributes are defined. Rework how the content model of <noscript> is defined. Reword the way javascript: is defined to use the new terminology. Add a few notes of things that came up while I was doing all that.]]
( ([TIME[2008-12-12 17:46:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=2528&to=2529>

[89] [CITE@en[エデンの園でおきたこと - steps to phantasien]]
( ([[Hajime Morrita]] 著, [TIME[2014-02-17 18:13:31 +09:00]] 版))
<http://steps.dodgson.org/b/2012/12/19/dom-and-gc-or-what-happend-at-eden/>

[103] [CITE@en[Bug 25223 – IDB exposes GC behavior]]
( ([TIME[2015-01-15 11:34:59 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25223>

[104] [CITE@en[Bug 26515 – Change when media elements may be garbage collected]]
( ([TIME[2015-01-16 12:37:52 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26515>

[105] [CITE@en[Specify life time management · Issue #15 · yutakahirano/fetch-with-streams]]
([TIME[2015-01-30 15:05:19 +09:00]] 版)
<https://github.com/yutakahirano/fetch-with-streams/issues/15#issuecomment-72119046>

[33] [CITE@en[Feature suggestion - event from the JS Garbage Collector · Issue #238 · WebAssembly/design]]
([TIME[2015-07-14 08:38:23 +09:00]] 版)
<https://github.com/WebAssembly/design/issues/238>

[34] [CITE@en[Add description for suspension, resuming and garbage collection · whatwg/fetch@1dfbd1f]]
([TIME[2015-09-16 11:35:14 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/1dfbd1f6284e4cb0aae91a8b9db36a2dc11393b1>

[114] [CITE@en[Move structured cloning out from under Common DOM Interfaces · whatwg/html@e09b782]]
([TIME[2016-03-01 11:48:47 +09:00]] 版)
<https://github.com/whatwg/html/commit/e09b7824480ffc9df69b0d830c4b8adad3b000d1>

[115] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-27 23:19:37 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[116] [CITE@en[Custom elements disconnected from a document should not be upgraded · Issue #419 · w3c/webcomponents]]
( ([TIME[2016-05-16 00:20:22 +09:00]]))
<https://github.com/w3c/webcomponents/issues/419>

[117] [CITE@en[Workers: Curtail the browser's license to kill · Issue #1004 · whatwg/html]]
([TIME[2016-06-24 21:27:19 +09:00]])
<https://github.com/whatwg/html/issues/1004>

[41] [CITE[GC / DOM / Web API Integration :unicorn: - WebAssembly]]
([TIME[2017-01-14 05:40:46 +09:00]])
<http://webassembly.org/docs/gc/>

[43] [CITE@en[Abortable fetch]]
([[jakearchibald]]著, [TIME[2017-09-20 21:59:57 +09:00]])
<https://github.com/whatwg/fetch/commit/0bcd5dfc71ef44319873887f4b83119bd6d0b71d>

[121] [CITE@en[Sensor must not expose GC behavior]]
([[pozdnyakov]]著, [TIME[2017-12-14 20:24:36 +09:00]])
<https://github.com/w3c/sensors/commit/9fd7eeb7a69635ea9e3b0f4eb0402c677bba19e5>

[122] [CITE@en[Must not expose GC behavior to the web · Issue #337 · w3c/sensors]]
([TIME[2017-12-15 17:05:46 +09:00]])
<https://github.com/w3c/sensors/issues/337>

[123] [CITE@en[Sensor must not expose GC behavior by pozdnyakov · Pull Request #338 · w3c/sensors]]
([TIME[2017-12-15 17:06:04 +09:00]])
<https://github.com/w3c/sensors/pull/338>

[124] [CITE@en[Permit freeing underlying source / sink / transformer after close · Issue #932 · whatwg/streams]]
([TIME[2018-07-04 21:48:49 +09:00]])
<https://github.com/whatwg/streams/issues/932>