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?
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:
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.
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.
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.
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 -versione também dejava -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á.
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.
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.
" 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. "
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
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 ").
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.
Respostas:
Você recupera a propriedade do sistema que marca a testemunha dessa JVM com:
Os resultados possíveis são:
"32"
- JVM de 32 bits"64"
- JVM de 64 bits"unknown"
- JVM desconhecidaConforme descrito nas Perguntas frequentes sobre o HotSpot :
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.
fonte
sun.*
propriedades do sistema com uma IBM JVM. Em outras palavras, não é portátil.Para determinadas versões do Java, é possível verificar a aceitação da JVM na linha de comandos com os sinalizadores
-d32
e-d64
.Para verificar uma JVM de 64 bits, execute:
Se não for uma JVM de 64 bits, você obterá o seguinte:
Da mesma forma, para verificar uma JVM de 32 bits, execute:
Se não for uma JVM de 32 bits, você obterá o seguinte:
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.
fonte
java -d32 -version
para verificar se você não está executando 32 bits. Ambos desejam trabalharWin7
.java -d32 -version
e também dejava -d64 -version
.Basta digitar
java -version
seu console.Se uma versão de 64 bits estiver em execução, você receberá uma mensagem como:
Uma versão de 32 bits mostrará algo semelhante a:
Observe em
Client
vez de64-Bit Server
na terceira linha. AClient/Server
parte é irrelevante, é a ausência do64-Bit
que 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 -version
lá.fonte
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:
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.
fonte
os.arch
tem muitos valores possíveis, é difícil saber se são 32 ou 64 bits. Veja lopica.sourceforge.net/os.htmlInformações complementares:
Em um processo em execução, você pode usar (pelo menos em algumas versões recentes do Sun JDK5 / 6):
onde 14680 é o PID da jvm executando o aplicativo. O "os.arch" também funciona.
Também há suporte para outros cenários:
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. "
fonte
No Linux, você pode obter informações do cabeçalho ELF usando um dos dois comandos a seguir:
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
o / p: Classe: ELF 64
fonte
Se você estiver usando o JNA, poderá verificar se
com.sun.jna.Native.POINTER_SIZE == 4
(32 bits) oucom.sun.jna.Native.POINTER_SIZE == 8
(64 bits).fonte
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 ").
fonte
Se você estiver usando JNA, poderá fazer isso
Platform.is64Bit()
.fonte
Para
Windows
, você pode verificar oJava
local da casa. Se ele contiver(x86)
, é o32-bit
contrário64-bit
:Caminhos de exemplo:
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
Windows
para que a independência da plataforma fique fora da janela.fonte
Para obter a versão da JVM atualmente executando o programa
fonte
1.8.0_172
ounull
ativadoJava 10
e não responde à pergunta de qualquer maneira.