versucht, Java-Objekte im zusammenhängenden Speicher zu speichern

7

Ich versuche eine Cache-ähnliche Sammlung von Objekten zu implementieren. Der Zweck besteht darin, durch Lokalität im Speicher schnellen Zugriff auf diese Objekte zu haben, da ich wahrscheinlich mehrere Objekte gleichzeitig lesen werde. Ich speichere gerade Objekte in einem Java Collection-Objekt wie Vektor oder Deque. Aber ich glaube nicht, dass dies zusammenhängenden Speicher nutzt.

Ich weiß, dass das in C gemacht werden kann, aber kann es in Java gemacht werden? Diese Objekte können unterschiedliche Längen haben (da sie Zeichenfolgen enthalten können). Gibt es eine Möglichkeit, zusammenhängende Speicher über Java zuzuweisen? Gibt es ein Java-Auflistungsobjekt, das würde?

Bitte lassen Sie es mich wissen.

Danke, jbu

    
jbu 25.03.2009, 17:00
quelle

4 Antworten

14

Sie können es nicht erzwingen. Wenn Sie alle Objekte in schneller Folge zuweisen, sind wahrscheinlich zusammenhängend. Wenn Sie sie jedoch in einer Sammlung speichern, kann nicht garantiert werden, dass die Sammlung den tatsächlichen Werten entspricht. (Die Sammlung enthält Verweise auf die Objekte und nicht die Objekte selbst.)

Außerdem wird die GC-Komprimierung Werte im Speicher verschieben.

Haben Sie Ihre App tatsächlich profiliert und festgestellt, dass dies ein Flaschenhals ist? In den meisten Fällen würde ich erwarten, dass andere Optimierungen Ihnen auf eine zuverlässigere Weise helfen können.

    
Jon Skeet 25.03.2009 17:05
quelle
8

Nein, Sie können diesen Ort der Referenz nicht garantieren.

Wenn Sie ein Byte-Array zuordnen oder einen zugeordneten Byte-Puffer aus den nio -Paketen verwenden, können Sie einen Teil des zusammenhängenden Speichers abrufen, aus dem Sie die gewünschten Daten dekodieren können (das Deserialisieren der Objekte von Interesse aus diesem Chunk) der Erinnerung). Wenn Sie jedoch wiederholt auf die gleichen Objekte zugreifen, würde der Deserialisierungsaufwand wahrscheinlich den Zweck nicht erfüllen.

    
erickson 25.03.2009 17:06
quelle
4

Haben Sie diesen Code noch in Java geschrieben? Und wenn ja, haben Sie es profiliert? Ich würde argumentieren, dass Sie sich wahrscheinlich keine Gedanken darüber machen müssen, dass die Objekte zusammenhängend sind - die JVM ist besser in der Speicherverwaltung als in einer Garbage Collection-Umgebung.

Wenn Sie wirklich an der Leistung interessiert sind, ist Java vielleicht nicht das richtige Werkzeug für den Job, aber mein Bauchgefühl ist es, Ihnen zu sagen, dass Sie sich zu früh um Optimierung sorgen und dass eine Java-Version Ihres Codes Arbeiten mit nicht zusammenhängendem Speicher werden wahrscheinlich Ihren Bedürfnissen entsprechen.

    
Rob Ringham 25.03.2009 17:05
quelle
-1

Ich schlage vor, eine HashMap (keine Threads) oder Hashtable (Threading) für Ihren Cache zu verwenden. Beide speichern ein Objekt in einem Array in der Sonne jvm. Da alle Objekte in Java als Referenz übergeben werden, sollte dies als ein Array von Zeigern in c dargestellt werden. Meine Wette ist, dass Sie eine vorzeitige Optimierung durchführen.

Wenn Sie dies unbedingt haben müssen, haben Sie zwei Möglichkeiten:

1) Benutze JNI und schreibe es in c. 2) Erhalte einen BIG-Byte-Puffer und benutze ObjectOutputStream, um Objekte in ihn zu schreiben. Dies wird wahrscheinlich sehr langsam im Vergleich zu einer Hash-Tabelle sein.

    
KitsuneYMG 25.03.2009 17:08
quelle

Tags und Links