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.

  1. Was ist schneller - heap (direct memory - test-Ergebnisse Anspruch heap
  2. Off-heap-Speicher vs DirectByteBuffer vs Heap - Off-heap zu sein scheint Schnellste
  3. 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 mal Unsafe.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[] zu int[] 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.

InformationsquelleAutor Bober02 | 2014-03-11
Schreibe einen Kommentar