看到一句话说“空值会占用缓存的空间”
1
lihongjie0209 2019-10-27 09:58:44 +08:00
你说的缓存是指?
|
2
cmdOptionKana 2019-10-27 10:10:27 +08:00 via iPhone
空值具体又是是什么,null 还是数组里的空位还是一个未对属性赋值的对象
|
3
NotreDame OP @lihongjie0209 就是业务系统常见的缓存,guava 或者 redis 等。原文讨论的是“缓存击穿”的问题
@cmdOptionKana NullValue,用来在 cache 中存储 null。所以应该问 null 占几个字节? |
4
lihongjie0209 2019-10-27 11:17:42 +08:00
@NotreDame #3
1. 对于 redis 取决于你序列化的结果 + redis 的一些 metadata 2. 对于 guava, 取决于 null + guava 的 metadata 总体来说,null 数据‘基本‘不占空间, 占空间的是缓存框架的 metadata |
5
zjsxwc 2019-10-27 11:25:09 +08:00 via Android
null 值就和普通指针占用一样的空间呗
|
6
Macolor21 2019-10-27 12:45:52 +08:00
楼上正解,就是和存储指针数值的内存空间一样大,只不过 null 是特殊的指针数值。
|
7
bumz 2019-10-27 15:50:26 +08:00 via iPhone
嗯,所以优化的做法是用 bitset + list
|
8
axb 2019-10-27 16:20:23 +08:00 5
对于 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 字节。 |
9
Raymon111111 2019-10-27 17:20:00 +08:00
对象头占空间
|
10
NotreDame OP |