DEnjoy

导航

深入java----java内存区域及对象的创建

看完深入理解jvm之后自己再用图的方式进行一遍梳理,用以加深理解。

 

第一部分,首先对整体java运行时内存区域有一个整体框架式的了解。

 

运行时内存区域的划分如上图所示,那么接下里看看一个对象的创建又怎么样的过程。

首先是需要一块内存区域,而寻找内存区域主要分为两种策略:

  1.   指针碰撞,当空闲内存区域为连续区域时,那么只需要将空指针移动一段与对象大小相等的距离即可。
  2.   空闲列表,当空闲内存区域不连续时,需要维护一个表来记录那些内存可用,并在分配时给对象分配一个足够大的空间并更新表。

(注:内存区域是否连续主要和垃圾回收策略相关)

在上面的过程中,对象的大小如何确定呢?这就涉及对象在内存中的存储形式是什么了。

一个java对象在内存中的结构分三块:

  1. 对象头:用于存储运行数据(类型指针,gc标志,状态锁等),大小为8字节的一倍或两倍。
  2. 实例数据:用户所需要的真正有效的数据。
  3. 对齐填充:站位用,因为要保证一个对象的大小为8字节的整数倍。

通过确定上述三个块便可确定一个对象的大小。

当一个对象创建好后,对象放在堆里,我们如何访问呢?

要访问一个对象,就需要用到java内存区域中虚拟机栈里面的局部变量表,通过局部变量表中的reference数据来访问堆上的具体对象。

 

posted on 2017-02-07 09:55  DEnjoy  阅读(163)  评论(0编辑  收藏  举报