Oracle
 sql >> Database >  >> RDS >> Oracle

Comprendere Java di Oracle su Mac

La JVM di Oracle è installata solo in una posizione. Sei stato fuorviato!

Come hai notato, i comandi Java in /usr/bin sono collegamenti simbolici ai binari in /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands . I binari all'interno di quella directory sono applicazioni stub che determinano quale Java VM utilizzare*, quindi eseguono il corrispondente binario reale all'interno di quella versione della VM. Questo è il motivo per cui tutti i binari all'interno di /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands hanno dimensioni quasi identiche, nonostante ti aspetteresti che implementino funzionalità abbastanza diverse.

Puoi vederlo in azione usando dtrace :

[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

Il dato dtrace l'invocazione stampa l'argomento del percorso in posix_spawn quando viene chiamato da java -version . Nel mio caso l'applicazione stub ha trovato il runtime Java 1.6 di Apple in /System/Library/Java/JavaVirtualMachines/1.6.0.jdk e sta invocando quella versione di java comando.

Gli stub binari hanno anche un altro vantaggio:quando rilevano che nessuna Java VM è installata, chiederanno all'utente di installarne una.

Per quanto riguarda il CurrentJDK collegamento simbolico, come meglio posso dire per motivi di compatibilità con le versioni precedenti con il passato quando Apple era l'unica fonte della JVM su OS X.

* Viene considerata una combinazione di fattori quando si determina quale Java VM deve essere utilizzata. JAVA_HOME viene utilizzato se impostato (prova JAVA_HOME=/tmp java ). Se JAVA_HOME non è impostato, quindi viene rilevato l'elenco di tutte le macchine virtuali sul sistema. Il JAVA_VERSION e JAVA_ARCH le variabili di ambiente vengono utilizzate, se impostate, per filtrare l'elenco delle macchine virtuali in base a una versione particolare e all'architettura supportata. L'elenco risultante viene quindi ordinato per architettura (preferendo 64 bit rispetto a 32 bit) e versione (più recente è migliore) e viene restituita la corrispondenza migliore.