java - 大内存如何优化内存使用?

标签 java performance memory optimization dictionary

我在java中有一个大的HashMap,存储从字符串到整数的映射。它有 400K 条记录。它运行正常,但我想知道在内存使用方面是否有更好的优化。 Map初始化后,只会进行搜索,不会进行其他更新操作。

我依稀记得我遇到过一些将字符串键转换为 int 的建议,但不确定。请对此提供帮助或分享您的想法。

谢谢。

最佳答案

I vaguely remember that I came across some suggestions to convert the string keys as int, but not sure about that.

如果字符串键实际上是整数的字符串表示形式,那么使用 Integer 将它们转换为 IntegerLong 对象是有意义的.valueOf(字符串)。您将节省一些内存,因为原始包装类使用的内存比相应的 String 对象少。节省的空间可能会很大(每个 key 可能约为 16 字节,而每个 key 约为 40 字节……具体取决于您的平台。)

另一方面,您需要在进行 HashMap 查找之前将候选键从 String 转换为真实键类型。该转换需要一些时间,并且通常会生成一些垃圾。


但是如果String键不代表整数,那么这根本不起作用。 (或者至少......我不知道你指的是什么“转换”......)

另请注意, key 类型必须为 Integer/Long 而不是 int/long。泛型类型参数必须是引用类型。


可能有第 3 方集合实现也会有所帮助......具体取决于您的数据结构的工作原理;例如Trove、 Guava 、Fastutil。尝试将 then 与 String -> Integer 预转换 ...


关于使用数据库的建议。如果

  • 您不需要数据库的查询/更新/事务功能,并且
  • 您有足够的内存来保存数据,并且
  • 您可以承担将数据加载到内存中的启动成本,

那么使用数据库只会对每次查找造成很大的、不必要的性能影响。

关于java - 大内存如何优化内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676811/

相关文章:

java - 如何用ELKI插入自定义距离?

java - 尝试将 dll 注入(inject)已运行的 JVM?

c# - Windows Phone Longlistselector ItemsSource Performance

c - C 中的二维数组内存映射

c# - 获取内存中托管对象的 'optimistic' 大小

java - 迁移我的应用程序以使用 OSB

java - 这个比较器可能有什么问题?

performance - 为什么Delphi打开时间越长编译速度就越慢,我该怎么办?

java - 启动 100 个按钮的更有效方法

java - 将大矩阵表示为一维数组比二维数组更有效吗?