文章插图
现在只有一个用户对象,我们也失去了在引用上花费的额外内存 。是的,代码更具可读性和可维护性,但我们几乎将大小提高了 2 倍 。JOL-Core 库还确认现在的总大小为 64 字节!
第三个内存优化:使用窄类型
如果您检查我们使用的所有类型,您可能会提到其中一些涵盖的范围比我们需要的要大:例如,isvalue 和覆盖范围从 -2147483648 到 -2,147,483,647,但根据我们的业务需求,它不会超过每月 32,767 美元 。因此,我们可以使用数据类型而不是整数 。同样,我们可以替换**java.sql.Date并只保留长**值(已经是未来和过去的数千年) 。salary``int``Short
因此,在我们的例子中,我们将进行以下更改:
文章插图
现在,快照总大小为 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
- 转换 。boolean``1 (true)``0 (false)
- 使用左移运算符将该值向左移动 。N``(<<)
- 使用运算符合并所有值 。OR (|)
因此,使用定义的标志顺序如下:
文章插图
并在一种方法中实现所有步骤:
文章插图
现在有了这个函数,我们可以在一个单一中隐藏值:boolean``short
文章插图
从短值中揭示隐藏的布尔值
为了识别哪个标志具有什么值,我们需要进行向后转换:
- 将值移动到右边的步骤(取决于标志顺序) 。results``N
- 进行比较以“削减”正确的数字 。
- 将此数字与 1 进行比较,如果为 1,则值为 true 。1``=> flags
所有步骤如下所示:
文章插图
现在使用所有这些函数,我们可以尝试隐藏下一个值:
我们的最终值是229,或者可以用二进制格式表示为011100101并表示下一个值,如下所示:
文章插图
现在有了这个结果值,我们可以使用并得到一个特定的封装布尔值:mask
文章插图
推荐阅读
- 如何在SpringBoot中集成MyBatis
- systemctl 命令详解及使用教程
- Ghips:自动获取 GitHub 最快 IP,一键刷新 hosts,说说源码中的干货
- 谷歌解释为什么从 Chrome 中移除对 JPEG-XL 的支持
- Java加密Sqlite库 及文件
- Springboot使用redis过程中的报错问题
- pdf如何加水印,在哪里设置?你不知道的几种方法
- 薛之谦与大张伟好像,大张伟是薛之谦吗-
- 服刑期间在监狱受伤怎么办,服刑人员在监狱打架怎么办-
- 华妃|甄嬛传18:皇后和华妃相比之下,她的狠毒和悲哀之处在哪儿?
