4

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

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

  2. 不同大小的大对象会导致 Java 堆碎片化。

如何定义大对象?我怎么知道物体是否是大物体?谢谢

4

3 回答 3

3

定义取决于平台、JVM 和 JVM 配置。例如,下面是Michael Kopp在三大 JVM博客文章中垃圾收集的不同之处的摘录:

大物体和小物体

JRockit 在分配期间区分大对象和小对象。对象被认为是大的限制取决于 JVM 版本、堆大小、垃圾收集策略和使用的平台。斜体字我的 - DL。)它通常在 2 到 128 KB 之间。大对象分配在线程局部区域之外,以防分代堆直接在老年代中。当您开始考虑它时,这很有意义。年轻代使用一个副本 ccollection。在某些时候,复制一个对象变得比在垃圾收集中遍历它更昂贵。

对于您的第二个问题,我不确定如何获得该阈值,但具体而言,您可以在 HotSpot 中设置它:

-XX:PretenureSizeThreshold=2m

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

于 2013-01-07T05:37:18.890 回答
1

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

于 2013-01-07T05:36:13.913 回答
0

从 GC 的角度来看,大对象通常意味着:

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

例如:大小为 10000 的数组列表。

于 2013-01-08T14:32:01.510 回答