¿Cómo puedo saber si estoy ejecutando JVM de 64 bits o JVM de 32 bits (desde un progtwig)?

¿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 progtwig?

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 progtwig.

De las preguntas frecuentes de Sun HotSpot :

Al escribir código Java, ¿cómo distingo entre 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 una plataforma más en la carrera de escribir una vez, ejecutar en cualquier lugar. Sin embargo, si desea escribir un código que sea específico de la plataforma (la sun.arch.data.model es sun.arch.data.model ), la propiedad del sistema sun.arch.data.model tiene el valor “32”, “64” o “desconocido”.

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

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

Simplemente escriba java -version en 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 en cuenta el Client lugar del Client de 64-Bit Server en la tercera línea. La parte Client/Server es irrelevante, es la ausencia del 64-Bit que 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 allí.

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.

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 sistemas Windows donde dbgent.dll no está presente, debe instalarse ‘Herramientas de depuración para Windows’ para que estas herramientas funcionen. La variable de entorno PATH debe contener la ubicación de jvm.dll utilizada por el proceso objective o la ubicación desde la que 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 64 bits LSB ejecutable , AMD x86-64, versión 1 (SYSV), para GNU / Linux 2.4.0, vinculado dinámicamente (utiliza bibliotecas compartidas), para GNU / Linux 2.4.0, sin componentes

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 bit) o com.sun.jna.Native.POINTER_SIZE == 8 (64 bit).

En Windows 7 en el ” Panel de control ” en ” Progtwigs | Progtwigs 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, solo” Java SE Development Kit 8 Update 60 “).

Para Windows , puede verificar la ubicación de inicio de Java . Si contiene (x86) , es de 32-bit contrario, es de 64-bit :

 public static boolean is32Bit() { val javaHome = System.getProperty("java.home"); return javaHome.contains("(x86)"); } public static boolean is64Bit() { return !is32Bit(); } 

Ejemplos de rutas:

 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 

¿Por qué preocuparse por una solución solo de Windows ?

Si necesita saber en qué versión de bit se está ejecutando, probablemente esté jugueteando con el código nativo en Windows por lo que la independencia de la plataforma está fuera de la ventana de todos modos.

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

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