在 Java 中节省内存:实现最小的内存占用( 二 )


在 Java 中节省内存:实现最小的内存占用

文章插图
 
现在只有一个用户对象,我们也失去了在引用上花费的额外内存 。是的,代码更具可读性和可维护性,但我们几乎将大小提高了 2 倍 。JOL-Core 库还确认现在的总大小为 64 字节!
第三个内存优化:使用窄类型
如果您检查我们使用的所有类型,您可能会提到其中一些涵盖的范围比我们需要的要大:例如,isvalue 和覆盖范围从 -2147483648 到 -2,147,483,647,但根据我们的业务需求,它不会超过每月 32,767 美元 。因此,我们可以使用数据类型而不是整数 。同样,我们可以替换**java.sql.Date并只保留长**值(已经是未来和过去的数千年) 。salary``int``Short
因此,在我们的例子中,我们将进行以下更改:
在 Java 中节省内存:实现最小的内存占用

文章插图
 
现在,快照总大小为 40 字节大小 。我们能进一步改进它吗?是的!
第四个内存优化:使用窄类型
在此步骤中,我们将在较大的类型中“隐藏”较小的数据类型 。整数值由 2^32 个值覆盖 。布尔值由 2^1 覆盖 。所以在一个整数中,我们可以“隐藏”32个布尔值 。同样的事情可以应用于这些示例:
 
  • 1 个整数 (2^32) 内的 32 个布尔值 (2^1)
  • 1 个整数 (2^32) 内的 4 个字节 (2^7)
  • 1 个整数 (2^32) 内的 2 个短裤 (2^16)
  • 2 个整数 (2^32) 在一个长 (2^64) 内
  • 等 。
编写逻辑以隐藏和揭示布尔值和短线值的掩蔽值 
在我们的示例中,我们将所有 9 个布尔值封装在一个短时间内 。我们将使用按位运算(向右、向左移动等) 。您可以在本文中找到更多示例 。
从布尔值到短线的转换:
转换包括 3 个后续步骤:boolean``short
 
  1. 转换 。boolean``1 (true)``0 (false)
  2. 使用左移运算符将该值向左移动 。N``(<<)
  3. 使用运算符合并所有值 。OR (|)
 
因此,使用定义的标志顺序如下:
在 Java 中节省内存:实现最小的内存占用

文章插图
 
并在一种方法中实现所有步骤:
在 Java 中节省内存:实现最小的内存占用

文章插图
 
现在有了这个函数,我们可以在一个单一中隐藏值:boolean``short
在 Java 中节省内存:实现最小的内存占用

文章插图
 
从短值中揭示隐藏的布尔值
为了识别哪个标志具有什么值,我们需要进行向后转换:
 
  1. 将值移动到右边的步骤(取决于标志顺序) 。results``N
  2. 进行比较以“削减”正确的数字 。
  3. 将此数字与 1 进行比较,如果为 1,则值为 true 。1``=> flags
 
所有步骤如下所示:
在 Java 中节省内存:实现最小的内存占用

文章插图
 
现在使用所有这些函数,我们可以尝试隐藏下一个值:
我们的最终值是229,或者可以用二进制格式表示为011100101并表示下一个值,如下所示:
在 Java 中节省内存:实现最小的内存占用

文章插图
 
现在有了这个结果值,我们可以使用并得到一个特定的封装布尔值:mask
在 Java 中节省内存:实现最小的内存占用

文章插图
 


推荐阅读