RecoilのSSRメモリリークを追う
このissueを見守りつつ、対応をちょっと追ってみる
現時点で未解消なので長期になりそうなので、備忘録issueが立ったのは2年前で、その間にGC相当な機能の実装は進んでた模様。
recoil_memory_management_2020
というfeature flag(内部的にはGKs
=GateKeeperと呼ばれるもの)で管理されてて、デフォルトで有効になってそう。
つまり、不要なものの解放処理は走ってるけど未解消っぽい。
参考
GKs
についてはCHANGELOGみてる感じ多分GateKeeper
GKs
をRecoilEnv
から設定できるようにするPR
↑についてドキュメント更新されるのか聞いてみた
ついでにtypo修正
レンダリング最適化のためにバッチ処理にしてる関係で、いつでも不要なものを解放して良いわけじゃなさそう
と思ったら、この分岐絶対入らなそうなのでissue
garbage collection is enabled but not used.
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 の返事を待つ。
だいぶ分かってきた気がする。
atomFamily作成時に↓に解放処理が登録されてって
↓を呼び出してGKにrecoil_memory_management_2020
が有効になってれば↑に基づいてメモリ解放処理がされていく。
↑自体はendBatch
とかで呼ばれる、ただendBatch
は現状初回レンダリングしか呼ばれてなさそうに見える。(endBatchっていうからレンダリングのバッチ処理の毎回最後に呼ばれるのかと思ってた)
つまり、ある程度メモリ解放の仕組みはあるけど定期的な監査がまだ実装されてない感じ...なのかな?
retainedBy_UNSTABLE: 'components'
を指定することでlife timeを指定できる
ドキュメントも見つからないしとりあえずやってみたけどエラーなったからissue立てた
とりあえず聞いてみる