【问题标题】:Pooling Protobuf POJOs池化 Protobuf POJO
【发布时间】: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


    【解决方案1】:

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

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

    https://github.com/google/protobuf/blob/master/docs/third_party.md

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多