Como posso saber se estou executando na JVM de 64 bits ou na JVM de 32 bits (de dentro de um programa)?


563

Como posso saber se a JVM na qual meu aplicativo é executado é de 32 ou 64 bits? Especificamente, quais funções ou propriedades posso usar para detectar isso no programa?


3
Por curiosidade, por que você precisaria saber o tamanho natural do sistema? Detalhes como esse são abstraídos em Java, então você não deve (pelo menos em teoria) conhecê-los.
Patrick Niedzielski

3
Permite estimar aproximadamente os requisitos de memória para objetos devido a ponteiros. Curiosidade também - parecia que deveria haver uma maneira, mas eu nunca tinha ouvido falar disso.
precisa saber é o seguinte

85
Esse "detalhe" não é abstraído ao interagir com a Java Native Interface. As DLLs de 32 bits não podem ser carregadas com uma JVM de 64 bits (e vice-versa). Portanto, essa é uma informação bastante essencial para quem usa o JNI. É uma pena que parece não haver uma maneira portátil de obter essa informação. Uma maneira é primeiro tentar carregar uma versão de 32 bits da DLL e, se falhar, tentar a versão de 64 bits, etc. Feio!
Joonas Pulakka

12
Outra situação em que é importante discernir entre JVMs de 32 ou 64 bits é para arquivos mapeados. Em sistemas de 32 bits, apenas 2 GB podem ser mapeados, portanto, é importante mapear e remover o mapeamento de segmentos de arquivos para que esse limite não seja excedido, enquanto nas jvms de 64 bits o limite é muito, muito, muito maior.
Simone Gianni

2
É muito bom poder escolher o algoritmo numérico que será mais rápido na máquina em questão.
Dfeuer

Respostas:


317

Você recupera a propriedade do sistema que marca a testemunha dessa JVM com:

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

Os resultados possíveis são:

  • "32" - JVM de 32 bits
  • "64" - JVM de 64 bits
  • "unknown" - JVM desconhecida

Conforme descrito nas Perguntas frequentes sobre o HotSpot :

Ao escrever código Java, como faço para distinguir entre operação de 32 e 64 bits?

Não há API pública que permita distinguir entre operação de 32 e 64 bits. Pense em 64 bits como apenas outra plataforma na gravação uma vez, execute qualquer tradição. No entanto, se você deseja escrever um código específico da plataforma (que pena), a propriedade do sistema sun.arch.data.model possui o valor "32", "64" ou "unknown".

Um exemplo em que isso pode ser necessário é se o código Java depender de bibliotecas nativas e você precisar determinar se deve carregar a versão de 32 ou 64 bits das bibliotecas na inicialização.


22
Eu não esperaria encontrar sun.*propriedades do sistema com uma IBM JVM. Em outras palavras, não é portátil.
Pascal Thivent

8
Como você pode dizer a partir da linha de comando? Se você estiver executando 32 ou 64 bits? Apenas curioso.
Xonatron

17
Por que a resposta aceita depende do sol? O "os.arch" fará a mesma coisa sem precisar usar pacotes sun proprietários.
b1nary.atr0phy

7
@ b1naryatr0phy, os.arch informa sobre o sistema operacional ou a JVM? Costumo executar a JVM de 32 bits na minha estação de trabalho de 64 bits, para fins de desenvolvimento.
Skiphoppy 8/08/2012

7
Esta propriedade é suportada nas JVMs IBM, mas não no GCJ. Veja stackoverflow.com/questions/807263/…
Emmanuel Bourg

707

Para determinadas versões do Java, é possível verificar a aceitação da JVM na linha de comandos com os sinalizadores -d32e -d64.

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available

Para verificar uma JVM de 64 bits, execute:

$ java -d64 -version

Se não for uma JVM de 64 bits, você obterá o seguinte:

Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

Da mesma forma, para verificar uma JVM de 32 bits, execute:

$ java -d32 -version

Se não for uma JVM de 32 bits, você obterá o seguinte:

Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

Esses sinalizadores foram adicionados no Java 7, descontinuado no Java 9, removido no Java 10 e não estão mais disponíveis nas versões modernas do Java.


3
Embora seja bom saber, não é útil porque eu preciso executá-lo fora do programa ou usar as opções java para iniciar um novo processo.
precisa saber é o seguinte

13
Exatamente o que eu estava procurando. E você pode executar java -d32 -versionpara verificar se você não está executando 32 bits. Ambos desejam trabalhar Win7.
Xonatron

31
Estou no Windows 7 e recebo o erro 'opção não reconhecida' de java -d32 -version e também de java -d64 -version .
Ely

40
Não use "-D64", pois isso faz algo completamente diferente. Ele define uma propriedade do sistema chamada "64". Definitivamente não é o que se quer aqui.
Jonathan Headland

