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?

BobMcGee
fonte
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.

codaddict
fonte
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.

gpampara
fonte
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á.

Sedat Kilinc
fonte
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.

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

escuro
fonte
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

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

Anthony Hayward
fonte
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 ").

user1364368
fonte
1

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

鹞 之 神
fonte
-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.

BullyWiiPlaza
fonte
-2

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

System.out.println(Runtime.class.getPackage().getImplementationVersion());
Olu Smith
fonte
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