簡體   English   中英

如何解析直接內存中的Google Protocol Buffers而不在Java中分配堆字節數組?

[英]How to parse Google Protocol Buffers that in the direct memory without allocating heap byte array in Java?

我正在嘗試將不在JVM堆中的ByteBuf解析為Google Protocol Buffer對象。 實際上它是Netty傳遞給我的直接內存字節緩沖區。

這就是我目前正在做的事情:

ByteBuf buf = ...;
ByteBufInputStream stream = new ByteBufInputStream(buf);
Message msg = MyPbMessage.getDefaultInstance().getParserForType().parseFrom(stream);

這可以工作。 但是,我發現這種類型的解析會為每條消息引入新的字節數組,並導致很多GC。

那么有沒有辦法在堆字節數組中創建避免這些? 即,直接從本機內存解析Google協議緩沖區字節。

你可以像Guava家伙在ThreadLocal中存儲一個小緩沖區(1024字節)的方式那樣做,如果它足夠就使用它,並且永遠不會在TL中放置更大的緩沖區。

只要大多數請求可以由它提供,這都可以正常工作。 如果平均/中位數太大,你可以選擇軟/弱參考,但是,如果沒有一些真正的測試,很難判斷它是否有幫助。

您可以組合這些方法,即在TL中使用強引用的小緩沖區和弱引用的大緩沖區。 你可以把你的緩沖池合並,你可以......

...但請注意,這一切都有其陰暗面。 浪費的記憶,延長的緩沖壽命導致他們向老一代推廣,在那里垃圾收集更加昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM