为什么Java反序列化受CPU约束?

a3n*_*3nm 5 java performance serialization deserialization

我有一个Java程序,它将数据准备到内存中相当复杂的大数据结构(几GB)并将其序列化到磁盘,另一个程序读取内存中的序列化数据结构.我惊讶地注意到反序列化步骤非常慢,并且它受CPU限制.(100%的CPU使用率,top但只读取3到5 MB/s iotop,这对于硬盘驱动器上的顺序读取来说非常低).CPU是最新的(Core i7-3820),结构适合内存,没有配置交换空间.

为什么会这样?是否有另一种方法可以在Java中序列化没有CPU作为瓶颈的对象?

这是反序列化代码,如果重要的话:

FileInputStream f = new FileInputStream(path);
ObjectInputStream of = new ObjectInputStream(f);
Object obj = of.readObject();
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 4

反序列化非常昂贵。如果使用通用反序列化,它将使用大量的反射和对象创建。

有很多更快的替代方案,并且大多数使用生成的代码而不是反射。

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

您会注意到最快的方法之一是使用Externalized,这可能是您的一个选择。这意味着添加用于对象序列化和反序列化的自定义方法。

我已经编写了很多最快的方法,但这避免了通过回收它们或就地使用文件中的数据来创建任何对象(即不需要反序列化它们)