如何优化具有大量(数百万)长生命周期对象的应用程序的堆大小使用? (大缓存,从数据库加载大量记录)
- 使用正确的数据类型
- 避免使用 java.lang.String 来表示其他数据类型
- 避免重复的对象
- 如果事先知道值,则使用枚举
- 使用对象池
- String.intern()(好主意?)
- 仅加载/保留您需要的对象
我正在寻找一般编程或 Java 特定的答案。没有时髦的编译器开关。
编辑:
优化可在堆中出现数百万次的 POJO 的内存表示。
用例
- 在内存中加载一个巨大的 csv 文件(转换为 POJO)
- 使用 hibernate 从数据库中检索数百万条记录
回答简历:
- 使用享元模式
- 写入时复制
- 与加载具有 3 个属性的 10M 对象相比,拥有 3 个大小为 10M 的数组(或其他数据结构)是否更有效? (操作数据可能会很痛苦,但如果你真的内存不足......)
最佳答案
我建议您使用内存分析器,查看内存消耗的位置并对其进行优化。如果没有量化信息,您最终可能会改变事情,而这些事情要么没有效果,要么实际上让事情变得更糟。
您可以考虑更改数据的表示形式,尤其是在您的对象很小的情况下。 例如,您可以将数据表表示为一系列列,每列都有对象数组,而不是每行一个对象。如果您不需要表示单个行,这可以为每个对象节省大量开销。例如一个有 12 列和 10,000,000 行的表可以使用 12 个对象(每列一个)而不是 1000 万个(每行一个)
关于java - 如何使 Java 应用程序的内存高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/789132/