メモリ管理
メモリ:操作可能な空間の一部を表す、読み書き可能なセルで構成。管理:スペースの一部を要求し、使用し、解放するための人間の介入。メモリ管理:開発者が率先してスペースの要求、使用、解放を行うこと。管理プロセス:要求-使用-解放
//
let obj = {}
//
obj.namee = 'lg'
//
obj = null
javaScript のゴミ収集
javaScriptのメモリー管理は自動的 オブジェクトは参照されなくなったらゴミ オブジェクトはルートからアクセスできなくなったらゴミ
let obj = {name: 'xm'}; // メモリ・ブロックのクレームと変数の宣言を同時に行う
let ali = obj; // メモリアドレスをaliに指す;
obj = null; // objをnullに向ける; しかし、あなたはaliでメモリをオープンし、それを参照しただけだ。
GCアルゴリズムとは
- GCは、ゴミ収集が特定のタスクを達成する仕組み
- 仕事は、スペースを空けるためにゴミを見つけ、スペースを取り戻すことです。
- アルゴリズムとは、職場で発見し、リサイクルするために従うルールのことです。
- 参照カウント
- マーカーの削除
- タグ付けと照合
- 世代リサイクル 参照カウント:外部からの参照があると1加算され、外部からの参照が1減ると1減算されます。カウンターがゼロになると、ゴミ収集がそれを処分します。参照カウントアルゴリズムの利点
- ゴミを発見したら即リサイクル
- プログラムの一時停止を最小限に抑えます。参照カウント・アルゴリズムの欠点:
- 循環参照されたオブジェクトを再利用できません
- マーク・アンド・クリア:核となる考え方:マーク・アンド・クリアを2段階で。マークされたオブジェクトを見つけるためにすべてのオブジェクトを反復処理 マークされていないオブジェクトをクリアするためにすべてのオブジェクトを反復処理 対応するスペースを取り戻します。
最初の走査:アクティブなオブジェクトへのすべての参照をマークします。2回目の走査:すべてのオブジェクトを走査し、マークされていないものを削除します。最後に、対応する領域が確保されます。
マーカー照合アルゴリズム:マーカーアルゴリズムと同じですが、後で最適化されます。マークありとマークなしを区別。次のリファレンスのタイミング。リファレンスを最大化可能。
V8ガベージコレクション戦略
- 世代間リサイクルという考え方が使われています。
- 記憶は新世代と旧世代に分かれます。
- オブジェクトによって異なるアルゴリズムが使用されます。よく使われるGCアルゴリズム
- 代替リサイクル
- 空間コピー
- マスキング
- タグ付けと照合
- マスキング
V8が新世代オブジェクトをリサイクルする方法
V8 メモリ割り当て
- V8メモリを2つに分割
- 新世代オブジェクトを格納するための小さなスペース
- 新生代は、比較的短い期間存続するオブジェクトを指します 新生代のオブジェクトのリサイクルの実装
- 複製アルゴリズム+マーキング照合を使用したリサイクルプロセス
- 新世代のメモリは、2つの同じサイズのスペースに分割されています。
- 使用済みスペースはFrom空きスペースはTo
- アクティブオブジェクトはFromスペースに格納されます。
- 照合順序をマークし、アクティブなオブジェクトをToにコピーします。
- リリース完了までのスワップ・スペース
リサイクルの詳細
- コピー中に昇進の可能性
- プロモーションとは、新世代のモノが旧世代のモノに移動すること
- GCで生き残った新世代の登用が必要
- TOスペースの使用率が25%を超えました
高齢者世代のターゲット・グループの説明
- 旧世代のオブジェクトは右側の旧世代エリアに格納されます
- 64ビットOS 1.4G 32 OS 700M
- 古いものというのは、より長い年月を経たものです。
高年齢オブジェクト回復の実装
- マーカー除去、マーカー照合、インクリメンタルマーキングアルゴリズムが主に使用されます。
- マーク除去でゴミスペースを再生します。
- マーカー照合による空間最適化
- インクリメンタルマーキングによる効率の最適化
詳細な比較
- NWS地域廃棄物リサイクル、スペースを時間に利用
- 旧世代の地域ゴミ収集は、複製アルゴリズムには不向き
ゴミ収集を最適化するマーキング方法
マーカーを使ったクリアでは、マークするオブジェクトをトラバースする必要があります。マーカーとは、マークすべき参照を持つオブジェクトのことです。最初のうちは、基本的にすべてが参照されます。そのため、マーク・インクリメントを使用します。つまり、コードがセクションを実行するときです。コードが実行し終わると、それもマークされます。コードが実行し終わると、マークも終了します。もう一度すべてのオブジェクトをループして、クリアを終了します。
パフォーマンスツール
記憶障害の発現
- ページの読み込みが遅かったり、頻繁に一時停止したりします。
- ページのパフォーマンスが一貫して低い
- ページのパフォーマンスは時間とともに悪化しています。
記憶障害の定義基準
- メモリリーク:増加し続けるメモリ使用量
- メモリの肥大化:ほとんどのデバイスでパフォーマンスの問題
- 頻繁なガベージコレクション:メモリ変化グラフによる分析
メモリを監視するいくつかの方法
- ブラウザタスクマネージャ
- タイムラインの記録
- ヒープスナップショットルックアップでDOMを分離
- ゴミの収集が頻繁に行われているかどうか
頻繁なゴミ収集が決定される理由
- GC作業は、対応するプログラムが停止されます。
- 頻繁に、そして過度に長いGCは、アプリがクラッシュする原因となります。
- ユーザーが感じるアプリの遅延
- タイムラインの頻繁な上昇と下降
- タスクマネージャーでデータが頻繁に増減
Performance
- パフォーマンス利用フロー
- 記憶障害に関する分析
- パフォーマンス・タイミング・モニター メモリの変更
- タスクマネージャーが変更を監視
- ヒープ・ブロック・ルックアップ分離 DOM
コードの最適化
グローバル変数のキャッシュがパフォーマンスを向上
閉鎖の落とし穴を避けるために
クロージャによってキャッシュされた変数。しかし、その変数は外部で破棄されました。クロージャはまだその変数への参照を持っており、ゴミ収集メカニズムはその変数を再要求しません。これはメモリリークにつながります。
を使用したプロパティアクセスメソッドは避けてください。
- jsが必要としないメソッドにアクセスし、すべてのプロパティは外部から見ることができます。
- コンストラクタの属性がメソッドにアクセスする方法は、プロトタイプを使うよりも実行速度が遅くなります。