首页 > 其他 > 详细

JVM——对象创建

时间:2020-04-22 09:50:09      阅读:55      评论:0      收藏:0      [点我收藏+]

以HotSpot虚拟机为例

当虚拟机遇到一条字节码new指令时,

① 检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析、初始化过,如果没有,需要先执行类加载过程。

② 类加载之后,虚拟机会为新生对象分配内存。对象所需内存的大小在类加载完成后便可以完全确定。分配内存即从Java堆中划分一块固定大小的内存。

Java堆内存分配管理采用操作系统中的内存连续分配(“指针碰撞”)+“空闲表法”(管理空闲内存的方法之一)。

由于创建对象是非常频繁的现象,无论上述两种内存分配,都是修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能导致创建两个对象占用到了同一块内存

解决方案:

  • 通过CAS失败重试的方法保证内存分配时的原子性
  • 不同线程:给每个线程预先分配一小块内存TLAB,将线程创建对象时分配的内存,进行了内存隔离,当TLAB用完后,再分配新的TLAB时再采用CAS保证原子性。

虚拟机是否使用TLAB,可通过-XX:+/-UseTLAB参数来设定

③ 内存分配完成后会将内存空间初始化为零值,这大概也是实例变量具有默认值原因吧。

④ 

JVM——对象创建

原文:https://www.cnblogs.com/wqff-biubiu/p/12749358.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!