Ich wollte wissen, wie es möglich ist, eine Kind-JVM von einem JDK zu unterscheiden, oder ist es sogar möglich?
Einige Frameworks wie Hadoop fork ein Kind JVM für bestimmte Aufgaben so bitte werfen Sie etwas Licht auf das Thema.
Danke!
Gabel wird normalerweise mit Spawn verwechselt. Spawn ist fork + exec (was bedeutet, einen Prozess zu starten welches das aktuelle ersetzt und einige davon erbt seine externen Ressourcen, wie offene Sockets).
Spawn ist in Java verfügbar (über System.exec und ähnliches).
Fork ist nicht in Java, weil es extrem problematisch wäre.
Fork erfordert das Klonen des Adressraums. Die Kernel-Unterstützung, um dies effizient zu tun, ist nicht verfügbar in den meisten Nicht-Unix-Betriebssystemen; z.B. U / win und Cygwin haben gekämpft Emulation Fork unter Win32. In einer Sprache wie Java, der Garbage Collector &Ampere; JIT-Compiler würden Vmem-Seiten wie z dass das Leerzeichen nach fork nicht lange geteilt bleiben würde.
Klonen hat viele Nebenwirkungen. Zum Beispiel werden Eingangs- oder Ausgangspuffer insgesamt verarbeitet der gegabelten Kinder. SysV Shared Memory wird getrennt.
Die meisten Sprachen und viele Bibliotheken lehnen es einfach ab Unterstützung Gabeln. Dies beinhaltet die (POSIX) Threading API; Das Kind darf keine Threads verwenden, bis es ausgeführt wird (d. h. wird zum Spawn)!
Perl verwendet Fork, weil seine Interna extrem nahe an C / Unix sind, und sein Multithreading ist miserabel.
Die Unix-Shell verwendet Fork by Design, also Snapshots alle lokalen Variablen und Status. Deshalb gibt es auch keine anständige Unix-Shell für eine Nicht-Unix-Umgebung.
Im Allgemeinen glaube ich nicht, dass dies in dem Sinne möglich ist, den Sie meinen. Sie können System.exec()
verwenden, um einen neuen Prozess auszugliedern, und können auf diese Weise eine neue JVM aufrufen. Beachten Sie, dass Sie fork()
natürlich direkt aus dem systemeigenen Code aufrufen können, aber in den Worten eines Posters hier , "Tue nicht. Tu es einfach nicht."
Tags und Links jvm