You are allocating the buffer every time through the loop, this will do a bunch of extra work and also risks OOMing direct byte buffer  memory because they are collected lazily through finalization. For a buffer you will allocate once and then reuse many times it is fine to rely on the JVM to GC it, but otherwise you need to reuse it or have a pool do it for you.

If you were to allocate it outside the loop it would be fine as long as the number of StreamSnapshotDataReceivers is small enough.

Most places we either pool (locally in the class or globally via DBBPool) or reuse it for the life of the object and then let the JVM pick it up later.

How many data receivers are there?