创建过程可以分为几步:分配内存空间,初始化
分配空间
这里讨论的对象创建是指通过new 创建普通java对象(不包括数组和Class对象)。
对象的创建无非就是一个在堆中,为对象分配内存的过程。
这个过程我们需要关注几个问题:
1.目前堆中能否放下
2.放得下的话怎么放
3.对象用完了,内存怎么回收
4.所有线程都在堆中创建对象,存在并发问题。
逐个对问题进行解释:
1.如何确定目前堆中有空间可以放下new出来的对象。
-
目前堆中还有多少空间如何计算;两种实现方式:内存指针的管理方式,有两种:a.指针碰撞法:如果内存被规整的分为两块,一块是使用过的内存,一块是没使用过的内存,那么指针只需要指向分界线的位置,就可以方便的计算目前的内存使用情况。但是这需要比较苛刻的条件。要求垃圾回收器必须在回收的时候将内存重新整理成连续的区域。b.碰撞列表:顺利成章的a方式不行那么需要记录每个空闲区域。在有新的对象的时候,在表中寻找能够放下对象的区域。然后再更新表。
-
new出来的对象需要多少空间?类在加载完成后,即可知晓创建新对象时需要的空间大小。
2.放得下的话怎么放:1中已经做了解释。
3.GC相关
4.jvm采用CAS+失败重试的方式保证更新操作的原子性。
初始化
内存分配完成后,jvm会将分配到的空间内的变量都赋初始值。为了能够让int等基本类型可以直接被访问。
接下来还需要进一步对对象头进行设置。例如,该对象的类型class文件地址,对象的hashcode,GC分带的年龄等。
另外,对于jvm来讲new的对象已经生成了,但是对于java程序来件仍然有一步执行构造方法,这个对象才算真正的创造完毕。构造函数在Class文件中的<init>()方法中。在字节码中new后面会紧跟着一条<init>()方法,按照程序员的意愿对对象进行初始化。
小结:
主要是对对象的创建过程进行一个笼统的解释和阐述。对象创建主要就两部分:分配内存空间和初始化。分配内存空间,根据jvm虚拟机的内存管理不同实现方式也不同。初始化的步骤主要为:1.内存空间初始化为0。2.初始化对象头。3.程序员通过构造函数进行类的初始化。
这一小节书中比较长,讲的很笼统,不够具体。如果每个地方都解释的比较详细的话会导致篇幅过长,所以涉及详细的设计原理和实现过程到相应的章节再具体介绍和理解。
最近思绪比较混乱,所以今天看的比较少。