深入java----java内存区域及对象的创建
看完深入理解jvm之后自己再用图的方式进行一遍梳理,用以加深理解。
第一部分,首先对整体java运行时内存区域有一个整体框架式的了解。
运行时内存区域的划分如上图所示,那么接下里看看一个对象的创建又怎么样的过程。
首先是需要一块内存区域,而寻找内存区域主要分为两种策略:
- 指针碰撞,当空闲内存区域为连续区域时,那么只需要将空指针移动一段与对象大小相等的距离即可。
- 空闲列表,当空闲内存区域不连续时,需要维护一个表来记录那些内存可用,并在分配时给对象分配一个足够大的空间并更新表。
(注:内存区域是否连续主要和垃圾回收策略相关)
在上面的过程中,对象的大小如何确定呢?这就涉及对象在内存中的存储形式是什么了。
一个java对象在内存中的结构分三块:
- 对象头:用于存储运行数据(类型指针,gc标志,状态锁等),大小为8字节的一倍或两倍。
- 实例数据:用户所需要的真正有效的数据。
- 对齐填充:站位用,因为要保证一个对象的大小为8字节的整数倍。
通过确定上述三个块便可确定一个对象的大小。
当一个对象创建好后,对象放在堆里,我们如何访问呢?
要访问一个对象,就需要用到java内存区域中虚拟机栈里面的局部变量表,通过局部变量表中的reference数据来访问堆上的具体对象。