什么是JVM GC的大对象

Charlie Hunt说,大型对象在他的演示中对JVM GC不利。 因为:

  1. 分配和初始化大对象的成本很高。

  2. 不同大小的大对象可能导致Java堆fregmentation。

如何定义大对象? 如何知道对象是否是大对象? 谢谢

定义取决于平台,JVM和JVM配置。 例如,以下摘录自Michael Kopp撰写的三篇大型JVM博客文章中垃圾收集的不同之处

大小物体

JRockit在分配期间区分大小对象。 将对象视为大的限制取决于JVM版本,堆大小,垃圾收集策略和使用的平台。italics mine – DL。)它通常介于2到128 KB之间。 如果直接在旧代中生成堆,则在线程局部区域外部分配大对象。 当你开始思考它时,这很有意义。 年轻一代使用副本ccollection。 在某些时候,复制对象变得比在垃圾收集中遍历它更昂贵。

对于你的第二个问题,我不知道如何获得该阈值,但特别是在HotSpot中你可以设置它:

-XX:PretenureSizeThreshold=2m

有关此以及许多其他-XX选项的详细信息,请参阅Alexey Ragozin的HotSpot JVM垃圾收集选项备忘单

它的大小没有理论定义,但这将取决于您的JVM配置,例如,如果年轻一代很小,那么即使是小类也会导致太多交换(GC)。 如果您的对象与JVM堆足够大,那么GC将需要做更多的工作来分配并从堆中声明它们。 这将导致更频繁地“制止世界”问题。

从GC的角度来看,一般来说大对象意味着:

  • 分配昂贵的对象
  • 初始化成本昂贵的对象

例如:大小为10000的arraylist。