我的一位亲爱的同事曾经建议我,最好把对象(比如说地图、JsonObjects等)序列化成字符串,然后存储在缓存中,而不是对象本身,这样可以减少缓存的活跃度。他提供的理由是,由于这些对象都有自己的方法什么的,所以会增加对象的占用空间。我理解字符串也是自带方法的,但不是很大。他建议说,即使在检索过程中要增加解析字符串并将其转换回原始对象的成本,这仍然是一个较好的选择。
这些说法有水分吗?或者说身边还有没有其他相同的建议?
方法等每个类都会加载一次。无论你创建多少个类的实例,它们都不会占用额外的内存。
在Java中,下面对象的足迹是16个字节。
class EmptyObject {
}
如果你的对象包含了引用, 每一个引用都会增加8个字节. 因此,例如,下面对象的足迹是80个字节。
class AnotherObject {
byte[] bytes = new byte[16];
}
现在假设我们缓存我们的对象,并假设缓存是一个美化的 HashMap
,因为它本质上存储了一个键值对。
考虑以下类。对于空字符串,它需要32个字节。
class Person {
String firstName;
String lastName;
}
假设你的键是16字节长的字符串,32字节的对象。
如果你把一个 Person
到缓存中,它需要
共计:80个字节
现在,假设我们单独存储字符串。对于每个键。
乘以x2。总计:128字节
只有在这种情况下,存储字符串而不是对象才有意义。
class StringWrapper
// the only field in the class
String string;
}
但即便如此,节省的成本也是微不足道的。
TL;DR:这是一个微观优化,在大多数时候并不值得。