我正在调查Oracle Java Mission Control以进行内存消耗调查。首先,我使用了JDK 8示例中提供的Flight Recording wldf.jfr。我对列TLAB总大小与对象总大小感到困惑:

java - Java Mission Control中的TLAB总大小与对象总大小-LMLPHP
对于第一个线程,对象总大小为1.52MB,但总TLAB大小为809.91MB(不同的大小)。如何解释?该应用程序使用

-Xms256m -Xmx512m -XX:PermSize = 128m -XX:MaxPermSize = 256m

到目前为止,我的理解是每个线程都有一个TLAB。可以淘汰TLAB,并根据(包括其他因素在内)值将新的TLAB分配给线程。

-XX:TLABWasteTargetPercent

退休的TLAB的数据保留在Eden中,其命运由下一个Minor GC决定。那么,TLAB列是否指的是退休/分配总数?反过来,这应表明总TLAB大小是对新TLAB分配的累积度量。

我可以提取有关内存管理的任何结论吗?也许太多的TLAB分配可能暗示增加TLAB的规模?

最佳答案

“在新的TLAB中分配”事件有点棘手,
它代表一个对象分配,这导致为线程分配新的TLAB。 (试探性地假定TLAB仅包含与第一个对象相同类型的对象)
该事件包含有关对象分配本身和TLAB的信息。

“ Total Object Size”(总对象大小)列(默认情况下未启用)仅对导致新TLABS的单个对象的对象大小求和,因此,这确实是一个很奇怪的统计信息。

我相信在JDK 9中包含的JMC 6中,我们已经删除了此特定计算。

09-27 17:34