Ich bin Benchmark-Warteschlange für einen unserer Anwendungsfälle und bemerkte, dass readDocument() API des ExcerptTailer erstellt zu viel Müll! JFR zeigt, dass der Prozess etwa 66% der Zeit im darunter liegenden Stapel verbringt.Chronicle Queue StoreTailer.next() Erstellen riesiger Müll
Welche Version von Chronicle Queue verwende ich?
net.openhft: Chronik-Warteschlange: 4.5.9
Wie erschaffe ich die Warteschlange?
queue = SingleChronicleQueueBuilder.binary(filename).build();
appender = queue.acquireAppender();
tailer = queue.createTailer();
//Snippet to read
tailer.readDocument(r -> {
//Reading some context here
});
Wie viel Müll erstellt?
Rund 11 GB 3 Minuten
Stacktrace
Stack Trace TLABs Total TLAB Size(bytes) Pressure(%)
byte[] java.lang.StringCoding$StringEncoder.encode(char[], int, int) 167 6,593,171,600 52.656
byte[] java.lang.StringCoding.encode(String, char[], int, int) 167 6,593,171,600 52.656
byte[] java.lang.String.getBytes(String) 167 6,593,171,600 52.656
String[] java.io.UnixFileSystem.list(File) 167 6,593,171,600 52.656
String[] java.io.File.list() 167 6,593,171,600 52.656
String[] net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.getList() 167 6,593,171,600 52.656
void net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.setFirstAndLastCycle() 167 6,593,171,600 52.656
int net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.firstCycle() 167 6,593,171,600 52.656
long net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.firstIndex() 167 6,593,171,600 52.656
boolean net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.next(boolean) 167 6,593,171,600 52.656
Was hat versuche ich?
Ich habe JitWatch verwendet und die Bytecode-Größe für die Escape-Analyse von 150 Byte auf 516 Byte erhöht. Ich habe festgestellt, dass die readDocument-Methode JIT-kompiliert ist.
Irgendwelche Vorschläge für den nächsten Schritt?
Danke, Peter. Das habe ich getan. Übrigens, tolles Stück Software! – KodeWarrior
Eines der Dinge, die noch immer ein Rätsel sind, ist, warum Variablen nicht durch Fluchtanalyse eliminiert wurden. – KodeWarrior
@KodeWarrior AFAIK Arrays werden nicht auf den Stapel gelegt, und selbst wenn sie dies tun, wird alles, auf das sie zeigen, nicht auf den Stapel gelegt. –