在Java中缓存字符串而不是对象有什么选择性的好处吗?它在Python中有什么不同吗?

2024-06-16 09:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的一位亲爱的同事曾经建议我,对于不太活跃的缓存,最好将对象(比如maps、JSONObject等)序列化为字符串,并将它们存储在缓存中,而不是对象本身。他提供的理由是,由于所有这些对象都有自己的方法等等,这增加了对象的足迹。我知道字符串也有自己的方法,但不是很大。他认为这仍然是一个更好的选择,即使在检索过程中解析字符串并将其转换回原始对象的额外成本也是如此

这些索赔中有水吗?或者还有其他类似的建议吗


Tags: 对象方法字符串序列化过程建议maps成本
1条回答
网友
1楼 · 发布于 2024-06-16 09:54:38

每个类加载一次方法等。无论创建了多少个类实例,它们都不会占用额外的内存

在Java中,以下对象的占用空间为16字节:

class EmptyObject {
}

如果对象包含引用,则每个引用都是另一个8字节。例如,以下对象的封装外形为80字节:

  • 16字节用于实例定义
  • 8字节用于数组引用
  • 实际数组中有16个字节
class AnotherObject {
  byte[] bytes = new byte[16];
}

现在假设我们缓存对象,并且假设缓存是一个美化的HashMap,因为它本质上存储一个键值对

考虑下面的类。对于空字符串,它需要32个字节:

class Person {
  String firstName;
  String lastName;
}

假设您的密钥是16字节长的字符串;32字节对象

如果将Person放入缓存,则需要

  • 8字节用于密钥引用
  • 密钥为32字节
  • 8字节用于值参考
  • 值为32字节

总计:80字节

现在,假设我们分别存储字符串。对于每个键:

  • 8字节用于密钥引用
  • 密钥为32字节
  • 8字节用于值参考
  • 值为16字节(空字符串)

乘以x2总计:128字节


只有在这种情况下,存储字符串而不是对象才有意义:

class StringWrapper
  // the only field in the class
  String string;
}

但即便如此,储蓄也是微不足道的

TL;博士:这是一个微优化,大部分时间都不值得

相关问题 更多 >