Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comprendre Java d'Oracle sur Mac

La JVM d'Oracle n'est installée qu'à un seul endroit. Vous avez été trompé !

Comme vous l'avez noté, les commandes Java dans /usr/bin sont des liens symboliques vers les binaires dans /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands . Les fichiers binaires de ce répertoire sont des applications stub qui déterminent quelle machine virtuelle Java utiliser*, puis exécutent le fichier binaire réel correspondant dans cette version de machine virtuelle. C'est pourquoi tous les binaires dans /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands sont presque identiques en taille, malgré le fait que vous vous attendriez à ce qu'ils implémentent des fonctionnalités assez différentes.

Vous pouvez voir cela en action en utilisant 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

Le dtrace donné l'invocation affiche l'argument du chemin vers posix_spawn lorsqu'il est appelé par java -version . Dans mon cas, l'application stub a trouvé le runtime Java 1.6 d'Apple dans /System/Library/Java/JavaVirtualMachines/1.6.0.jdk et invoque cette version de java commande.

Les fichiers binaires stub ont également un autre avantage :lorsqu'ils détectent qu'aucune machine virtuelle Java n'est installée, ils invitent l'utilisateur à en installer une.

Quant au CurrentJDK lien symbolique, pour autant que je sache, par souci de rétrocompatibilité avec le passé, lorsque Apple était la seule source de la JVM sur OS X.

* Une combinaison de facteurs est prise en compte lors de la détermination de la machine virtuelle Java à utiliser. JAVA_HOME est utilisé s'il est défini (essayez JAVA_HOME=/tmp java ). Si JAVA_HOME n'est pas défini, la liste de toutes les machines virtuelles du système est découverte. Le JAVA_VERSION et JAVA_ARCH les variables d'environnement sont utilisées, si elles sont définies, pour filtrer la liste des machines virtuelles selon une version particulière et une architecture prise en charge. La liste résultante est ensuite triée par architecture (64 bits de préférence à 32 bits) et version (la plus récente est la meilleure), et la meilleure correspondance est renvoyée.