¿Cómo puedo saber si la JVM en la que se ejecuta mi aplicación es de 32 bits o de 64 bits? Específicamente, ¿qué funciones o propiedades puedo usar para detectar esto dentro del programa?
¿Cómo puedo saber si la JVM en la que se ejecuta mi aplicación es de 32 bits o de 64 bits? Específicamente, ¿qué funciones o propiedades puedo usar para detectar esto dentro del programa?
Respuestas:
Recuperas la propiedad del sistema que marca el bitness de esta JVM con:
System.getProperty("sun.arch.data.model");
Los posibles resultados son:
"32"
- JVM de 32 bits"64"
- JVM de 64 bits"unknown"
- JVM desconocidoComo se describe en las preguntas frecuentes de HotSpot :
Al escribir código Java, ¿cómo puedo distinguir entre la operación de 32 y 64 bits?
No hay una API pública que le permita distinguir entre la operación de 32 y 64 bits. Piense en 64 bits como simplemente otra plataforma en la escritura una vez, ejecute en cualquier lugar la tradición. Sin embargo, si desea escribir código que sea específico de la plataforma (lástima de usted), la propiedad del sistema sun.arch.data.model tiene el valor "32", "64" o "desconocido".
Un ejemplo en el que esto podría ser necesario es si su código Java depende de las bibliotecas nativas, y necesita determinar si cargar la versión de 32 o 64 bits de las bibliotecas en el inicio.
sun.*
propiedades del sistema con un IBM JVM. En otras palabras, no es portátil.
Para ciertas versiones de Java, puede verificar el bitness de la JVM desde la línea de comando con las banderas -d32
y -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
Para buscar una JVM de 64 bits, ejecute:
$ java -d64 -version
Si no es una JVM de 64 bits, obtendrá esto:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Del mismo modo, para verificar una JVM de 32 bits, ejecute:
$ java -d32 -version
Si no es una JVM de 32 bits, obtendrá esto:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Estas banderas se agregaron en Java 7, en desuso en Java 9, se eliminaron en Java 10 y ya no están disponibles en versiones modernas de Java.
java -d32 -version
para verificar que no está ejecutando 32 bits. Ambos desean trabajar Win7
.
java -d32 -version
y también de java -d64 -version
.
Simplemente escriba java -version
su consola.
Si se está ejecutando una versión de 64 bits, recibirá un mensaje como:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
Una versión de 32 bits mostrará algo similar a:
java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)
Tenga Client
en cuenta en lugar de 64-Bit Server
en la tercera línea. La Client/Server
parte es irrelevante, es la ausencia de lo 64-Bit
que importa.
Si hay varias versiones de Java instaladas en su sistema, navegue a la carpeta / bin de la versión de Java que desea verificar y escriba java -version
allí.
Instalé JVM de 32 bits y lo volví a intentar, parece que lo siguiente te dice la bitness JVM, no el arco del sistema operativo:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
Esto se probó contra SUN e IBM JVM (32 y 64 bits). Claramente, la propiedad del sistema no es solo el arco del sistema operativo.
os.arch
tiene muchos valores posibles, es difícil saber si son 32 o 64 bits. Ver lopica.sourceforge.net/os.html
Información complementaria:
En un proceso en ejecución , puede usar (al menos con algunas versiones recientes de Sun JDK5 / 6):
$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32
donde 14680 es PID de jvm que ejecuta la aplicación. "os.arch" también funciona.
También se admiten otros escenarios:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
Sin embargo, considere también esta nota:
" NOTA : esta utilidad no es compatible y puede o no estar disponible en futuras versiones del JDK. En los sistemas Windows donde dbgent.dll no está presente, 'Debugging Tools for Windows' necesita estar instalado para que estas herramientas funcionen. La variable de entorno PATH debe contener la ubicación de jvm.dll utilizada por el proceso de destino o la ubicación desde la cual se produjo el archivo Crash Dump ".
En Linux, puede obtener información de encabezado ELF utilizando cualquiera de los dos comandos siguientes:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: ELF ejecutable LSB de 64 bits , AMD x86-64, versión 1 (SYSV), para GNU / Linux 2.4.0, vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.4.0, no despojado
o
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o / p: Clase: ELF 64
Si está utilizando JNA, puede verificar si com.sun.jna.Native.POINTER_SIZE == 4
(32 bits) o com.sun.jna.Native.POINTER_SIZE == 8
(64 bits).
En Windows 7 en el " Panel de control " en " Programas | Programas y características ", las variantes de 64 bits de JRE y JDK se enumeran con " 64 bits " entre paréntesis (por ejemplo, " Java SE Development Kit 7 Update 65 (64 bits) ) "), mientras que para las variantes de 32 bits la variante no se menciona entre paréntesis (por ejemplo," Java SE Development Kit 8 Update 60 ").
Para Windows
, puede verificar la Java
ubicación de la casa. Si contiene (x86)
es de 32-bit
otra manera 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
Ejemplos de caminos:
C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit
Windows
única solución?Si necesita saber en qué versión de bits está ejecutando, es probable que esté jugando con el código nativo Windows
para que la independencia de la plataforma esté fuera de la ventana de todos modos.
Para obtener la versión de JVM que actualmente ejecuta el programa
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
o null
encendido Java 10
y no responde la pregunta de todos modos.