汇集Protobuf POJO

时间:2014-08-05 12:02:45

标签: java protocol-buffers

我使用protobuf作为数据记录器的编码机制。远程客户端将通过TCP发送消息(以protobuf编码),应用程序将写入磁盘。将消息写入磁盘后,将删除其唯一的内存引用,并在适当的时候进行垃圾回收。

由于我期待的消息量很大(特别是"突发"),我正在尝试优化解决方案。

为了减少GC,我想将protobuf POJO集中在一起。让我们假设我正在录制动作,我的protobuf被定义为:

message Action {
    required string user;
    required long time;
    required string action;
}

这会生成所需的代码,包括静态方法Action.parseFrom(byte[]),我用它来从TCP套接字读入对象。每次调用此对象时,都会调用PARSER.parsePartialFrom(...),为每个收到的消息创建一个新的Action对象

我在API中看不到任何能够提供这些对象池的选项,这些对象可以重新用于重新循环Action POJO,除非我破解生成的代码并将其检入源代码控制(我不愿意这样做)。

有什么建议吗?

在客户端创建消息时,我也遇到类似的问题。每次调用buildPartial()都会创建一个新的POJO。

1 个答案:

答案 0 :(得分:2)

Google的官方Java Protobuf实现(我写的)不支持这一点,因为它支持不变性作为设计质量。对于基于JVM的大型服务器,这通常很有效,因为GC对于短期对象非常好。

但是,这确实会导致某些用例出现问题,特别是在移动设备上。为此,许多人编写了专门针对更受限制的环境的替代Java Protobuf实现。也许其中一个适合你。列表在这里:

https://code.google.com/p/protobuf/wiki/ThirdPartyAddOns