Open6

RecoilのSSRメモリリークを追う

akfm_satoakfm_sato

issueが立ったのは2年前で、その間にGC相当な機能の実装は進んでた模様。
recoil_memory_management_2020というfeature flag(内部的にはGKs=GateKeeperと呼ばれるもの)で管理されてて、デフォルトで有効になってそう。
つまり、不要なものの解放処理は走ってるけど未解消っぽい。

参考

GKsについてはCHANGELOGみてる感じ多分GateKeeper
https://github.com/facebookexperimental/Recoil/blob/main/CHANGELOG-recoil.md

GKsRecoilEnvから設定できるようにするPR
https://github.com/facebookexperimental/Recoil/pull/2078

↑についてドキュメント更新されるのか聞いてみた
https://github.com/facebookexperimental/Recoil/issues/2141

ついでにtypo修正
https://github.com/facebookexperimental/Recoil/pull/2140

akfm_satoakfm_sato

https://github.com/facebookexperimental/Recoil/pull/1589

garbage collection is enabled but not used.

https://github.com/facebookexperimental/Recoil/pull/2143

but the actual selectors/atoms in a family are not yet enabled to be garbage collected.

GCは有効になってるがnot usedって言ってる。
GK的には有効になってそうだし、実際の処理みててもatomsやselectorのdelete処理入りそうに見えるんだけどなぁ。。。
GC入ったというリリースノートもないし、でも実装みてるとなんか入りそうに見えてちょっとわからずじまい。

#2142 の返事を待つ。

akfm_satoakfm_sato

だいぶ分かってきた気がする。
atomFamily作成時に↓に解放処理が登録されてって
https://github.com/facebookexperimental/Recoil/blob/main/packages/recoil/core/Recoil_Node.js#L163
↓を呼び出してGKにrecoil_memory_management_2020が有効になってれば↑に基づいてメモリ解放処理がされていく。
https://github.com/facebookexperimental/Recoil/blob/main/packages/recoil/core/Recoil_Retention.js#L284
↑自体はendBatchとかで呼ばれる、ただendBatchは現状初回レンダリングしか呼ばれてなさそうに見える。(endBatchっていうからレンダリングのバッチ処理の毎回最後に呼ばれるのかと思ってた)

つまり、ある程度メモリ解放の仕組みはあるけど定期的な監査がまだ実装されてない感じ...なのかな?

akfm_satoakfm_sato

retainedBy_UNSTABLE: 'components'を指定することでlife timeを指定できる
https://github.com/facebookexperimental/Recoil/blob/main/packages/recoil/recoil_values/Recoil_atom.js#L161

ドキュメントも見つからないしとりあえずやってみたけどエラーなったからissue立てた
https://github.com/facebookexperimental/Recoil/issues/2144
アンマウント後は再生成されるイメージだったけど、解釈が違ってるのかも?
とりあえず聞いてみる