2009-07-15 9 views
1

Ich schaue mir die Möglichkeit an, Java-Bytecode zur Laufzeit zu generieren (hoffentlich direkt im Speicher und nicht über Klassendateien, obwohl ich mir denke, dass das für mich keinen Unterschied macht) Frage).Java-Speicherbereinigung von Laufzeit generiertem Code

Ich verstehe, dass dies getan werden kann, ist die Frage, ob der Garbage Collector nicht mehr verwendeten Code fegen? Ich erinnere mich, dass ich vor einigen Jahren gesehen habe, dass dies nicht der Fall war, aber ich finde keine Hinweise auf das Thema.

Um den Zweck dieser zu klären, würde ich sicherlich nicht für normale Datenverarbeitungsszenarien stören. Aber bedenken Sie die genetische Programmierung: potenziell Milliarden kleiner Programme, die für Billionen von Hinrichtungen generiert und betrieben werden; In diesem Szenario lohnt es sich, die Dinge so schnell wie möglich laufen zu lassen, und es ist wichtig, nicht mehr verwendeten Code freizugeben. Ich versuche, etwas Komplexeres zu tun, aber es hat Ähnlichkeiten mit genetischer Programmierung.

+0

Angesichts Ihres Beispiels (große Anzahl kleiner Klassen) würde ich vorschlagen, eine Lösung zu suchen, die keine Java-Klassen beinhaltet. Der Aufwand beim Erstellen von Klassenladern für jede dieser Klassen wird extrem sein. Schauen Sie sich stattdessen eine Art selbstgewählten Dolmetscher an. – kdgregory

+0

Aber können Sie nicht einen einzelnen Klassenlader erstellen und ihn für eine große Anzahl von Klassen verwenden und dann alle auf einmal freigeben, wenn Sie alle Verweise auf den Loader löschen? – rwallace

+0

Ja - vorausgesetzt, dass Sie nicht einige behalten und andere verwerfen möchten (wie ein genetischer Algorithmus es tun würde). – kdgregory

Antwort

4

Klassen sind an den ClassLoader gebunden, der sie geladen hat. Um zu bewirken, dass die JVM nicht verwendete Klassen sammelt, müssen Sie alle Verweise auf den Klassenlader löschen. Dies ist, wie Anwendungsserver mit "hot deploy" arbeiten, und es ist wahrscheinlich lehrreich, sich die JBoss- oder Tomcat-Implementierungen anzuschauen, wenn Sie mit Classloadern nicht vertraut sind (ich habe auch nicht geguckt und kann Sie nicht darauf hinweisen) .

Ich frage mich jedoch, ob dies wirklich ein Problem sein wird? Wie viele Klassen planen Sie zu erstellen, wie groß werden sie sein und wie lange werden sie leben? Wenn Sie viele große Klassen haben (sagen wir 50k Bytecode oder mehr), und sie werden eine kurze Zeit leben, dann ist es sinnvoll, sie zu bereinigen. Sonst nicht so sehr.

Warum erstellen Sie auch Klassen? Kann man das mit einer Skriptsprache (zB Rhino) aus der JVM heraus tun? Oder ein selbstgebauter Dolmetscher? Wenn ja, dann würden Sie Ihre Klassenverwaltungsprobleme ohne Code lösen.

0

Wenn Sie meinen, bekommt die Klasse unloaded durch den Garbage Collector, dann nein es nicht.

Sie können dies jedoch erreichen, indem Sie einen benutzerdefinierten Klassenlader schreiben.

Verwandte Themen