はじめに
株式会社エアークローゼットでエンジニアをしているtangoと申します。
この記事はエアークローゼット アドベントカレンダー2022の19日目の記事になります。
今回はJavascriptでメモリ管理について話したいと思いますので、ぜひ最後までご覧ください。
背景
みんなさん、C言語を触ったことがありますか?
C言語を触ったことがある人にとってはわかると思いますが、大体3ステップを分けています。
① 必要なメモリを割り当てる
② 割り当てられたメモリを使用する
③ メモリを解放する
ここでのポイントは、 手動でメモリを解放するというところです。 結構めんどくさいのところですね。
もちろん、メモリを解放しなくても大丈夫ですが、そのプログラムプログラム内で確保したメモリがどんどん増えていきます。
言い換えると、他のプログラムが使用できるメモリがどんどん減ることになります。
では、Javascriptではどのようにメモリ管理が行われるでしょうか?
答えは、メモリが不要になった時に自動的に解放してくれます。このプロセスが、ガベージコレクション(GC)と呼んでいます。
しかしプログラムの書き方によっては、確保したメモリがGCによって開放されずにメモリが肥大化し、内部処理を圧迫していくことになります。
ガベージコレクション(GC)
Javascriptは2つのデータを持ってます。
① プリミティブ型
② 参照型
・プリミティブ型(string, int, boolean)は気にしなくても自動的にメモリを解放されます。
・参照型(ojbect, array)は自動的に解放されないケースがありますので、注意が必要です。
ガベージコレクションが実行するたびに、プログラム全体が中断されるため、ガベージコレクションの頻度が高くなると、
パフォーマンスに影響を与える可能性がある。
ガベージコレクションは2つの主要なアルゴリズムを使用して、不要な参照と達成不能コード、参照カウントとマークアンドスイープを検索します。
参照カウント
・参照のないオブジェクトを探します。
・オブジェクトを指す参照がゼロの場合は、オブジェクトを解放できる。
変数user
はオブジェクト{name: “Alex”}
を参照してます。
user = null
をセットすると、参照がなくなる。
オブジェクト Alex は到達不能になりました。ガベージコレクタはデータを捨て、メモリを解放します。
2つの参照
user
の参照をadmin
にコピーします。
user = null
をセットしても、オブジェクトはadmin経由で達成可能なため、解放できない。
admin = null
をセットしたら、オブジェクトが達成不能になり、解放できるようになります。
循環参照
person, employee = null
をセットしても、
循環参照を持っているため、これらのオブジェクトを解放できない
サマリ
・ガベージコレクションは自動で実行される。実行を制御したり、防ぐことができない
・オブジェクトは達成可能な場合はメモリ上に保持される
・オブジェクトへの参照がなくなった場合は、自動的にメモリを解放される
あとがき
最後までご覧いただきありがとうございました。
エアークローゼット Advent Calendar 2022はまだ続きますので、興味あれば、ぜひ他のエンジニア、PMの記事もご覧いただければと思います。