1,堆是JVM中全部線程共享的,所以在其上進行對象內存的分配均須要進行加鎖,這也致使了new對象的開銷是比較大的
2,Sun Hotspot JVM爲了提高對象內存分配的效率,對於所建立的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),
其大小由JVM根據運行的狀況計算而得,在TLAB上分配對象時不須要加鎖,所以JVM在給線程的對象分配內存時會儘可能的在TLAB上分配,
在這種狀況下JVM中分配對象內存的性能和C基本是同樣高效的,但若是對象過大的話則仍然是直接使用堆空間分配
3,TLAB僅做用於新生代的Eden Space,所以在編寫Java程序時,一般多個小的對象比大的對象分配起來更加高效。
4,全部新建立的Object 都將會存儲在新生代Yong Generation中。
若是Young Generation的數據在一次或屢次GC後存活下來,那麼將被轉移到OldGeneration。
新的Object老是建立在Eden Space。
PS:雖然整體來講堆是線程共享的,可是在堆的年輕代中的Eden區能夠分配給專屬於線程的局部緩存區TLAB,也能夠用來存放對象。至關於線程私有的對象。緩存