Использование byte[]
требует выделения нового каждый раз при изменении размера. Вы не можете изменить размер byte[]
.
Вместо этого я предлагаю использовать класс Bytes
, размер которого можно изменять, не создавая большого количества мусора (только иногда, когда он растет).
package run.chronicle.queue;
import net.openhft.chronicle.bytes.Bytes;
import net.openhft.chronicle.wire.BytesInBinaryMarshallable;
import net.openhft.chronicle.wire.LongConversion;
import net.openhft.chronicle.wire.MilliTimestampLongConverter;
public class Message extends BytesInBinaryMarshallable {
private final Bytes text = Bytes.allocateElasticOnHeap();
@LongConversion(MilliTimestampLongConverter.class)
private long timeStamp;
//Getters and Setters
public Bytes getText() {
return text;
}
public void setText(CharSequence text) {
this.text.clear().append(text);
}
public long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(long timeStamp) {
this.timeStamp = timeStamp;
}
}
См. этот пример https://github.com/OpenHFT/Chronicle-Queue-Demo/tree/master/messages-with-text
При запуске с небольшой кучей -Xmx128m -XX:NewSize=96m -verbose:gc MessageMain
вы можете видеть, что миллионы сообщений не вызывают никаких сборов.
Read 10,000,000 of 10,000,000 messages in 7.990 seconds
Read 10,000,000 of 10,000,000 messages in 6.907 seconds
[main] INFO net.openhft.chronicle.bytes.MappedFile - Took 2 ms to add mapping for test-438402668456/metadata.cq4t
Read 10,000,000 of 10,000,000 messages in 6.836 seconds
[main] INFO net.openhft.chronicle.bytes.MappedFile - Took 2 ms to add mapping for test-445239126125/metadata.cq4t
Read 10,000,000 of 10,000,000 messages in 6.883 seconds
[main] INFO net.openhft.chronicle.bytes.MappedFile - Took 3 ms to add mapping for test-452122895277/metadata.cq4t
Read 10,000,000 of 10,000,000 messages in 7.013 seconds
Read 10,000,000 of 10,000,000 messages in 6.838 seconds
[main] INFO net.openhft.chronicle.bytes.MappedFile - Took 2 ms to add mapping for test-465974753213/metadata.cq4t
person
Peter Lawrey
schedule
25.01.2021