2016-11-04 80 views
0

我想了解這一點,但是當我設置最大堆大小時,多線程環境中的每個線程是否創建自己的堆並具有相同的大小?堆被共享到多個線程嗎?

+2

堆被所有線程共享 – TheLostMind

+1

是的,它在所有線程之間共享https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html – user3159253

回答

3

......多線程環境中的每個線程是否創建自己的堆並具有相同的大小?

不是。有一個堆由Java進程中的所有線程共享。

可以使用TLAB(線程本地分配緩衝區)運行JVM以減少多線程應用程序中與分配相關的爭用。但是,這些只是具有Java堆的Eden空間的區域。不分離堆。此外,物體將根據需要由GC移動到其他地方。

參考文獻:

同一進程共享的
2

線程相同的虛擬存儲器和堆。

實際上,內存管理器可以維護專用於每個單獨線程的本地內存池。它試圖平衡泳池。這是作爲優化完成的「底層」,它對你來說是不可見的,所以線程使用分配給進程的整個堆。