如何使Java应用程序内存高效?

Bou*_*une 17 java memory heap caching objectpool

如何优化具有大量(数百万)长寿命对象的应用程序的堆大小使用?(大缓存,从数据库加载大量记录)

  • 使用正确的数据类型
    • 避免使用java.lang.String来表示其他数据类型
  • 避免重复的对象
    • 如果预先知道值,请使用枚举
    • 使用对象池
    • String.intern()(好主意?)
  • 加载/保留您需要的对象

我正在寻找通用编程或Java特定的答案.没有时髦的编译器开关.

编辑:

优化POJO的内存表示,它可以在堆中出现数百万次.

用例

  • 在内存中加载一个巨大的csv文件(转换为POJO)
  • 使用hibernate从数据库中检索数百万条记录

简历回复:

  • 使用flyweight模式
  • 复制写
  • 而不是加载具有3个属性的10M对象,拥有3个大小为10M的数组(或其他数据结构)是否更有效?(操作数据可能会很痛苦,但如果你的内存真的很短......)

Pet*_*rey 20

我建议您使用内存分析器,查看内存消耗的位置并对其进行优化.如果没有定量信息,你最终可能会改变那些无效或实际上让事情变得更糟的事情.

您可以查看更改数据的表示形式,尤其是对象很小的情况.例如,您可以将数据表表示为一系列列,每列包含对象数组,而不是每行一个对象.如果您不需要表示单个行,这可以为每个对象节省大量开销.例如,一个包含12列和10,000,000行的表可以使用12个对象(每列一个)而不是1000个(每行一个)


Bri*_*new 17

你没有说你想要存储什么类型的对象,所以提供详细的建议有点困难.然而,一些(非排他性)方法,没有特别的顺序,是:

  • 尽可能使用flyweight模式.
  • 缓存到光盘.Java 有 许多缓存解决方案.
  • 关于String.intern是否是一个好主意存在争议.请看 这里的问题.String.intern(),以及围绕其适用性的争论.
  • 使用 引用或引用来存储可以按需重新创建/重新加载的数据.请参阅 此处了解如何将软引用与缓存技术结合使用.

了解有关您正在存储的对象的内部和生命周期的更多信息将得到更详细的答案.


kro*_*old 11

确保对象模型的良好规范化,不要重复值.

嗯,如果它只有数百万个对象,我想我只需要一个体面的64位虚拟机和大量的内存;)