[英]how to write a file without allocating the whole byte array into memory?
[英]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.