Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Java von Oracle auf dem Mac verstehen

Die JVM von Oracle wird nur an einem Ort installiert. Sie wurden in die Irre geführt!

Wie Sie bemerkt haben, sind die Java-Befehle in /usr/bin sind symbolische Links zu Binärdateien in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands . Die Binärdateien in diesem Verzeichnis sind Stub-Anwendungen, die bestimmen, welche Java-VM verwendet werden soll*, und dann die entsprechende echte Binärdatei in dieser VM-Version ausführen. Aus diesem Grund sind alle Binärdateien in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands haben fast die gleiche Größe, obwohl Sie erwarten würden, dass sie ganz andere Funktionen implementieren.

Sie können dies in Aktion sehen, indem Sie dtrace verwenden :

[email protected]:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU     ID                    FUNCTION:NAME
  8    619                posix_spawn:entry   /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java

Der angegebene dtrace Aufruf gibt das Pfadargument zu posix_spawn aus wenn es von java -version aufgerufen wird . In meinem Fall hat die Stub-Anwendung Apples Java 1.6-Laufzeit in /System/Library/Java/JavaVirtualMachines/1.6.0.jdk gefunden und ruft diese Version von java auf Befehl.

Die Stub-Binärdateien haben noch einen weiteren Vorteil:Wenn sie feststellen, dass keine Java VM installiert ist, werden sie den Benutzer auffordern, eine zu installieren.

Wie beim CurrentJDK Symlink, so gut ich das aus Gründen der Abwärtskompatibilität mit der Vergangenheit sagen kann, als Apple die einzige Quelle der JVM unter OS X war.

* Bei der Bestimmung, welche Java VM verwendet werden sollte, wird eine Kombination von Faktoren berücksichtigt. JAVA_HOME wird verwendet, wenn gesetzt (versuchen Sie JAVA_HOME=/tmp java ). Wenn JAVA_HOME nicht festgelegt ist, wird die Liste aller virtuellen Maschinen auf dem System erkannt. Die JAVA_VERSION und JAVA_ARCH Umgebungsvariablen werden, falls gesetzt, verwendet, um die Liste der virtuellen Maschinen nach einer bestimmten Version und unterstützten Architektur zu filtern. Die resultierende Liste wird dann nach Architektur (bevorzugt 64-Bit gegenüber 32-Bit) und Version (neuer ist besser) sortiert und die beste Übereinstimmung wird zurückgegeben.