/
45.txt
450 lines (334 loc) · 30.1 KB
/
45.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
[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>
- [38] [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/#message-ports>
- [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] 具体的な方法は規定されていません。実装は任意の方法を選択できます。
[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]] は「[[弱参照]]」という用語を使っていません。)]]
* 弱集合
@@
[70] [[環境設定群オブジェクト]]の[F[[[未決拒絶された約束弱集合]]]]は、
そのメンバーに対して[[強参照]]を作っては[['''ならない''']] [SRC[>>36]]
と規定されています。
* 暗示強参照
[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]]
[41] [CODE(DOMi)@en[[[MessagePort]]]] が [[entangle]] されると、
その [CODE(DOMi)@en[[[MessagePort]]]] と [[entangle]] された [CODE(DOMi)@en[[[MessagePort]]]]
が最初の [CODE(DOMi)@en[[[MessagePort]]]] への[[強参照]]を持つか、
または最初の [CODE(DOMi)@en[[[MessagePort]]]] の[[所有者]]が
最初の [CODE(DOMi)@en[[[MessagePort]]]] への[[強参照]]を持つかのいずれかであるかのように扱われなければ[['''なりません''']]。
従って [CODE(DOMi)@en[[[MessagePort]]]] を受け取って[[事象聴取器]]を登録してからその
[CODE(DOMi)@en[[[MessagePort]]]] への明示的な参照を捨てたとしても、
その[[事象聴取器]]が[[メッセージ]]を受信できる限りにおいて[[通信路]]は維持されることになります。
もちろん[[通信路]]の両端で同様に参照が破棄された場合にはいずれの側も[[アプリケーション]]から到達できなくなりますから、
両 [CODE(DOMi)@en[[[MessagePort]]]] を[[ごみ収集]]することができます。
[SRC[>>38]]
[42] [CODE(DOMi)@en[[[MessagePort]]]] は、当該[[オブジェクト]]で [[dispatch]]
されることになる[[メッセージ]]が[[タスク源]]に存在する間、
あるいは[[ポート・メッセージ・キュー]]が開いていて [CODE(DOMe)@en[[[message]]]]
[[事象]]が存在している場合には、[[ごみ収集]]しては[['''なりません''']]。 [SRC[>>38]]
[81] [CODE(DOMi)@en[[[MessagePort]]]] の一端が失われた場合に他方に通知する方法も検討されたものの、
[[ごみ収集]]の挙動を[[スクリプト]]から観測できず、[[メモリーリーク]]もさせず、
[[bfcache]] も実装可能であるような手法が見つからず、議論がまとまりませんでした。
[39] [CODE(DOMi)@en[[[PortCollection]]]] は [CODE(DOMi)@en[[[MessagePort]]]]
を零個以上保有することができる[[オブジェクト]]ですが、[[強参照]]ではないので
[CODE(DOMi)@en[[[MessagePort]]]] の[[ごみ収集]]を防ぐ役割は持たず、
[[ごみ収集]]された [CODE(DOMi)@en[[[MessagePort]]]] は削除されていきます。
[SRC[>>38]]
;; [80] [CODE(DOMi)@en[[[PortCollection]]]] は実装されない可能性があります。
[43] [CODE(DOMi)@en[[[MessagePort]]]] が不要になったら、明示的に閉じて [[disentangle]]
することが[RUBYB[強く勧められています]@en[strongly encouraged]]。
明示的に閉じずないと必ずしも即座に[[ごみ収集]]されるとは限らないため、
[[メモリー]]を無駄にすることとなります。 [SRC[>>38]]
** 歴史
[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>
]REFS]
* 画像
[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]
* メモ
[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>