首页 文章

java 空实例变量内存占用

提问于
浏览
1

我有一个问题,我需要在地图中存储键,value1(float)和 value2(非常长的字符串),其中 value1 可用于每个键,value2 仅适用于 1%的键。

我可以想到 2 个可能的解决方案

  • 两个地图,如 map1 = map(key1,map(key2,value1))和 map2 = map(key1,map(key2,value2)) pros - 没有不必要的参考变量。缺点 - 存储相同的密钥两次浪费内存。

  • 使用一个带有自定义对象值的地图。 map1 = map customobj {float value1; string value2} pros - 没有重复的密钥。缺点 - 99%的 customobj 将具有 value2=null,因此将消耗内存作为参考指针。

基本上我的最终问题是未使用的引用(在 customobj 中)消耗内存还是编译器会优化它?我倾向于 soln 2,因为我不想通过两次存储相同的 key1 和 key2 来浪费内存。另一方面 99%的时间 value2=null,这让我想知道 soln1 是否更好。

我正在使用 Java,我想听听一些建议。

编辑:我没有意识到 SO 没有打印我发布的地图结构,我编辑了。 key1 和 key2 都是字符串(大多数是固定长度的 id 字符串)

2 回答

  • 2

    我会根据密钥大小和类型选择解决方案

    解决方案 1 是 -

    1. 带键和 value1(float 的 HashMap)

    2. 带键和 value2(string 的 HashMap)

    对于 1%的密钥,这只需要额外的空间。如果密钥大小很大,那么我会选择解决方案 2。

    解决方案 2 是 -

    带有自定义对象的单个 HashMap。使用结构或类创建自定义对象。

    虽然引用的内存非常小,但每个对象仍占用对象 overhead(16 字节和 padding(4 字节的常量内存。解决方案 1 中的 HashMap 键可能会占用每个 key-value 对的大约 8 字节开销。因此,如果您的密钥大小大于整数或字符,请选择解决方案 2。

  • 0

    解决方案#3。 HashMap,其中 value 是 Float 或 CustomObj {float value1;字符串值 2}。在运行时执行 instanceof 以找出哪个是哪个。

    那,假设优化甚至是一个问题。过早优化是万恶之源,对吧?如果您还不确定是否需要进行优化,那么只需按照您对正在建模的现实世界进行概念化的方式进行编码。

相关问题