JVM keine garbage collection
Ich gelesen habe in vielen threads, dass es unmöglich ist, schalten Sie die garbage collection auf der Sun JVM. Jedoch für die Zwecke unserer Forschung-Projekt benötigen wir diese Funktion. Kann jemand empfehlen, eine JVM-Implementierung, die keine garbage collection, oder die es ermöglicht, Sie auszuschalten? Danke.
- Java ohne garbage collection, ist, wie gut C/C++ !!!
- Nach forums.java.net/jive/thread.jspa?messageID=208939&tstart=0 gc deaktiviert werden können, die in früheren Versionen von Java, aber es ist nicht mehr möglich.
- Weizen, keine. es ist weit von C++, es gibt keine buffer overflows, und wenig bis gar kein Undefiniertes Verhalten.
- auf
- Es gibt auch keinen memory-Rückgewinnung ohne GC, so würden Sie Leck wie verrückt.
- Ich kann nicht finden, etwas, wo ich, sollte zum deaktivieren der gc. Für was brauchen Sie es?
- nun, es klingt wie er gerade will, um performance-test ohne GC-overhead, würde wahrscheinlich machen sehr viel mehr Sinn, dies zu tun mit dem hinzufügen von expliziten löscht, um die Sprache und den Test einige code für die Sprache geändert... :/
- Als ich sagte unten, ich fange ein Forschungs-Projekt, und ich bin versucht zu finden, eine einfache schnelle Möglichkeit für einen ersten proof-of-concept, um alle Objekte im Speicher
- Halten Sie alle Objekte im Speicher, ist eine andere Frage als die Deaktivierung der GC. Sie können alle Objekte im Speicher durch die Beibehaltung der Verweise auf Sie. Wenn Sie brauchen, um dies zu tun mit jedem Objekt, können Sie in der Lage sein, mit der Umsetzung einiger Instrumente wieder aufleben Objekte in Ihrer finalizer durch die Schaffung einer neuen, erreichbar, starker Bezug zum
this
oder vielleicht einfach nicht zulassen, dass der finalizer immer komplett durch den AufrufThread.yield()
. - Java ohne gc ist so ziemlich unmöglich. Jede kleine Funktion in Java reserviert sich etwas, sei es das array für die
main
Methode oder Strings. An dieser Stelle, warum nicht wählen Sie eine geeignete Sprache?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den einfachen Weg, dies zu tun ist, die zum ausführen der JVM mit einem Haufen, der so groß ist, dass der GC nie ausgeführt werden muss. Legen Sie die
-Xmx
und-Xms
Optionen auf einen großen Wert, und schalten Sie den GC-Protokollierung, um zu bestätigen, dass die GC nicht laufen für die Dauer des Tests.Wird dies schneller und einfacher als das ändern der JVM.
(Im Nachhinein, das kann nicht funktionieren. Ich vage erinnere mich, Beweise, die impliziert, dass die JVM nicht immer respektieren die
-Xms
Einstellung, vor allem, wenn es wirklich groß. Dennoch, dieser Ansatz ist einen Versuch Wert, bevor Sie versuchen, einige viel schwieriger Ansatz ... wie das ändern der JVM.)Auch, diese ganze Sache erscheint mir als unnötig (sogar kontraproduktiv) für das, was Sie eigentlich versuchen zu erreichen. Die GC nicht wegwerfen, Objekte, es sei denn, Sie sind Müll. Und wenn Sie Müll, werden Sie nicht in der Lage, Sie zu nutzen. Und die Leistung eines Systems mit GC deaktiviert /negiert ist nicht zu bezeichnend, wie ein real Anwendung ausgeführt werden.
Je nach Ihren Bedürfnissen das könnte vielleicht funktionieren:
Mithilfe der -Xbootclasspath option können Sie Ihre eigene Implementierung der API-Klassen. Sie könnte dann zum Beispiel das überschreiben der Implementierung-Objekt, und fügen Sie den Konstruktor, eine
globalList.add(this)
um zu verhindern, dass die Objekte von der Speicherbereinigung. Es ist ein hack ist sicher, aber für einfachen case-study ist es vielleicht ausreichend.Eine andere option ist ein open-source-jvm und kommentieren Sie die Teile, die Einleitung der garbage collection. Ich würde vermuten, es ist nicht so kompliziert.
Sun JVM hat keine solche option. Soweit ich weiß, keine andere JVM hat diese option entweder.
Ihnen nicht sagen, was es ist, dass Sie genau zu erreichen versucht, aber Sie haben zwei Optionen: entweder verwenden Sie einen profiler und sehen genau das, was der GC macht, ist, dass Sie können so Ihre Effekte zu berücksichtigen. Die andere ist, zu kompilieren eine der JVMs von der Quelle, und deaktivieren GC von dort.
Vielleicht könnten Sie versuchen, indem Sie Ihre VM ' s verfügbaren Speicher ausreichend für die GC nie ausgeführt werden.
Meine (allbeit begrenzte) Erfahrung führt mich zu vermuten, dass die VM ist standardmäßig extrem faul und äußerst ungern GC.
geben -Xmx 16384M (oder so) und darauf achten, dass Ihre Forschung Thema bleibt weit unter dieser Grenze, könnte Ihnen die Umgebung, die Sie erhalten wollen, die, obwohl selbst dann wird es natürlich nicht garantiert werden.
Können Sie nur schalten Sie den GC, wenn die nicht wirklich benötigt werden (sonst wird Ihre Anwendung mit run out of memory) und wenn Sie nicht brauchen, um GC, es sollte nicht laufen sowieso.
Die einfachste Möglichkeit wäre, nicht zum verwerfen von Objekten, dadurch wird vermieden, GC durchgeführt wird (Und legen Sie den max. - Speicher sehr hoch, so dass Sie nicht ausführen aus).
Können Sie feststellen, dass Sie bekommen GCs auf Start und Sie können prüfen, ein no-GC beim laufen akzeptabel.
Besteht tatsächlich ein dirty hack, um vorübergehend anzuhalten GC. Erstellen Sie zunächst eine dummy-array in Java. Dann, im JNI verwenden GetPrimitiveArrayCritical Funktion zu erhalten, halten Sie den Zeiger auf das array. Die Sun JVM deaktivieren GC, um sicherzustellen, dass das array wird nie bewegt und der Zeiger gültig bleibt. Zu re-aktivieren, GC, können Sie die ReleasePrimitiveArrayCritical Funktion auf den Zeiger. Aber diese Umsetzung ist sehr spezifisch, da andere VM-impl pin kann das Objekt stattdessen zu deaktivieren, GC komplett. (Getestet auf Oracle Jdk 7 & 8)
Werfen Sie einen Blick auf Die Oracle JRockit JVM. Ich habe gesehen, sehr gut in der Nähe-deterministische Leistung auf Intel-hardware mit dieser JVM und Sie stoßen kann Sack und die Laufzeit mit der Mission Control - Dienstprogramm, um zu sehen, wie gut es durchführen.
Können Sie zwar nicht drehen, GC Total ab, ich glaube, dass Sie verwenden können, die -Xnoclassgc option zum deaktivieren der Sammlung von Klassen. Der GC kann abgestimmt werden, um minimieren der Wartezeit auf Kosten des Ausscheidens Speicherverbrauch zu wachsen. Sie benötigen eine Lizenz, um die drop Latenz so niedrig wie Sie benötigen, wenn Sie diesen Weg gehen.
Es ist auch eine Echtzeit-version von JRockit JVM zur Verfügung, aber ich glaube nicht, dass es ein free-to-Entwickler-version zur Verfügung.
Kann man ein open-source-JVM, und deaktivieren Sie die GC, zum Beispiel Sun Hotspot?
Wenn es keine Garbage Collection, was würden Sie erwarten, dass die Semantik von code wie diesem?
In Abwesenheit von GC jedes Element newed und mit einem stack Gültigkeitsbereich Referenz könnte nie zurückgefordert werden. Selbst wenn Sie Ihre eigenen Klassen konnten sich entscheiden, nicht zu verwenden Sie lokale Variablen wie diese, oder nur primitive Typen, die ich nicht sehen, wie Sie würde sicher mit standard-Java-Bibliothek.
Ich wäre daran interessiert zu hören, mehr über Ihre Nutzungs-Szenario.
die Frage ist alt, aber für diejenigen, die interessiert sein könnten, gibt es einen Vorschlag zu
JEP Entwurf: Epsilon GC: Die Willkürlich Niedrige Overhead-Müll (Nicht-)Sammler
Hätte ich dieses problem würde ich in die IBM - Jikes Research Virtual Machine weil:
Können Sie nicht ausschalten, GC-forever, weil Java-Programme tun zuordnen und schließlich werden Sie run out of memory, aber es ist durchaus möglich, dass Sie verzögern können GC für die Dauer des Experiments, indem er die JVM nicht anfangen zu sammeln, bis die Haufen wirklich groß. (Diesen trick könnte funktionieren auf andere JVMs als gut, aber ich würde nicht wissen, wo zu finden die Knöpfe zum starten drehte.)