Charlie Hunt说他的presentation中的大型对象对JVM GC不利。这是因为:
分配和初始化大对象的成本很高。
不同大小的大对象可能导致Java堆fregmentation。
如何定义大对象?我怎么知道对象是否是大对象?感谢
答案 0 :(得分:3)
定义取决于平台,JVM和JVM配置。例如,这里摘录自迈克尔科普的How Garbage Collection differs in the three big JVMs博客文章:
大小物件
JRockit在此期间区分大型和小型物体 分配。 对象被视为大的时间的限制取决于 关于JVM版本,堆大小,垃圾收集策略和 使用的平台。( italics mine - DL。)通常介于2到128 KB之间。大 如果是a,则在线程局部区域外分配对象 世代堆直接在老一代。这使得很多 当你开始思考它时感觉到。年轻一代使用了 复制ccollection。在某些时候复制对象变得更多 比在垃圾收集中遍历它要贵。
关于你的第二个问题,我不知道如何获得该阈值,但特别是在HotSpot中你可以设置:
-XX:PretenureSizeThreshold=2m
有关此问题及许多其他-XX
选项的详情,请参阅Alexey Ragozin的HotSpot JVM garbage collection options cheat sheet。
答案 1 :(得分:1)
没有关于其大小的理论定义,但这将取决于您的JVM配置,例如,如果年轻一代很小,那么即使是小类也会导致太多交换(GC)。如果你的对象在你的JVM堆上足够大,那么GC将需要做更多的工作来分配并从堆中声明它们。这将导致“停止世界”#34;问题更频繁。
答案 2 :(得分:0)
从GC的角度来看,一般来说大对象意味着:
例如:大小为10000的arraylist。