不要相信我的话。我只是重复从不同来源拼凑起来的东西。 HotSpot JVM使用线程本地分配缓冲区(TLAB)。 TLAB可以同步或不同步。大多数情况下,TLAB不同步,因此线程可以非常快速地分配。这些TLAB有很多,因此活动线程可以获得自己的TLAB。较不活跃的线程共享同步的TLAB。当一个线程耗尽其TLAB时,它会从池中获取另一个TLAB。当池用完TLAB时,会触发或需要Young GC。
当池用完TLAB时,仍然会有TLAB,其中还留有空间。这个“未使用的空间”加起来很重要。可以看到此空间,因为GC是在保留堆大小或达到最大堆大小之前触发的。因此,堆有效地小10-30%。至少这是我从堆使用图中看到的猜测。
如何调整JVM以减少未使用的空间?
答案 0 :(得分:2)
您可以使用命令行选项-XX:TLABSize
然而,与大多数这些"内心深处和肮脏的"在更改设置时,您应该非常小心,并密切监视更改的效果。
答案 1 :(得分:0)
在没有足够空间时分配TLAB的算法不同,但是通常您对可用空间的说法是正确的。
现在的问题是,如何确定默认的TLAB配置不适合您?您需要先使用-XX:+PrintTLAB
获取一些日志,如果发现未使用的空间过多,则需要尝试增加/减小TLAB的大小或更改-XX:TLABWasteTargetPercent
或{正如人们所说的{1}}。
当我通过TLAB时,我发现这篇文章很有用:https://alidg.me/blog/2019/6/21/tlab-jvm