首页 新闻 搜索 专区 学院

关于JVM内存结构的问题

0
悬赏园豆:10 [待解决问题]

我们都说JVM内存结构中,堆,方法区是线程共享的;java栈,本地方法栈,寄存器是线程私有的。

那么问题来了,在栈中也就是一个方法中创建的对象是存在栈中吗?根据我看到的资料,栈中只存放对象的引用,而对象放在堆中,这样的话,对栈来讲每个线程访问都会创建对象,而对象都放在堆中,那堆中的对象不就不一定是线程共享的了吗?

对方法内创建的对象而言,这是线程私有的,谁能回答我这个问题呢?是归类不严谨还是我理解有误?

老梁讲Java的主页 老梁讲Java | 初学一级 | 园豆:149
提问于:2019-09-05 11:25
< >
分享
所有回答(3)
0

你这里理解的共享跟私有有点不一样,java栈,本地方法栈,寄存器是线程私有的是指每个线程都会有一个独立的,生命周期随着线程的创建而创建,死亡而死亡。堆是共享的,不是说他里面的对象就是大家都可以随便访问,全部线程共享,只是说堆里面的内存是全部线程共享的。方法内创建的对象,还是存放在堆里面,调用对象都是通过对象的引用去访问对象。为什么能私有呢,就是因为它的引用只有在你该线程的栈中有。

魔力员 | 园豆:225 (菜鸟二级) | 2019-10-09 14:05
0

知道对象在堆中的地址,用unsafe可以只到拿这个对象也说不准。

你还未发现 | 园豆:178 (初学一级) | 2019-10-23 13:19
0

你应该是对对象的分配逻辑不是很清楚,这里我给你解释下:

看下图:
1.首先看是否满足栈分配的条件,如果满足则在栈上分配,在栈上分配对象要比在堆上分配对象快得多

2.如果栈分配条件不满足,则进入堆中,判断是否可以分配在TLAB上,TLAB 的全称是 Thread Local Allocation Buffer,JVM 默认给每个线程在 Eden 区中开辟一个 buffer 区域,默认占用 1%Eden 的空间,用来加速对象分配,这个道理和 Java 语言中的 ThreadLocal 类似,避免了对公共区的操作,以及一些锁竞争

3.如果没有在TLAB上分配,则判断该对象是否是大对象,如果是大对象则直接分配在老年代

4.以上三个条件都不满足,则分配在Eden区

希望以上的解答能帮助到你!

天门道人 | 园豆:249 (菜鸟二级) | 2020-10-09 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册