gpt4 book ai didi

java - 池化 Protobuf POJO

转载 作者:行者123 更新时间:2023-11-30 03:47:59 26 4
gpt4 key购买 nike

我使用 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。

最佳答案

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

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

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

关于java - 池化 Protobuf POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138361/

26 4 0