2024-06-16 09:54:38 发布
网友
我的一位亲爱的同事曾经建议我,对于不太活跃的缓存,最好将对象(比如maps、JSONObject等)序列化为字符串,并将它们存储在缓存中,而不是对象本身。他提供的理由是,由于所有这些对象都有自己的方法等等,这增加了对象的足迹。我知道字符串也有自己的方法,但不是很大。他认为这仍然是一个更好的选择,即使在检索过程中解析字符串并将其转换回原始对象的额外成本也是如此
这些索赔中有水吗?或者还有其他类似的建议吗
每个类加载一次方法等。无论创建了多少个类实例,它们都不会占用额外的内存
在Java中,以下对象的占用空间为16字节:
class EmptyObject { }
如果对象包含引用,则每个引用都是另一个8字节。例如,以下对象的封装外形为80字节:
class AnotherObject { byte[] bytes = new byte[16]; }
现在假设我们缓存对象,并且假设缓存是一个美化的HashMap,因为它本质上存储一个键值对
HashMap
考虑下面的类。对于空字符串,它需要32个字节:
class Person { String firstName; String lastName; }
假设您的密钥是16字节长的字符串;32字节对象
如果将Person放入缓存,则需要
Person
总计:80字节
现在,假设我们分别存储字符串。对于每个键:
乘以x2总计:128字节
只有在这种情况下,存储字符串而不是对象才有意义:
class StringWrapper // the only field in the class String string; }
但即便如此,储蓄也是微不足道的
TL;博士:这是一个微优化,大部分时间都不值得
每个类加载一次方法等。无论创建了多少个类实例,它们都不会占用额外的内存
在Java中,以下对象的占用空间为16字节:
如果对象包含引用,则每个引用都是另一个8字节。例如,以下对象的封装外形为80字节:
现在假设我们缓存对象,并且假设缓存是一个美化的
HashMap
,因为它本质上存储一个键值对考虑下面的类。对于空字符串,它需要32个字节:
假设您的密钥是16字节长的字符串;32字节对象
如果将
Person
放入缓存,则需要总计:80字节
现在,假设我们分别存储字符串。对于每个键:
乘以x2总计:128字节
只有在这种情况下,存储字符串而不是对象才有意义:
但即便如此,储蓄也是微不足道的
TL;博士:这是一个微优化,大部分时间都不值得
相关问题 更多 >
编程相关推荐