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

8 java memory garbage-collection

过去几个月我们一直在调整我们的生产应用程序,以便我们不会遇到完整的GC.我们现在只经历年轻的GC,年轻的GC的比率取决于对象分配的速度.

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

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

Tho*_*nin 3

降低分配率可以减少 GC“暂停”的频率,但不会缩短。为了更流畅的“实时”操作,您实际上可能希望增加GC 调用的数量:这是为了获得更短的暂停而交换更多与 GC 相关的 CPU。Sun 的 JVM 可以通过各种选项进行调整;我建议尝试-XX:NewRatio让年轻一代变得更小。

反对池化的常见论点是,您基本上是在尝试编写自己的分配器,希望能比 JVM 分配器做得更好。在某些分配成本昂贵的特定情况下(例如创建实例)是合理的Thread