2012-04-02 5 views
4

Ist es möglich, die Speicherverwaltung selbst durchzuführen? z.B. Wir reservieren einen Teil des Speichers außerhalb des Heap-Bereichs, so dass er nicht dem GC unterliegt. Und wir kümmern uns selbst um die Zuordnung/Freigabe von Objekten aus diesem Speicherbereich.Java - Können wir unser eigenes Speichermanagement machen?

Einige Leute haben auf Frameworks wie Jmalloc/EHcache hingewiesen. Eigentlich möchte ich mehr verstehen, wie sie es tatsächlich tun.

Ich bin in Ordnung mit einigen direkten Ansatz oder sogar einige indirekte Ansatz (z. B. erste Java-Objekte serialisieren).

+2

Warum möchten Sie das tun? Nur neugierig. –

+0

Die Klasse [Unsafe] (http://www.docjar.com/docs/api/sun/misc/Unsafe.html) kann Ihnen möglicherweise helfen, seltsame Dinge zu tun ... – assylias

+0

Siehe auch: http://StackOverflow.com/questions/5574241/interesting-of-sun-misc-unsafe – assylias

Antwort

5

Sie können keine Java-Objekte an einem fremden Speicherort zuordnen, aber Sie können Speicher zuordnen, der z. in einer nativen Bibliothek in eine direkte ByteBuffer zugewiesen, um es aus Java-Code zu verwenden.

2

Wenn Sie Java-Objekte meinen, dann ist dies mit Standard-VMs nicht möglich. Obwohl Sie die VM immer ändern können, wenn Sie experimentieren möchten (Jikes RVM wurde zum Beispiel für diesen Zweck erstellt), aber bedenken Sie, dass das Ergebnis nicht wirklich Java sein wird.

Wie bei der Speicherzuweisung für Nicht-Java-Datenstrukturen ist dies möglich und wird regelmäßig von nativen Bibliotheken durchgeführt und es gibt sogar Java-Unterstützung (in den anderen Antworten erwähnt), mit dem allgemeinen Vorbehalt, den Sie können sehr leicht mit sich selbst zerstören.

+0

können Sie bitte weitere Details zur Zuweisung für Nicht-Java-Datenstrukturen angeben. Ich bin in Ordnung, meine Objekte in eine serialisierte/Byte-Pufferform zu konvertieren. Wird eine Java-Lösung dafür funktionieren? – ManojGumber

+0

@ManojGumber Die anderen zwei Antworten enthalten Hinweise dazu: die Verwendung von direkten ByteBuffers ist eine Möglichkeit oder Sie können eine High-Level-Bibliothek wie jmalloc oder BigMemory verwenden. Aber Sie sollten das wirklich nur in der Produktion verwenden, wenn GC der größte Engpass ist. – biziclop

3

Sie können die aus dem Beispiel Blick für die Halde Speicher Ansatz jmalloc

und dies ist auch nützlich Link Difference between on and off the heap

+0

Ich möchte mehr verstehen, dass Frameworks wie jmalloc und EHCache es zum Beispiel tun. – ManojGumber

+0

@MonojGumber: Der zugrunde liegende Mechanismus ist höchstwahrscheinlich nicht in Java, sondern in nativem Code geschrieben. Die Bibliothek stellt dann eine Java-Schnittstelle zur Verfügung. –

+0

Es kann auf der jmalloc-Projektseite gelesen werden, dass sie Serialisierung verwenden.Dies ist eine gute Idee, große Objekte zu speichern, aber nicht wirklich leistungsfähig. – Neet

3

ich eine Bibliothek verwenden, die diese Art der Sache tut. Sie erstellen Auszüge, die als wiederbeschreibbare Objekte oder Ereignisse in der Warteschlange verwendet werden können. Es verfolgt, wo Objekte beginnen und enden. Der Nachteil ist, dass die Bibliothek annimmt, dass Sie alle Objekte einmal am Tag oder in der Woche durchlaufen werden. d.h. es gibt keine Reinigung als solche. Auf der anderen Seite ist es sehr effizient, kann in einer ereignisgesteuerten Weise verwendet werden, beharrt und kann zwischen Prozessen geteilt werden. Sie können Hunderte von GB Daten haben, während Sie nur ein paar MB Heap verwenden.

https://github.com/peter-lawrey/Java-Chronicle

BTW: Es unterstützt ByteBuffers oder für zusätzliche Leistung durch Unsafe verwenden.

+0

Es sieht wirklich interessant aus .... Ich werde durch diese API gehen – ManojGumber

+0

Auch wenn Sie es nicht verwenden, kann es Ihnen einige Ideen geben. –

Verwandte Themen