java虚拟机——对象内存的分配

对象内存的分配

1 假设内存是绝对规整的,用过的放一边,没用过的放另一边,中间有指针做分界线,分配内存时指针向下移动对象大小的        距离,称之为“指针碰撞

2 已使用的内存与未使用的内存相互交错,那么虚拟就需要维护一张表,记录哪块内存可用,哪块内存不可用,分配内存时       从列表中找出一块足够大的内存,这种分配方式称之为“空闲列表

3 选择哪种方式是由堆是否规整决定的,而决定堆是否规整由垃圾收集器是否带有压缩整理的功能决定的

   因此   空闲列表 : CMS基于Mark-Sweep算法收集的

              指针碰撞:Serial /parNew 待compact过程的

问题:对象的创建是非常频繁的行为,仅修改指针的位置也存在线程安全问题

解决方案

1对分配内存空间的动作进行同步处理(实际上虚拟机采用CAS配上失败重试的方式保证原子性)

2 把内存分配动作按照线程分配在不同空间中进行,即每个线程在java堆中分配一块内存称之为“本地线程分配缓冲”TLAB

  哪个线程要分配内存就在自己的TLAB上分配,只有TLAB用完并分配新的TLAB时才进行同步锁定

 是否使用TLAB通过-XX:+/-UseTLAB设定

内存分配完成 

1 需要对对象进行必要的设置 如;对象是哪个类的实例,哈希码,gc分代年龄等,这些信息存在对象头中

2 完成后,从虚拟机角度一个新的对象诞生了,但是从java程序视角来看,对象创建才刚开始,<init>方法还没执行,执行New指令后 接着执行<init>方法,把对象初始化

对象:布局分为3块区域:对象头,实例数据,对齐填充

对象头:一部分存储对象自身运行时的数据,如哈希码,gc分代年龄等,锁状态标志等,另一部分是类型指针,虚拟机通过这个指针来确定对象是哪个类的实例

实例数据: 对象真正存储的有效信息

对齐填充:并不是必然存在的,没有特别的含义,仅仅起着占位符的作用

对象的引用:java程序通过栈上的reference数据操作堆上的具体对象,

                    reference: 句柄访问  和直接指针访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值