9
Os sinalizadores -d32 ou -d64 funcionarão apenas para um Java 7 ou superior.
darrenmc

188

Basta digitar java -versionseu console.

Se uma versão de 64 bits estiver em execução, você receberá uma mensagem 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)

Uma versão de 32 bits mostrará algo semelhante 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)

Observe em Clientvez de 64-Bit Serverna terceira linha. A Client/Serverparte é irrelevante, é a ausência do 64-Bitque importa.

Se várias versões Java estiverem instaladas no seu sistema, navegue até a pasta / bin da versão Java que você deseja verificar e digite java -versionlá.


mas em hp nonstop oss env Eu não estou recebendo de 64 bits ou 32 bits
vels4j

28
O OP diz especificamente dentro do programa .
Tomáš Zato - Restabelecer Monica

34

Eu instalei a JVM de 32 bits e tentei novamente, parece que o seguinte diz a você a testemunha da JVM, não o arco do SO:

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

Isso foi testado no SUN e no IBM JVM (32 e 64 bits). Claramente, a propriedade do sistema não é apenas o arco do sistema operacional.


7
Isso fornece informações de arquitetura do sistema operacional. Se não estou errado, isso não precisa ser o mesmo da testemunha da JVM.
Codaddict

2
@ cododdict, parece que é JVM bitness de fato.
precisa saber é o seguinte

20
@codaddict Isso é completamente falso (e eu não tenho idéia do porquê seis pessoas votaram nesse comentário.) "os.arch" foi projetado para retornar a versão da JVM. Teste você mesmo e que Deus o ajude se você estiver realmente confiando nisso para a detecção do SO.
b1nary.atr0phy

6
os.archtem muitos valores possíveis, é difícil saber se são 32 ou 64 bits. Veja lopica.sourceforge.net/os.html
Emmanuel Bourg

2
Essa é uma string destinada a olhos humanos e sem uma definição estrita de valores válidos, basear-se nisso não é uma boa idéia - escreva um código que verifique a funcionalidade real.
Thorbjørn Ravn Andersen

15

Informações complementares:

Em um processo em execução, você pode usar (pelo menos em algumas versões recentes do 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

onde 14680 é o PID da jvm executando o aplicativo. O "os.arch" também funciona.

Também há suporte para outros cenários:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

No entanto, considere também esta nota:

" NOTA - Este utilitário não é suportado e pode ou não estar disponível em versões futuras do JDK. Nos sistemas Windows em que o dbgent.dll não está presente, é necessário instalar o 'Debugging Tools for Windows' para que essas ferramentas funcionem. A variável de ambiente PATH deve conter o local do jvm.dll usado pelo processo de destino ou o local a partir do qual o arquivo Crash Dump foi produzido. "


7

No Linux, você pode obter informações do cabeçalho ELF usando um dos dois comandos a seguir:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: Executável em ELF de 64 bits LSB , AMD x86-64, versão 1 (SYSV), para GNU / Linux 2.4.0, vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.4.0, sem remoção

ou

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

o / p: Classe: ELF 64


6

Se você estiver usando o JNA, poderá verificar se com.sun.jna.Native.POINTER_SIZE == 4(32 bits) ou com.sun.jna.Native.POINTER_SIZE == 8(64 bits).


Isso é inteligente, mas acessar o tamanho do ponteiro é significativamente mais lento que as outras soluções aqui (ele precisa de algum tempo para inicializar).
BullyWiiPlaza #

1

No Windows 7, no " Painel de Controle ", em " Programas | Programas e Recursos ", as variantes de 64 bits do JRE & JDK estão listadas com " 64 bits " entre parênteses (por exemplo, " Java SE Development Kit 7, Atualização 65 (64 bits) ) "), enquanto para as variantes de 32 bits a variante não é mencionada entre parênteses (por exemplo, apenas" Java SE Development Kit 8 Atualização 60 ").


1

Se você estiver usando JNA, poderá fazer isso Platform.is64Bit().


-1

Para Windows, você pode verificar o Javalocal da casa. Se ele contiver (x86), é o 32-bitcontrário 64-bit:

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

public static boolean is64Bit()
{
    return !is32Bit();
}

Caminhos de exemplo:

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 que se preocupar com uma Windowsúnica solução?

Se você precisa saber em qual versão de bit está executando, provavelmente está mexendo com o código nativo Windowspara que a independência da plataforma fique fora da janela.


-2

Para obter a versão da JVM atualmente executando o programa

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

Esse relatório seria para a JVM ou o sistema operacional? Você pode executar uma JVM de 32 bits em um sistema operacional de 64 bits.
Thorbjørn Ravn Andersen

Isso não usa JMX?
Thorbjørn Ravn Andersen

2
Isso retorna algo como 1.8.0_172ou nullativado Java 10e não responde à pergunta de qualquer maneira.
BullyWiiPlaza
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.