jhunters / jprotobuf

A useful utility library for java programmer using google protobuf
Apache License 2.0
897 stars 283 forks source link

feat(Jprotobuf): Avoid create lot of CodedOutputStream instance! #185

Closed qiunet closed 2 years ago

qiunet commented 2 years ago

压测在线3K. 每秒每人发30包 收20包. 每次ygc(11秒). 会创建两千万的CodedOutputStream 和 ByteArrayOutputStream. 和大量的字节数组对象

   2:      23799859      951994360  com.google.protobuf.CodedOutputStream$OutputStreamEncoder
   3:      23800055      571201320  java.io.ByteArrayOutputStream

因为处理序列化和反序列化没有切换线程, 可以使用ThreadLocal做对象缓存优化. 优化后, 几乎可以忽略. 我这固定是160个对象. YGC时间也延长到18秒.

   388:           160           6400  com.google.protobuf.CodedOutputStream$OutputStreamEncoder
   361:           421          10104  java.io.ByteArrayOutputStream

但是使用ByteBuffer构造CodedOutputStream 以及 CodedInputStream ,我没有找到好的优化方案

qiunet commented 2 years ago

现在使用Netty的ByteBufOutputStream参考类似方法, 也可以实现对象缓存. 可以不用在堆内存里面产生大量的byte[]了!

jhunters commented 2 years ago

合入到2.4.17版本发布