我尝试将不在JVM堆中的ByteBuf解析为Google Protocol Buffer对象。事实上,它是Netty传递给我的直接内存字节缓冲区。
这就是我目前正在做的事情:
ByteBuf buf = ...;
ByteBufInputStream stream = new ByteBufInputStream(buf);
Message msg = MyPbMessage.getDefaultInstance().getParserForType().parseFrom(stream);
这可行。但是,我发现这种类型的解析会为每条消息引入新的字节数组,并导致很多GC。
那么有没有办法在堆字节数组中避免这些?即,直接从本机内存解析Google Protocol Buffer字节。
答案 0 :(得分:0)
你可以这样做the way the Guava guys do在ThreadLocal中存储一个小缓冲区(1024字节),如果它足够就使用它,并且永远不会在TL中放置更大的缓冲区。
只要大多数请求可以由它提供,这个就可以正常工作。如果平均/中位数太大,你可以选择软/弱参考,但是,如果没有一些真正的测试,很难判断它是否有帮助。
您可以组合这些方法,即在TL中使用强引用的小缓冲区和弱引用的大缓冲区。你可以把你的缓冲池合并,你可以......
...但请注意,这一切都有其阴暗面。浪费的记忆,延长的缓冲寿命导致他们向老一代推广,垃圾收集更加昂贵。