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