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

标签 java caching memory heap-memory objectpool

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

  • 使用正确的数据类型
    • 避免使用 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/

相关文章:

ios - 无法从我的应用程序中删除 testflight sdk

memory - 断电时如何防止 "partial write"数据损坏?

java - Java 程序如何跟踪其运行期间使用的最大实际堆大小?

java - JasperReports 错误 |尝试从Windows下的System32文件夹加载文件

java - AWS-java.sql.SQLException : Access denied for user '' @'ip' (using password: YES)

magento - 根据使用Varnish和Magento的cookie中存储的变量创建缓存

c# - c#中类的内存对齐?

java - 来自 Apache 2.2 服务器的 CONNECTION_REFUSED(到 weblogic 10.3.6 服务器的 channel )

java - 删除每行开头的空格并结束每行的结尾

c# - Lazy<T> 无异常缓存