数日前に、「揮発性」というキーワードをどのように使用するかを尋ねる質問を投げかけ、答えを得ました。ここで、私を助けてくれた人々に改めて感謝したいと思います。しかし、JMM について新たな疑問が頭に浮かびました。それは現在、メイン メモリとスレッド独自の個別のキャッシュ メモリがあることを知っています (それらには、より専門的な用語があるかもしれません)。今、スレッド キャッシュ メモリに格納されているものを知りたいです。共有オブジェクト参照のコピー (オブジェクト アドレスのコピー) または共有オブジェクトのコピー? たとえば、オブジェクト B b = new B(); を宣言します。b が 2 つのスレッドからアクセスできる場合、b がスレッドによってアクセスされるとき、オブジェクト参照b はコピーされてスレッド独自のキャッシュ メモリに格納されますか、それともb が指すオブジェクトがコピーされてスレッド独自のキャッシュ メモリに格納されますか? ありがとう。
3 に答える
複数のスレッドによってアクセスされるものはすべて、「スレッドキャッシュ」にある可能性があります。これには、参照がオブジェクトの一部である場合が含まれます。スタック上にあり、他のスレッドからアクセスできないため、ローカル変数に保持されている参照は含まれません。
したがって、答えは本当に「両方」です。
変数b
は、ヒープに格納されているオブジェクトへの参照です。
通常、参照がいつ、どこに保存されるかを知る必要はありません。メモリは単なる 2 層ではなく、それよりもはるかに複雑です。上から下まであなたが持っています。
registers
L1 cache
L2 cache
L3 cache
local main memory
nonlocal main memory
swap space.
ローカル メイン メモリは、CPU に対してローカルなメモリです。別の CPU に対してローカルなメモリを持つことができます。だから実行する
B b = new B();
通常、TLAB (スレッド ローカル アロケーション バッファー) から取得されるメモリを割り当てる必要があります。このメモリ空間は通常、L1 からローカル メイン メモリまでのどこかにあります。すべてのレベルでコピーが存在する可能性があります。ただし、ローカル変数に割り当てることができるように、参照はレジスターにある必要があります。スタックとメモリに保存される場合と保存されない場合があります。
CPUの中でも「レジスタ」は広いカテゴリーです。CPU がメモリにアクセスして書き込む方法は、パフォーマンスに大きな影響を与える可能性があるため、驚くほど複雑なトピックになる可能性があります。