栈上分配与TLAB

大部分new出来的对象被分配在堆上,而不是所有。

  • 经过对Java对象分配的过程分析,能够知道有另外两个地方也是能够存放对象的。

  • 这两个地方分别栈 (涉及逃逸分析相关知识)和TLAB(Thread Local Allocation Buffer)。

栈上分配

  • 若是肯定一个对象的做用域不会逃逸出方法以外,
    • 那能够将这个对象分配在栈上
    • 这样,对象所占用的内存空间就能够随栈帧出栈而销毁。
  • 在通常应用中,不会逃逸的局部对象所占的比例很大,
    • 若是能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,
    • 无须经过垃圾收集器回收,能够减少垃圾收集器的负载。
  • JVM容许将线程私有的对象打散分配在栈上,而不是分配在堆上。
    • 分配在栈上的好处是能够在函数调用结束后自行销毁,
    • 而不须要垃圾回收器的介入,从而提升系统性能。
  • 栈上分配的技术基础: 
    • 一是逃逸分析:缓存

      • 逃逸分析的目的是判断对象的做用域是否有可能逃逸出函数体。多线程

    • 二是标量替换:容许将对象打散分配在栈上,函数

      • 好比若一个对象拥有两个字段,会将这两个字段视做局部变量进行分配。性能

    • 只能在server模式下才能启用逃逸分析,spa

      • 参数-XX:DoEscapeAnalysis启用逃逸分析,线程

      • 参数-XX:+EliminateAllocations开启标量替换(默认打开)。server

      • Java SE 6u23版本以后,HotSpot中默认就开启了逃逸分析,对象

        • 能够经过选项-XX:+PrintEscapeAnalysis查看逃逸分析的筛选结果。blog

TLAB

  • TLAB的全称是Thread Local Allocation Buffer,
    • 即线程本地分配缓存区,
    • 这是一个线程专用的内存分配区域。 
  • JVM使用TLAB来避免多线程冲突,
    • 在给对象分配内存时,每一个线程使用本身的TLAB,
    • 这样能够避免线程同步,提升了对象分配的效率。 
  • TLAB自己占用eEden区空间,
    • 在开启TLAB的状况下,虚拟机会为每一个Java线程分配一块TLAB空间
      • 参数-XX:+UseTLAB开启TLAB,默认是开启的。
    • TLAB空间的内存很是小,
      • 缺省状况下仅占有整个Eden空间的1%,
      • 固然能够经过选项-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。
  • 因为TLAB空间通常不会很大,
    • 所以大对象没法在TLAB上进行分配,老是会直接分配在堆上

​​​​​​​

相关文章
相关标签/搜索