Pregunta ¿Cómo puedo saber si estoy ejecutando JVM de 64 bits o JVM de 32 bits (desde un 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, ¿a qué función o preferencia tengo acceso para detectar esto dentro del programa?


502
2018-01-14 03:38


origen


Respuestas:


Sun tiene una propiedad del sistema Java para determinar la bitidez de la JVM: 32 o 64:

sun.arch.data.model=32 // 32 bit JVM
sun.arch.data.model=64 // 64 bit JVM

Puedes usar

System.getProperty("sun.arch.data.model") 

para determinar si es 32/64 del programa.

Desde el Preguntas frecuentes sobre Sun HotSpot:

Al escribir código Java, ¿cómo puedo   distinguir entre 32 y 64 bits   ¿operación?

No hay una API pública que te permita   para distinguir entre 32 y 64 bits   operación. Piensa en 64 bits como solo   otra plataforma en la escritura una vez,   corre a cualquier parte de la tradición. Sin embargo, si   te gustaría escribir el código que es   plataforma específica (la culpa es suya), el   propiedad del sistema sun.arch.data.model   tiene el valor "32", "64" o   "desconocido".

La única buena razón es si tu java  el código depende de las bibliotecas nativas  y su código necesita determinar qué  versión (32 o 64 bits) para cargar al inicio.


300
2018-01-14 03:44



Puedes probar en la línea de comando:

java -d64 -version

Si no es una versión de 64 bits, recibirá un mensaje que se ve así:

Esta instancia de Java no admite una JVM de 64 bits.   Por favor instale la versión deseada.

Consulte las opciones de ayuda de la JVM para obtener más información java -help


626
2018-01-14 05:00



Sólo tipo java -version en tu 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)

Nota Client en lugar de 64-Bit Server en la tercera linea los Client/Server parte es irrelevante, es la ausencia del 64-Bit Eso importa.

Si hay múltiples versiones de Java instaladas en su sistema, vaya a la carpeta / bin de la versión de Java que desea verificar y escriba java -version ahí.


163
2018-06-03 20:58



Actualizar nuevamente:

Instalé JVM de 32 bits y lo volví a intentar, parece que lo siguiente le dice bitness JVM, no arco de sistema operativo:

System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "xmd64" when using 64-bit JVM

Esto se probó tanto con SUN como con IBM JVM (32 y 64 bits). Claramente, la propiedad del sistema no es solo el arco del sistema operativo.


29
2018-01-14 03:47



Información complementaria:

En un proceso de 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, se debe instalar "Herramientas de depuración para Windows" para que estas herramientas funcionen. Además, 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 que se produjo el archivo Crash Dump ".


13
2018-02-16 19:04



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: DUENDE 64 bits LSB ejecutable, AMD x86-64, versión 1 (SYSV), para GNU / Linux 2.4.0, enlazado dinámicamente (usa librerías compartidas), para GNU / Linux 2.4.0, no eliminado

o

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'

o / p: Clase: ELF64


6
2018-06-07 08:50



Si está utilizando JNA, puede verificar si com.sun.jna.Native.POINTER_SIZE == 4 (32 bit) o com.sun.jna.Native.POINTER_SIZE == 8 (64 bit)


6
2018-04-10 16:49



En Windows 7 en el "Panel de control" debajo "Programas | Programas y características"las variantes de 64 bits de JRE y JDK se enumeran con"64 bits"entre paréntesis (por ejemplo,"Actualización de Java SE Development Kit 7 65 (64 bits)"), mientras que para las variantes de 32 bits, la variante no se menciona entre paréntesis (por ejemplo, solo"Actualización de Java SE Development Kit 8 60").


1
2017-09-06 20:54



Para obtener la versión de JVM actualmente ejecutando el programa

System.out.println(Runtime.class.getPackage().getImplementationVersion());

0
2017-09-12 18:54