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

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

  •  
  •   NotreDame · 2019-10-27 09:47:13 +08:00 · 4782 次点击
    这是一个创建于 1866 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    总体来说,null 数据‘基本‘不占空间, 占空间的是缓存框架的 metadata
    zjsxwc
        5
    zjsxwc  
       2019-10-27 11:25:09 +08:00 via Android
    null 值就和普通指针占用一样的空间呗
    Macolor21
        6
    Macolor21  
       2019-10-27 12:45:52 +08:00
    楼上正解,就是和存储指针数值的内存空间一样大,只不过 null 是特殊的指针数值。
    bumz
        7
    bumz  
       2019-10-27 15:50:26 +08:00 via iPhone
    嗯,所以优化的做法是用 bitset + list
    axb
        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 字节。
    Raymon111111
        9
    Raymon111111  
       2019-10-27 17:20:00 +08:00
    对象头占空间
    NotreDame
        10
    NotreDame  
    OP
       2019-10-27 19:45:35 +08:00
    @lihongjie0209
    @axb 多谢提供思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:06 · PVG 11:06 · LAX 19:06 · JFK 22:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.