JVM并行对象创建性能



据说java允许并行运行多个线程。它还说,对象创建很便宜,因此我必须始终更喜欢创建新对象来重复使用它们。但是,据我所知,这些对象是在全球范围中创建的(成为GC的主题)。现在,奇迹来了,当任何线程创建对象时,平行性是否停止?

afaik,非托管语言在线程堆栈上创建对象,以使线程保持独立运行。一旦您从子程序范围退出后,它们都将被删除。也就是说,您不必将对象添加到全局列表中,并停止机器以稍后将其添加到GC。您可以使用Java中的类似INT/字符串的不变对象来做同样的事情,因为您无法转介其他需要GC进行循环依赖性的对象。但是,阿法克(Afaik),在爪哇的程序出口时,什么都没有清理。

小对象的分配大部分时间很便宜,因为TLAB(线程本地分配缓冲区)。每个线程都有一个特殊区域的伊甸园,保留用于螺纹 - 本地分配,称为TLAB。

因此,您仅在填充以上时仅分配新的TLAB。该同步是CAS操作,因此非常快。

        Eden                       Survivor 1/2
-------------------------------------------------
| T  |     | T  |                ||      |      |
| L  |     | L  |                ||      |      |
| A  |     | A  |                ||      |      |
| B  |     | B  |                ||      |      |
|    |     |    |                ||      |      |
| 1  |     | 2  |                ||      |      |
-------------------------------------------------
  ^           ^
  |           |
  reserved for|thread-1 allocations
              |
              |
              reserved for thread-2 allocations

此外,一些优化可以帮助您避免在编译代码中分配 - 逃脱分析和标量更换。在某些情况下,编译器可以通过将对象的所有字段放在堆栈中来消除分配。

相关内容

  • 没有找到相关文章

最新更新