JAVA对象创建基础知识

一、 对象的创建过程

JAVA对象创建基础知识
具体步骤:
(1) 申请内存。
(2) 成员变量赋默认值。
(3) 调用构造方法,成员变量赋初始值。
(4) 建立关系(把栈空间的引用 t 和new 出来在堆里面的对象建立关联)

二、对象怎么分配?(栈上-线程本地-Eden区-Old区)
JAVA对象创建基础知识
**注:TLAB(Thread Local allocation buffer)线程本地分配缓冲:**默认大小1%,可以调大小。分配不下会再分到Eden区。Eden区给每个线程分配一块私有的内存空间,不需要跟其他线程抢资源,也就不需要做线程同步。
线程安全
在对象创建的时候,分配内存时可能出现并发问题。正在给对象A分配内存,指针还没修改,对象B又同时使用原来指针分配内存。
解决方案有两种:
1.对分配空间的动作进行同步处理。
2.把内存分配动作按照线程划分在不同的空间中进行。假如有两个线程都在创建对象,那就让每个线程在java堆中预先分配一块内存,称为本地线程分配缓冲(TLAB),哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时才需要同步。

三、对象怎么定位
(1)句柄方式访问(间接寻址):Java堆中划分出一块内存来当做句柄池。有了句柄,reference存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。(实例数据可以理解为对象的数据,类型数据可以理解为class相关数据))
JAVA对象创建基础知识
(2)直接指针访问:reference中存储的直接就是对象地址。
JAVA对象创建基础知识
两种方式的区别:
(1)句柄方式
优点:GC回收起来更为方便,因为移动对象时,只会改变句柄中的实例数据指针,而reference本身不需要修改。
缺点:两次访问
(2)直接指针访问
优点:直接访问,速度更加快,它节省了一次指针定位的时间开销。
缺点:GC需要移动对象时比较麻烦。

四、Object o = new Object()在内存中占多少字节?
16个字节。
开启普通对象指针压缩(oops)o占4个字节,不开启占8个字节。32G内存以上开启不开启都占8个字节

JAVA对象创建基础知识

相关解释可以看这哥们儿的笔记添加链接描述

注:内容来自观看马老师视频做的笔记