【问题标题】:how to slice bytebuffer WITHOUT creating garbage如何在不产生垃圾的情况下对字节缓冲区进行切片
【发布时间】:2016-01-11 19:30:48
【问题描述】:

我正在尝试使用ByteBuffer 作为类的内部存储。我想从调用者那里抽象出flip()ByteBuffer 操作,但也不想使用slice(),因为它会产生额外的垃圾。

是否有任何替代方案或设计建议?

【问题讨论】:

  • 您能否详细说明您想如何分割ByteBuffer?如果您保留顶级ByteBuffer,那实际上并不是任何额外的垃圾。
  • 假设我有一个类:Class X { ByteBuffer get(){ return temp.slice(); } void set(ByteBuffer in){ temp.clear(); //复制 temp.flip() } } 我怎样才能重写 get 使得我不创建垃圾,而不是给调用者一个调用者需要翻转的字节缓冲区

标签: java performance garbage-collection bytebuffer low-latency


【解决方案1】:

假设您在热点上运行并且只要切片的生命周期非常短暂,例如立即在创建它的方法或其调用者中使用,那么escape analysis 应该能够消除该分配。

这是一个 JVM 优化,所以不能保证它会发生,但一般来说已经足够了,不用担心这些事情。

此外,年轻的 GC 非常高效。即使 EA 不介入,这种短命对象的成本也非常低。

此外,您应该避免过早的优化。一旦你测量了性能并找出了真正的瓶颈所在,就应该担心这些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2016-08-17
    • 2018-04-08
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多