Java - Heap-vs Direct memory access
Ich zur überprüfung kam über sun.misc.Unsafe
Klasse, Benutzer erlaubend, allocate,deallocate und in allgemein zugänglichen Speicher in ähnlicher Weise wie in C. ich lese ein paar blogs, die dieses Problem angehen, z.B.
- Was ist schneller - heap (direct memory - test-Ergebnisse Anspruch heap
- Off-heap-Speicher vs DirectByteBuffer vs Heap - Off-heap zu sein scheint Schnellste
- Memory-mapped-Dateien für time series data -
MappedByteBuffer
schneller als heap-Objekte
Artikel 1) zu sein scheint, in Widerspruch mit den anderen, und ich kann nicht begreifen, warum. DirectMemoryBuffer ist mit sun.misc.Unsafe
unter der Haube (so ist MappedByteBuffer
), so sollte Sie auch leiden an JNI-Aufrufe wie im Artikel beschrieben 1. Auch in Artikel 2, die Off-heap-Speicher zugreift, ähneln denen, die in Artikel 1, und die völlig entgegengesetzten Ergebnissen.
Könnte mir jemand generell sagen, wie zu gehen mit Off-heap-Speicher, d.h., wenn es zu benutzen, ist es von großem nutzen, und vor allem, warum ähnliches Thema gibt höchst unterschiedliche Ergebnisse, basierend auf den oben genannten Artikel? Danke.
- Jedes mal, wenn Sie Unsicher oder gehen nach einer einheitlichen Methode, die Sie zahlen eine anfängliche Aufwand, nur um dorthin zu gelangen und die Dinge so einzurichten. Als solche, auch wenn es eine (leichte) performance-Vorteil, es nicht "kick in", es sei denn, Sie beschäftigen sich mit der relativ groß (megabyte-Größe) Daten-Strukturen. Als wenn die Verwendung dieser Anlagen, bis Sie die Antwort auf Ihre eigenen Fragen vor, die Sie nicht benutzen sollten-es ist wirklich einfach zu eff Dinge, für sehr wenig nutzen.
- Lecken: OK, ich verstehe, dass Punkt. Nun meine weitere Frage ist - wenn ich 1000 Objekten der Größe 10 bytes, und ich Ruf 1000 mal
Unsafe.putInt
(einmalig pro Objekt, Adresse), wie geht das unterscheiden von anrufen 1000 malUnsafe.putInt
auf 10.000 byte Objekt, jedes mal mit einem anderen offset, d.h. 0, dann 4, 8 usw? Wo ist der performance-Gewinn, da sollten wir über die JNI-Schranke genau 1000-mal in beiden Fällen? - Zu bewegen, nur 10 bytes (oder 4, wenn es wirklich putInt) wahrscheinlich gibt es keinen performance-Gewinn, in jedem Szenario.
- Auch nicht nach dem Artikel, was genau das ist, was ist mir rätselhaft...
- Verstehen, dass "der Haufen" ist nicht eingekapselten Brocken von etwas, das Sie haben, um hebeln auseinander jedes mal, wenn Sie darauf zugreifen. Es ist eher die "Suppe", dass Ihr Java-Programm ist floating in, und der Zugriff ist so einfach wie das ausführen einer einzigen "load" - Anweisung in die CPU. Unsichere ist nur besser, wenn Sie führen können, um "unsichere" Dinge, wie das kopieren von Daten direkt aus einem byte-array ein int-array. Auch die standard -
int[]
zuint[]
array kopieren genauso schnell oder schneller mit System.arraycopy vs gehen Sie zu Unsicher. - (Und zu verstehen, dass Sie können erstellen Sie einen benchmark um zu beweisen, alles was Sie wollen.)
- Danke, so was sind die Empfehlungen für die Verwendung der Unsichere dann? Bei der Zuteilung einen großen Teil des Speichers, wenn mit MemoryMappedFiles... ?
- Wenn Sie es brauchen. Memory-mapped-Dateien, die vielleicht dem einen Fall (obwohl ich denke, dass nio verarbeiten kann, einige, die zimmerreserviereung, ohne das Sie explizit nicht sicher). Und, natürlich, wenn Sie überlegungen, die Sie verwenden es implizit.
- Hier ist eine Recht gute übersicht: javacodegeeks.com/2013/12/... (bitte Beachten Sie insbesondere, wie kompliziert-und zu langsam -- die Berechtigungsprüfung ist.)
- Der 1. link Anmeldeinformationen erfordert. Entweder entfernen oder noch besser es mit einem anderen ersetzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1). Die Arbeit mit Nativen Speicher von Java hat seine Verwendungen an, wie wenn Sie
müssen für die Arbeit mit großen Datenmengen (> 2 Gigabyte) oder wenn Sie
möchten Flucht aus dem garbage collector. Doch in Bezug auf
Latenz, direct-memory-access von der JVM nicht schneller als
der Zugriff auf den heap wie oben gezeigt. Die Ergebnisse tatsächlich machen
sinnvoll, da die überquerung der JVM-Sperre muss Ihren Preis haben. Das ist die
gleiche dilema zwischen der Verwendung einer direkten oder einer heap-ByteBuffer. Die Geschwindigkeit
Vorteil des direkten ByteBuffer ist nicht auf Geschwindigkeit, sondern die
die Fähigkeit zu sprechen Sie direkt mit dem Betriebssystem die native I/O
Operationen. Ein weiteres gutes Beispiel besprochen von Peter Lawrey ist die
die Verwendung von memory-mapped-Dateien, die beim arbeiten mit Zeit-Serie.
Quelle: http://mentablog.soliveirajr.com/2012/11/which-one-is-faster-java-heap-or-native-memory/
2). Off-heap über die Unsichere ist rasend schnell, mit 330/11200 Millionen/Sekunde
Die Leistung für alle anderen Arten der Zuweisung ist entweder gut für Lesen oder schreiben, keine der Zuteilung ist für beide gut.
Besonderer Hinweis zu ByteBuffer, es ist erbärmlich , ich bin sicher, Sie werden nicht diese nach zu sehen, wie die Anzahl. DirectBytebuffer saugt Lesegeschwindigkeit, ich bin nicht sicher, warum es so langsam ist.Also, wenn Speicher schreiben/Lesen ist immer Flaschenhals in deinem system ist, dann ist definitiv Off-heap ist der Weg zu gehen, erinnern, es ist die Autobahn, fahren Sie also mit Sorgfalt.
Soruce: http://www.javacodegeeks.com/2013/08/which-memory-is-faster-heap-or-bytebuffer-or-direct.html
Unsafe
Methode. So bin ich immer noch nicht, wie sich die tests unterscheiden, und wo die Abweichungen liegen.