JVM——对象创建

以HotSpot虚拟机为例

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

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

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

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

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

解决方案:

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

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

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

④ 

猜你喜欢

转载自www.cnblogs.com/wqff-biubiu/p/12749358.html