2016-12-08 10 views
0

C/C++でプログラミングを学んだので、Javascriptでのメモリ管理は決して直感的ではありません。Javascriptでのメモリ管理

私はすべての変数がスタックメモリではなくヒープメモリにあることを知っています。そのため、メモリ操作は非常に高価です。変数へのすべての参照にアクセスできない場合は、ガベージコレクトすることができますが、V8ではすぐにガベージコレクションが行われないように見えますか? (--trace_gcで観測)

グローバルアレイオブジェクトのメモリを解放するには、これはarray = nullで実行できます。array = []は同じ効果がありますか? (私はそれをクリアした後でも配列のように動作する変数が必要です)。

私の経験から、StringNumberは値によって関数に渡され、ObjectArrayは参照によって関数に渡されます。 Stringが非常に大きく、関数が実際に参照によって安全に渡すことができる場合(文字列の読み取りのみ)、V8はそのように最適化しますか?

ES6はブロックスコープの宣言にletキーワードを紹介しますが、letの単独使用は全体の機能が遅くなりますので、私はまだlet/const私は精通していますC/C++に近いにもかかわらずvarに固執します。 (d8をマスタブランチから構築してテストしましたが、V8開発者がこのバグに積極的に取り組んでいることを認識しています)。

Chrome DevToolsを使用してコードのメモリ管理を学習しようとしましたが、プロファイラのグラフやグラフが実際に意味するものを特定できませんでした。

+1

迷惑メールをしないでください。あなたの質問は、たとえあなたがそれをcompatisonとして使うとしても、C++とは何の関係もありません。 – StoryTeller

+1

JSのメモリをあまり心配する必要はありません。ブラウザで処理してください。 – Cerbrus

+0

私はあなたが時期尚早に最適化しようとしているかもしれないと聞きます。この場合に該当するかどうかを確認するには、こちらの便利なチャートを参照してください(https://xkcd.com/1691/)。 – vlaz

答えて

1

基本的には、自分のメモリと非常に技術的なものをたくさん管理したいときは、C++を実行します。

メモリを管理している仮想マシンがあるため、C#/ Javaを使いたくない場合は、

JavaScriptがブラウザのメモリを管理します。何千もの要素を含むページを読み込んだり、何千ものデータを表示/計算するライブラリを作成しない限り、メモリに問題はありません。

array = nullが既存の配列を逆参照する場合、array = []は新しい空の配列の参照に影響します。それはヌルなので、それを使用しようとするとうまくいきませんので、array=[]に行ってください。

まだ納得していない場合は、適切なライブラリを使用して作業してください。