首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NotreDame
V2EX  ›  程序员

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

  •  
  •   NotreDame · 84 天前 · 3097 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 回复  |  直到 2019-10-27 19:45:35 +08:00
    lihongjie0209
        1
    lihongjie0209   84 天前
    你说的缓存是指?
    cmdOptionKana
        2
    cmdOptionKana   84 天前 via iPhone
    空值具体又是是什么,null 还是数组里的空位还是一个未对属性赋值的对象
    NotreDame
        3
    NotreDame   84 天前
    @lihongjie0209 就是业务系统常见的缓存,guava 或者 redis 等。原文讨论的是“缓存击穿”的问题
    @cmdOptionKana NullValue,用来在 cache 中存储 null。所以应该问 null 占几个字节?
    lihongjie0209
        4
    lihongjie0209   84 天前
    @NotreDame #3
    1. 对于 redis 取决于你序列化的结果 + redis 的一些 metadata
    2. 对于 guava, 取决于 null + guava 的 metadata

    总体来说,null 数据‘基本‘不占空间, 占空间的是缓存框架的 metadata
    zjsxwc
        5
    zjsxwc   84 天前 via Android
    null 值就和普通指针占用一样的空间呗
    Macolor21
        6
    Macolor21   84 天前
    楼上正解,就是和存储指针数值的内存空间一样大,只不过 null 是特殊的指针数值。
    bumz
        7
    bumz   84 天前 via iPhone
    嗯,所以优化的做法是用 bitset + list
    axb
        8
    axb   84 天前   ♥ 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 字节。
    Raymon111111
        9
    Raymon111111   84 天前
    对象头占空间
    NotreDame
        10
    NotreDame   84 天前
    @lihongjie0209
    @axb 多谢提供思路
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2002 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 33ms · UTC 00:29 · PVG 08:29 · LAX 16:29 · JFK 19:29
    ♥ Do have faith in what you're doing.