深入理解java中创建的对象
java中对象的创建方法
- 使用new关键字(也是大家平时最常用的)
- Class类的newInstance方法
- clone
- 反序列化。
等方式
java中创建对象的具体步骤以及细节
1.当java虚拟机遇到一条new指令的时候,首先会去检查这个指令的参数是否能在常量池中找到一个类的符号引用,并且检查这个符号引用所代表的类是否加载,解析,初始化等过程。若没有,则进行上诉过程。
-
为对象分配内存(两种方式) . List item (1) 如果内存规整------指针碰撞 何为指针碰撞?画个图自然就理解了:由图可知,s3 为新创建的对象,由于内存是规整分配的,所以当新来得s3 对象需要内存空间的时候,只需要将指针p往后移动即可为s3 分配相对应的内存。
-
(2)如果内存不规整-----空闲列表
- 何为空闲列表?顾名思义就是java虚拟机在后台维护了一个列表,表中记录了哪些内存地址是空闲的,哪些内存地址是占用的,当有新来得对象需要空间时,就可以查询空闲列表得知那块内存空间是空闲的然后为该新来得对象分配空间。
3.处理并发问题,由于在java虚拟机中创建对象时非常频繁的,当你仅仅修改一个指针时,这种在并发情况下是很不安全的。于是jvm提供了两种方式解决并发问题。 (1):采用CAS配上失败重试来保证更新操作的原子性。 何为CAS? CAS是靠硬件实现的,是一条cpu指令,基于汇编指令。 CAS是Compare-and-swap的缩写,意思为:比较并交换。 要理解CAS,首先得知道CAS中包含了三个操作数即: 内存值(V),预期原值(A),新值(B)。 来谈一谈 CAS的工作原理: 当预期原值A与内存值V相同时,将内存值修改为新值B,并返回true,否则什么都不做并且返回false当CAS指令执行时,当且仅当内存值V等于预期原值A时,才会将V的值设为新值B。所以在多线程情况下,当多个线程同时使用CAS操作一个变量时,只会有一个会成功,并更新值,其余线程均会失败,但失败的线程不会被挂起,而是不断地再次循环重试。 (2):为每个线程预生成一个TLAB。
何为TLAB?画个图自然清楚。 4.初始化分配到的空间。 所有属性设置默认值,保证对象实例字段在不赋值时也可以直接使用。 5.设置对象的对象头 何为对象头?对象头中包含了什么?画个图自然清楚。 6.执行init()方法进行初始化。(显式初始化,代码块构造器中初始化)
**经过上面6个步骤,对象即可被创建,期中一些细节问题可能还理解不是很到位,若有不足之处欢迎大家评论一起交流关于对象创建的一些细节**
|