我使用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。
答案 0 :(得分:2)
Google的官方Java Protobuf实现(我写的)不支持这一点,因为它支持不变性作为设计质量。对于基于JVM的大型服务器,这通常很有效,因为GC对于短期对象非常好。
但是,这确实会导致某些用例出现问题,特别是在移动设备上。为此,许多人编写了专门针对更受限制的环境的替代Java Protobuf实现。也许其中一个适合你。列表在这里: