我正在调查Oracle Java Mission Control以进行内存消耗调查。为了开始,我使用了JDK 8样本中提供的Flight Recording wldf.jfr 。我很困惑列总TLAB大小与总对象大小:
对于第一个线程,总对象大小为1.52MB,但总TLAB大小为809.91MB(不同大小)。这是怎么解释的?该应用程序使用
执行-Xms256m -Xmx512m -XX:PermSize = 128m -XX:MaxPermSize = 256m
到目前为止,我的理解是每个线程都有一个TLAB。可以退出TLAB并为基于线程(以及其他因素)的值分配新的值
-XX:TLABWasteTargetPercent
退役TLAB的数据保留在Eden中,他们的命运取决于下一个Minor GC。那么列 TLABs 是指退休/分配的总数吗?这反过来应该表明 Total TLAB Size 是对这些新TLAB分配的累积量度。
我能否就内存管理得出任何结论?也许太多的TLAB分配可能会增加TLAB的大小?
答案 0 :(得分:0)
新TLAB中的分配'事件有点棘手, 它表示一个对象分配,它导致为线程分配新的TLAB。 (启发式地假定TLAB仅包含与第一个对象相同类型的对象) 该事件包含有关对象分配本身和TLAB的信息。
总物件尺寸'列(默认情况下未启用),只是对导致新TLABS的各个对象的对象大小求和,所以它确实是一个非常奇怪的统计数据。
在JDK 9中包含的JMC 6中,我相信我们已经删除了这个特定的计算。