2017-05-24 12 views
2

コンポーネントが取り外されたときにReactコンポーネントの状態がガベージコレクションされず、メモリリークが発生します。 macOS SierraでChrome 10.12.5でreact @ 15.5.4を使用しています。コンポーネントの状態のメモリリークが発生しました

のように状態をcomponentDidMountに設定しています。メモリリークを確認するために

、私は私のcomponentDidMountに以下を追加しました:

let arr = new Uint8Array(1024 * 1024 * 30); 
this.setState({ 
    test: arr 
}); 

をし、ヒープに割り当てUint8Arrayの30メガバイトを確認するために、ヒープのスナップショットを取りました。

次に、コンポーネントがconsole.logでマウント解除されることを確認しました。componentWillUnmountです。

後でヒープスナップショットをとると、ガベージコレクションのための十分な時間が経過しても、Uint8Arrayがヒープに残ります。

この問題のデバッグを開始する場所についてのご意見はありますか?またはソースコードからの任意の観測?

+0

コンポーネントがDOMから削除されても、コンポーネントおよびその状態を表す実際のJSオブジェクトが削除されない場合があります。おそらくリアクションはそれを後で再利用するためにキャッシュしますか? Reactでバグを起こすことは価値があるかもしれません。 –

+0

私はあなたが 'windowを呼んでいることをあなたが投稿したgithub link(https://github.com/dgraph-io/dgraph/blob/master/dashboard/src/containers/GraphContainer.js#L61)に見ました。 addEventListener 'を呼び出す。そのイベントリスナーも削除していますか? [それはメモリリークを引き起こす可能性があります。](https://developer.mozilla.org/en-US/docs/Extensions/Common_causes_of_memory_leaks_in_extensions#Failing_to_clean_up_event_listeners)私はちょうどあなたの問題を見ていましたので、私は完全にオフになっている場合、私は謝罪します。 –

+0

@RicoKhler私は[そのリスナーを削除する](https://github.com/dgraph-io/dgraph/blob/master/dashboard/src/containers/GraphContainer.js#L73)です。私は別の問題だと思っています。手元にある問題は、状態オブジェクトがガベージコレクションされていないからです。 –

答えて

0

私の理解では、componentWillUnmountはクラスデストラクタとして機能すると期待していますが、Reactコンポーネントライフサイクルは異なる方法で動作すると思います。

状態のようなオブジェクトのプロパティは、一般にクラスコンストラクタに含まれていますが、componentWillMount/componentDidMountcomponentWillUnmountは同じオブジェクトで単純に機能します。

コンポーネントがDOMに存在しなくなっても、そのコンポーネントがガベージコレクションされているわけではありません。同じオブジェクトが再マウントされた場合に使用されます。

stateは、あなたにとって意味がある場合は、おそらくcomponentWillUnmountで空白にすることができます。この場合、GCはメモリを回復すると思います。

関連する問題