Wirklich null Müllsammlungen? "Ja wirklich?"
Wenn ja, würde ich eine von zwei Optionen vorschlagen:
- Verwenden Sie ein real-time JVM. Es gibt Optionen für die Verwaltung von fast allem, was allgemeine Anwendungen von weichen zu harten Echtzeitsystemen unterscheidet.
- Denken Sie sehr ernsthaft darüber nach, nur viel mehr Speicher zuzuweisen, als während eines bestimmten Laufs benötigt wird. Dies ist keine ausgeklügelte Lösung, aber wenn Sie über genügend Arbeitsspeicher verfügen, versuchen Sie, Ihrem Kernspeicher 10 Mal mehr zuzuweisen, als Sie erwarten. Es könnte einfach funktionieren und, Sie müssen zugeben, RAM ist billiger als Software-Engineering-Arbeit.
EDIT viel später:
Es kam nur zu mir, dass Sie Ihre Byte-Array Zuweisung statisch in Betracht ziehen sollten. Das heißt, so etwas wie diese:
/** Byte arrays that you absolutely have to keep. */
public class KeepForever {
/** Note that I make no claims about thread safety in this simple example. */
public static byte [] keepMe = new byte[100];
};
// Much later in example code ....
/** This should always succeed. No worries about garbage collection. */
public void setMe(int index, byte newByte) {
// Admittedly, this defeats several principles of OOD but it makes
// the point about the syntax.
KeepForever.keepMe[index] = newByte;
}
Kann ich die Frage stellen: Warum? Warum möchten Sie kein GC in Ihrer Anwendung und warum möchten Sie das Array gepinnt? – Mnementh
Ich versuche, RDMA in meinen Prozess zu integrieren, und ich möchte die bestmögliche Leistung erzielen. Ich möchte keine GC in meiner Anwendung, weil meine Anwendung sehr latenzempfindlich ist, und es darf nie pausieren, nicht einmal für 3ms. Ich möchte Byte-Arrays gepinnt und nicht direkt Byte-Puffer, weil Byte-Array-Zugriff Leistung ist viel besser als Byte-Puffer. –