在Java中预分配对象有什么问题?

时间:2010-03-01 16:39:57

标签: java memory garbage-collection

我们在过去几个月里一直在调整我们的生产应用程序,因此我们没有遇到完整的GC。我们现在只经历年轻的GC,年轻的GC的比率取决于对象分配的速度。

我们的应用程序需要尽可能接近“实时”,所以现在我们正努力减少年轻GC的数量。正如旧的公理所说,我们分配的大部分数据最终都是垃圾并在下一个年轻的GC中被丢弃。因此无需预先分配此类数据。然而,我们知道从年轻的GC到旧的GC有大量的对象(由类型定义)。

在更理想的时间(即启动时)预先分配这些物体是否有意义,所以我们最终会在不太理想的时间内分配更少的物品?我已经阅读了文献,其中提到了最新的JVM不建议如何使用对象池,因为分配要便宜得多。预分配对象的缺点是什么,我知道它会进入旧的GC?

2 个答案:

答案 0 :(得分:3)

降低分配率使GC“暂停”的频率降低,但不会缩短。为了实现更顺畅的“实时”操作,您实际上可能希望增加 GC调用次数:这会交换更多与GC相关的CPU,以便缩短暂停时间。可以使用各种options调整Sun的JVM;我建议尝试-XX:NewRatio让年轻一代变小。

反对池的常见理由是你基本上都在尝试编写自己的分配器,希望你能比JVM分配器做得更好。在某些特定情况下,分配是昂贵的,例如,创建Thread个实例。

答案 1 :(得分:3)

请注意,realtime jvm可用。如果您的应用需要可预测的性能,那么这是值得研究的。