2016-11-04 49 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

线程相同的虚拟存储器和堆。

实际上,内存管理器可以维护专用于每个单独线程的本地内存池。它试图平衡泳池。这是作为优化完成的“底层”,它对你来说是不可见的,所以线程使用分配给进程的整个堆。