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

563

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

BobMcGee
fuente
3
Solo por curiosidad, ¿por qué necesitarías saber el tamaño natural del sistema? Detalles como este se abstraen en Java, por lo que no debería (en teoría, al menos) tener que conocerlos.
Patrick Niedzielski el
3
Me permite estimar aproximadamente los requisitos de memoria para los objetos debido a los punteros. La curiosidad también, parecía que debería haber un camino, pero nunca había oído hablar de él.
BobMcGee
85
Este "detalle" no se abstrae cuando interactúa con la interfaz nativa de Java. Las DLL de 32 bits no se pueden cargar con una JVM de 64 bits (y viceversa). Esta es una información bastante esencial para cualquiera que use JNI. Es una pena que no haya una forma portátil de obtener esta información. Una forma es intentar primero cargar una versión de 32 bits de la DLL, y si falla, pruebe la versión de 64 bits, etc. ¡Feo!
Joonas Pulakka
12
Otra situación en la que es importante discernir entre JVM de 32 o 64 bits es para los archivos asignados. En sistemas de 32 bits, solo se pueden asignar 2 GB, por lo que es importante asignar y desasignar segmentos de archivos en consecuencia para que este límite no se exceda, mientras que en jvms de 64 bits el límite es mucho, mucho, mucho más alto.
Simone Gianni
2
Es realmente bueno poder elegir el algoritmo numérico que será más rápido en la máquina en cuestión.
dfeuer

Respuestas:

317

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 desconocido

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

codictorio
fuente
22
No esperaría encontrar sun.*propiedades del sistema con un IBM JVM. En otras palabras, no es portátil.
Pascal Thivent
8
¿Cómo se puede saber desde la línea de comandos? Si está ejecutando 32 bits o 64 bits? Sólo curioso.
Xonatron
17
¿Por qué la respuesta aceptada depende del sol? "os.arch" logrará lo mismo sin tener que usar paquetes Sun patentados.
b1nary.atr0phy
77
@ b1naryatr0phy, ¿os.arch informa sobre el sistema operativo o la JVM? A menudo ejecuto JVM de 32 bits en mi estación de trabajo de 64 bits, para fines de desarrollo.
skiphoppy
77
Esta propiedad es compatible con IBM JVM, pero no con GCJ. Ver stackoverflow.com/questions/807263/…
Emmanuel Bourg el
708

Para ciertas versiones de Java, puede verificar el bitness de la JVM desde la línea de comando con las banderas -d32y -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.

gpampara
fuente
3
Aunque es bueno saberlo, no es útil porque necesito ejecutarlo desde fuera del programa o usar las opciones de Java para comenzar un nuevo proceso.
BobMcGee
13
Exactamente lo que estaba buscando. Y puede ejecutar java -d32 -versionpara verificar que no está ejecutando 32 bits. Ambos desean trabajar Win7.
Xonatron
31
Estoy en Windows 7 y recibo un error de 'opción no reconocida' java -d32 -version y también de java -d64 -version .
ely
40
No use "-D64", ya que hace algo completamente diferente. Define una propiedad del sistema llamada "64". Esto definitivamente no es lo que se quiere aquí.
Jonathan Headland
99
Los distintivos -d32 o -d64 solo funcionarán para Java 7 o superior.
darrenmc
188

Simplemente escriba java -versionsu 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 Clienten cuenta en lugar de 64-Bit Serveren la tercera línea. La Client/Serverparte es irrelevante, es la ausencia de lo 64-Bitque 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 -versionallí.

Sedat Kilinc
fuente
pero en hp sin parar oss env no
obtengo
28
OP dice específicamente dentro del programa .
Tomáš Zato - Restablece a Mónica
34

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.

bryantsai
fuente
77
Esto proporciona información sobre la arquitectura del sistema operativo. Si no me equivoco, esto no tiene por qué ser lo mismo con JVM bitness.
codaddict
2
@codaddict, parece que es un poco de JVM bitness.
bryantsai
20
@codaddict Eso es completamente falso (y no tengo idea de por qué seis personas han votado ese comentario). "os.arch" está diseñado para devolver la versión JVM. Pruébelo usted mismo y que Dios lo ayude si realmente está confiando en esto para la detección del sistema operativo.
b1nary.atr0phy
66
os.archtiene muchos valores posibles, es difícil saber si son 32 o 64 bits. Ver lopica.sourceforge.net/os.html
Emmanuel Bourg
2
Esta es una cadena destinada a los ojos humanos y sin una definición estricta de valores válidos, confiar en esto no es una buena idea: escriba un código que verifique la funcionalidad real.
Thorbjørn Ravn Andersen
15

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

oscuro
fuente
7

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

jawsnnn
fuente
6

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

Anthony Hayward
fuente
Esto es inteligente, pero acceder al tamaño del puntero es significativamente más lento que las otras soluciones aquí (necesita algo de tiempo para inicializarse).
BullyWiiPlaza
1

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 ").

usuario1364368
fuente
1

Si está utilizando JNA, puede hacer esto Platform.is64Bit().

鹞 之 神 乐
fuente
-1

Para Windows, puede verificar la Javaubicación de la casa. Si contiene (x86)es de 32-bitotra 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

¿Por qué preocuparse por una 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 Windowspara que la independencia de la plataforma esté fuera de la ventana de todos modos.

BullyWiiPlaza
fuente
-2

Para obtener la versión de JVM que actualmente ejecuta el programa

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
fuente
¿Eso informaría para la JVM o el sistema operativo? Puede ejecutar una JVM de 32 bits en un sistema operativo de 64 bits.
Thorbjørn Ravn Andersen
Que no usa JMX?
Thorbjørn Ravn Andersen
2
Esto devuelve algo como 1.8.0_172o nullencendido Java 10y no responde la pregunta de todos modos.
BullyWiiPlaza