看到javaeye上面讨论web机群负载时后面有一个关于缓存机制(memcach)中由于使用java对象序列化而导致时耗太大(后证明是错的),以及由于Java默认的序列化机制的开销过高,导致Java不太容易实现SNA架构。而SNA架构被证明是运行大容量网站的非常成功的方案(后证明也是是错的,序列化机制开销不高)
现整理下序列化一些知识:
java对象在序列化时,他分两个部分,首先是序列化类,然后序列化对象里得数据,序列化类得时候是采用深度优先得遍历 类和他引用到其他得类(和类加载过程一样)。
对于他得时耗
0:第一次使用序列化机制时,也应该会有些时耗。
1:序列化的开销主要是在初次序列化上,即一个类已经有对象被序列化过,那么以后再次序列化是几乎没有什么开销的。
2:因为有synchronized,所以在多线程情况大部分都开销在这个上面了,真正的序列化动作反而没什么开销。
序列化优化方案:
1:把所有需要序列化的对象的类提前初始化一次
2:自己实现writeObject那部分,去掉synchronized
对于在整个讨论中出现得测试用例,
可以很明确得看出
第一次序列化时,时耗大。
同类型同对象以后序列化时,由于jvm采用缓存技术,基本没有时耗,<1ms。
同类型不同对象以后序列化时,由于jvm已经加载过类了,这里仅序列对象数据,时耗也非常小,<1ms应该比上面得稍微大点。
而不同类型不同对象在序列化时(这里针对http://www.javaeye.com/topic/20298?page=16讨论区里charon测得平均时耗为2ms)这个应该是应为这些序列化对象,所引用得对象都相同,所以这里要省下一大部分时间,所造成得,应为在前面测试别得一个相似序列化对象时,把他所引用得对象已经序列化过了,所以如果要是重新序列化一个新的对象一般要比这个大一些,大概在10ms-50ms吧