Web アプリケーションの 1 つでメモリの問題に取り組んでいます。Chrome のヒープ プロファイラーを使用しています。この情報に基づいて仮定を行っているため、何かを非常に明確に理解していることを確認したいと思います。
上記@
のヒープ プロファイルのスクリーンショットのシンボル。明確に理解していることを確認したい: 等しいオブジェクト ID は同じオブジェクトを意味する
a.objectId == b.objectId implies a same as b
a.objectId == b.objectId implies NOT a same as b
したがって、実際には同じものであると予想していた 2 つのオブジェクトがあり、それらのオブジェクト ID が異なる場合、これは予期しないコピーが発生したことを意味しますか? これは、コード内で不要な重複を作成している可能性がある場所を特定できることを意味しますか?
ドキュメントはこれを言っているように見えますが、それが何を表すかではなく、なぜオブジェクト ID を持っているのかを明確に述べているわけではありません。
これはオブジェクト ID です。オブジェクトはガベージ コレクション中に移動されるため、オブジェクトのアドレスを表示しても意味がありません。これらのオブジェクト ID は実際の ID です。つまり、作成された複数のスナップショット間で保持され、一意です。これにより、ヒープの状態を正確に比較できます。これらの ID を維持すると、GC サイクルにオーバーヘッドが追加されますが、最初のヒープ スナップショットが作成された後にのみ開始されます。ヒープ プロファイルが使用されていない場合、オーバーヘッドは発生しません。
わかりました。しかし、これを私の C プログラマーの頭に戻す必要があります。ネイティブ ヒープを使用しても、ポインターの値は時間の経過とともに変化する可能性があることに気付きました。オブジェクト ID を時間の経過とともに一意のポインター アドレスとして効果的に扱うことはできますか?