我想理解这一点,但是当我设置最大堆大小时,多线程环境中的每个线程是否都创建了自己的堆并且具有相同的大小?
答案 0 :(得分:4)
...多线程环境中的每个线程是否都创建了自己的堆并且具有相同的大小?
没有。 Java进程中的所有线程都共享一个堆。
可以使用TLAB(线程本地分配缓冲区)运行JVM,以减少多线程应用程序中与分配相关的争用。但是,这些只是具有Java堆的Eden空间的区域。不是分开的堆。此外,GC会根据需要将对象移动到其他位置。
参考文献:
答案 1 :(得分:2)
同一进程的线程共享相同的虚拟内存和堆。
实际上,内存管理器可以维护专用于每个单独线程的本地内存池。它试图平衡池。这是在#34;引擎盖下完成的。作为优化,它对您来说是不可见的,因此线程使用分配给该进程的整个堆。