美文网首页
内存管理(二)

内存管理(二)

作者: most_xiaoya | 来源:发表于2019-04-28 17:31 被阅读0次

    HotSpot 虚拟机对象

    1.对象的创建:

    对象的创建涉及到两个问题:
    1)内存空间的分配 解决方法:指针碰撞和空闲列表(分别针对内存空间连续和内存空的不连续)
    2)分配内存时的线程安全 解决方法:

    • 对分配内存空间的动作进行同步处理-其实在虚拟机采用的是CAS配上失败重试保证操作的原子性;
    • 把内存分配动作按照线程划分在不同的空间进行,也就是每个线程在Java堆中预先分配一小块儿内存,称作是本地线程分配缓冲TLAB(Thread Local Allocation Buffer)。

    2.对象的内存布局

    对象在内存中存储的布局可以分为三个区域

    • 对象头:对象头分为两部分,
      一部分是用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据官方叫“Mark Word”;
      另一部分是类型指针,也就是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
    • 实力数据:对象真正存储的有效信息;
    • 对齐填充:并不是必然存在的,也没有特别含义,它仅仅起着占位符的作用。

    3. 对象的访问定位:

    目前主流的访问方式是使用句柄和直接指针两种。
    两种访问方式各有优势:
    使用句柄访问的好处是reference中存储的是稳定的句柄地址,在对象被移动的时候只会改变句柄中的实例数据指针,而reference本身不需要修改。
    使用直接指针的方式最大的好处就是速度更快,它节省了一次指针定位的时间开销。

    相关文章

      网友评论

          本文标题:内存管理(二)

          本文链接:https://www.haomeiwen.com/subject/fadfnqtx.html