JDK中的Java Mission Control工具提供了关于在新的TLAB内和在TLAB外分配对象的统计信息(位于Memory/Allocations下)。这些统计信息有何意义,对应用程序的性能有何好处?如果某些对象在TLAB外分配,我是否应该担心?如果是,我该怎么做?
JDK中的Java Mission Control工具提供了关于在新的TLAB内和在TLAB外分配对象的统计信息(位于Memory/Allocations下)。这些统计信息有何意义,对应用程序的性能有何好处?如果某些对象在TLAB外分配,我是否应该担心?如果是,我该怎么做?
TLAB是线程本地分配缓冲区。在HotSpot中,对象的正常分配方式是在TLAB中完成。由于分配缓冲区是线程本地的,因此可以在不与其他线程同步的情况下进行TLAB分配,只有当获取新的TLAB时才需要同步。
因此,理想的情况是尽可能多地使用TLAB进行分配。
一些对象将在TLAB之外进行分配,例如大型对象。只要TLAB之外的分配比新TLAB中的分配低,这就不成问题。
TLAB在执行过程中会根据每个线程动态调整大小。因此,如果一个线程分配非常多,它从堆中获得的新TLAB将增加大小。如果需要,您可以尝试设置标志-XX:MinTLABSize
来设置最小TLAB大小,例如-XX:MinTLABSize=4k
答案是由我的同事David Lindholm提供的 :)