Java 的”空值“占多大的内存空间呢?

2019-10-27 09:47:13 +08:00
 NotreDame

看到一句话说“空值会占用缓存的空间”

4773 次点击
所在节点    程序员
10 条回复
lihongjie0209
2019-10-27 09:58:44 +08:00
你说的缓存是指?
cmdOptionKana
2019-10-27 10:10:27 +08:00
空值具体又是是什么,null 还是数组里的空位还是一个未对属性赋值的对象
NotreDame
2019-10-27 11:10:51 +08:00
@lihongjie0209 就是业务系统常见的缓存,guava 或者 redis 等。原文讨论的是“缓存击穿”的问题
@cmdOptionKana NullValue,用来在 cache 中存储 null。所以应该问 null 占几个字节?
lihongjie0209
2019-10-27 11:17:42 +08:00
@NotreDame #3
1. 对于 redis 取决于你序列化的结果 + redis 的一些 metadata
2. 对于 guava, 取决于 null + guava 的 metadata

总体来说,null 数据‘基本‘不占空间, 占空间的是缓存框架的 metadata
zjsxwc
2019-10-27 11:25:09 +08:00
null 值就和普通指针占用一样的空间呗
Macolor21
2019-10-27 12:45:52 +08:00
楼上正解,就是和存储指针数值的内存空间一样大,只不过 null 是特殊的指针数值。
bumz
2019-10-27 15:50:26 +08:00
嗯,所以优化的做法是用 bitset + list
axb
2019-10-27 16:20:23 +08:00
对于 jvm 内存来说,变量的引用只是一个指针,指向具体对象还是指向 null,占用的内存大小都不变,64 位机器下应该是 8 字节,但是会受 UseCompressedOops 参数的影响。

对分布式缓存中的内存(比如 redis )来说,取决于你的序列化方式。比如说,对于 java 原生序列化 ObjectOutputStream 来说 https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/io/ObjectOutputStream.java#L1110,null 会写入 TC_NULL 这个常量( 112 ),占用空间 1 字节。
Raymon111111
2019-10-27 17:20:00 +08:00
对象头占空间
NotreDame
2019-10-27 19:45:35 +08:00
@lihongjie0209
@axb 多谢提供思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/613339

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX