1.对象的创建过程
由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程.
注意: 最后一步的init方法是代码块和构造方法.
以上是总图,下面分步骤详细讲解
A: 虚拟机为对象分配内存方式
1. 指针碰撞: 堆内存规整时,这时就可以把其看做一半连续内存被占用,一半连续的内存空闲.所以当创建新对象时,从空闲的内存中分配空间给新对象
2.空闲列表: 堆内存是不连续的,这就需要虚拟机维护一个内存列表,用于记录当前内存是否被占用,当新创建对象时,查询这个表看哪里有空闲并分配给新对象占用,所以这种方式就叫做空闲列表
虚拟机选择哪种内存分配方式主要看堆内存是否规整.堆内存是否规整则是有垃圾回收器策略确定.当垃圾回收器策略可以实现将堆内存清理的很规整,那么虚拟机就使用指针碰撞方式,否则使用空闲列表方式
B:线程安全问题
在高并发时,同时堆内存创建多个对象.当空闲列表中一个空闲内存分配给其中一个对象,但是还没来得及更新空闲列表.这时新的对象进来也被分配相同的内存空间.那么就会产生线程安全问题.
解决方式:
A: 使用线程同步(加锁),一个线程进来,加锁.不让第二个线程进来
B; 本地线程分配缓存: 将堆内存为每个线程分配单独的区域,即每个线程操作各自的区域,各不影响.
C:初始化对象
任何对象创建后,都有会初始化值.此步骤后对象已经在堆中存在
D: 执行构造方法
构造方法为对象中的属性赋值.
原文地址:https://www.cnblogs.com/zhulibin2012/p/8988104.html
时间: 2024-11-10 00:04:53