深入理解java虚拟机---对象的创建过程(八)

  1.对象的创建过程

由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程.

 注意: 最后一步的init方法是代码块和构造方法.

以上是总图,下面分步骤详细讲解

A: 虚拟机为对象分配内存方式

  1. 指针碰撞: 堆内存规整时,这时就可以把其看做一半连续内存被占用,一半连续的内存空闲.所以当创建新对象时,从空闲的内存中分配空间给新对象

  2.空闲列表: 堆内存是不连续的,这就需要虚拟机维护一个内存列表,用于记录当前内存是否被占用,当新创建对象时,查询这个表看哪里有空闲并分配给新对象占用,所以这种方式就叫做空闲列表

虚拟机选择哪种内存分配方式主要看堆内存是否规整.堆内存是否规整则是有垃圾回收器策略确定.当垃圾回收器策略可以实现将堆内存清理的很规整,那么虚拟机就使用指针碰撞方式,否则使用空闲列表方式

B:线程安全问题

在高并发时,同时堆内存创建多个对象.当空闲列表中一个空闲内存分配给其中一个对象,但是还没来得及更新空闲列表.这时新的对象进来也被分配相同的内存空间.那么就会产生线程安全问题.

解决方式:

  A: 使用线程同步(加锁),一个线程进来,加锁.不让第二个线程进来

  B; 本地线程分配缓存: 将堆内存为每个线程分配单独的区域,即每个线程操作各自的区域,各不影响.

C:初始化对象

 任何对象创建后,都有会初始化值.此步骤后对象已经在堆中存在

D: 执行构造方法

构造方法为对象中的属性赋值.

原文地址:https://www.cnblogs.com/zhulibin2012/p/8988104.html