首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Java内存模型的一个问题

关于Java内存模型的一个问题
EN

Stack Overflow用户
提问于 2011-05-03 03:57:18
回答 2查看 554关注 0票数 0

几天前,我提出了一个问题,询问如何使用关键字“易失性”,我得到了答案。在这里,我想再次感谢那些帮助我的人。然而,关于JMM,我脑海中出现了一个新的问题:目前我知道有主内存和线程拥有单独的缓存内存(也许它们有更专业的术语),现在我想知道什么存储在线程缓存内存中,共享对象引用的副本(对象地址的副本)还是共享对象的副本?例如,我声明一个对象b=新的B();而b可以由两个线程访问,那么当b被线程访问时,对象是引用b被复制并存储在线程自己的缓存内存中,还是b指向的对象被复制并存储在线程本身的缓存内存中?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-03 04:43:44

被多个线程访问的任何东西都可能在“线程缓存”中。如果引用是对象的一部分,则包括引用。它不包括保存在局部变量中的引用,因为它们位于堆栈上,不能从其他线程访问。

所以答案是“两者兼而有之”。

票数 3
EN

Stack Overflow用户

发布于 2011-05-03 07:33:08

通常,您不需要知道何时或何处存储引用。记忆不仅仅是两层,它要复杂得多。从上到下都有。

代码语言:javascript
复制
registers
L1 cache
L2 cache
L3 cache
local main memory
nonlocal main memory
swap space.

本地主存是CPU的本地内存。您可以将内存定位到另一个CPU。所以要表演

代码语言:javascript
复制
B b = new B();

它必须分配一些内存,这些内存通常来自TLAB (线程本地分配缓冲区),这个内存空间通常位于L1到本地主内存之间。所有级别都可以有副本。但是,引用必须在寄存器中,这样才能将其赋值给局部变量。它可能保存到堆栈中,也可能保存到内存中,或者不保存。

即使在CPU内部,“寄存器”也是一个广泛的类别。CPU如何访问和写入内存可能是一个令人惊讶的复杂主题,因为它会对性能产生重大影响。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5864850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档