概述:
进行Java序列化,最重要的是序列化的格式,常用的有bson ,msgpack,protobuffer等。然而这些格式需要额外的配置文件或者注解等,需要对使用者的代码产生侵入,或者产生额外的工作。好的序列化框架应该只通过class定义信息一种渠道获取信息。FST使用Kson格式存储数据,KSON通过反射获取类定义的元数据信息,无需其他配置文件。
具体而言,KSON是一种json的扩展格式,将object进行序列化存储。
In C++, one needs to sacrifice performance in order to get convenience, in Java one needs to sacrifice convenience in order to get performance
FST通过反射获取类信息,反射的效率并不高,因此可以在启动的时候,对类信息进行注册,并缓存类的metaData信息,提高效率。
另外,为了节约内存,减少GC停顿,FST提出了FST Structs的概念,允许将结构化的数据存储在连续的内存块中,减少内存碎片。连续的内存可以通过byte[] array或者使用native的方式在java的堆外进行申请(使用unsafe类型即可)。
FST Structs的原因:
FST将meta信息保存在序列化后的数据中的优点是decode时,不需要访问类信息。这一点在跨语言时,特别有用。然后存在的问题就是所有序列化后的类型中均包含元数据信息,及其冗余。 因此,根据不同的使用场景,FST并非完全cover。
具体而言,KSON是一种json的扩展格式,将object进行序列化存储。
In C++, one needs to sacrifice performance in order to get convenience, in Java one needs to sacrifice convenience in order to get performance
FST通过反射获取类信息,反射的效率并不高,因此可以在启动的时候,对类信息进行注册,并缓存类的metaData信息,提高效率。
另外,为了节约内存,减少GC停顿,FST提出了FST Structs的概念,允许将结构化的数据存储在连续的内存块中,减少内存碎片。连续的内存可以通过byte[] array或者使用native的方式在java的堆外进行申请(使用unsafe类型即可)。
FST Structs的原因:
- 内存更便宜了,但是随着堆内内存的加大,GC的停顿时间更长了;
- Java中的结构化数据存储在堆内性能消耗很大,例如,A String member of a class with value "A" requires 60 to 80 bytes on the heap (depends on VM version and 32/64 bit), which means >90% memory overhead.Frequently your 60 GB on-heap data structures boil down to some 5GB stored in packed structs.
- 利于进行跨进程调用。
FST将meta信息保存在序列化后的数据中的优点是decode时,不需要访问类信息。这一点在跨语言时,特别有用。然后存在的问题就是所有序列化后的类型中均包含元数据信息,及其冗余。 因此,根据不同的使用场景,FST并非完全cover。
FST的限制:
- stick with pojos,个人认为只有对pojo进行序列化才是比较合理的。
- supported collections: Map's, List's
- Use strong typing in class definition
自己实现序列化工具时,需要注意的点:
- 序列化基础类型时,注意大小端,否则linux和windows将会出现不兼容现象;
- 注意读取注解,避免序列化不需要的Field;
- 注意扩展使用off-Heap Map/Memory Map Files;
- 注意循环引用的处理。
没有评论:
发表评论