创建(和发布)数百万个小对象的"最佳实践"是什么?
我正在用Java编写国际象棋程序,搜索算法为每个可能的移动生成一个"移动"对象,名义搜索每秒可以轻松生成超过一百万个移动对象.JVM GC已经能够处理我的开发系统上的负载,但我有兴趣探索以下方法:
绝大多数对象都是非常短暂的,但生成的大约1%的移动是持久化并作为持久值返回,因此任何池化或缓存技术都必须能够排除特定对象的重用.
我不希望完整的示例代码,但我希望进一步阅读/研究的建议,或类似性质的开源示例.
从Java 6的某个地方开始,Hotspot JVM可以进行转义分析并在堆栈上而不是在垃圾收集堆上分配非转义对象.这导致生成的代码加速并减少垃圾收集器的压力.
Hotspot何时能够堆叠分配对象的规则是什么?换句话说,我什么时候可以依靠它来进行堆栈分配?
编辑:这个问题是重复的,但是(IMO)下面的答案比原始问题提供的答案更好.
HotSpot Java 9-13 的堆栈分配优化规则是否不太严格?
在 Java 7 和 Java 8 HotSpot 中,对象的堆栈分配(由于称为标量对象替换的 JVM 优化)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足许多严格的约束。
针对 Java 8(HotSpot、OpenJDK 8)启用堆栈分配优化的规则总结在这个问题的精彩回答中: Hotspot 什么时候可以在堆栈上分配对象? 至于 Java 7,这里: Eligibility for escapeanalysis/stack allocate with Java 7
在这个问题中,我想了解较新的 JDK 版本中 EA 和堆栈分配优化的当前状态是什么?其他 Java VM(例如 OpenJ9)是否有不同的规则?
java jvm compiler-optimization escape-analysis stack-allocation