【发布时间】:2014-08-05 12:02:44
【问题描述】:
我使用 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。
【问题讨论】:
标签: java protocol-buffers