2010-01-14 1 views
484

Как узнать, работает ли JVM мое приложение в 32-битном или 64-битном? В частности, какую функцию или предпочтение я получаю, чтобы обнаружить это в программе?Как узнать, работаю ли я в 64-разрядной JVM или 32-разрядной JVM (изнутри программы)?

+3

Просто из любопытства, почему вы должны знать естественный размер системы? Такие детали абстрагируются на Java, поэтому вам не следует (теоретически, по крайней мере) их знать. –

+3

Это позволяет мне грубо оценить потребности в памяти для объектов из-за указателей. Любопытство тоже - казалось, должно быть, но я никогда не слышал об этом. – BobMcGee

+74

Эта «деталь» не отвлекается при взаимодействии с интерфейсом Java Native. 32-разрядные библиотеки DLL не могут быть загружены 64-разрядной JVM (и наоборот). Таким образом, это очень важная информация для тех, кто использует JNI. Жаль, что, похоже, нет никакого портативного способа получить эту информацию. Один из способов - сначала попробовать загрузить 32-битную версию DLL, а если она не удалась, попробуйте 64-битную версию и т. Д. Уродливый! –

ответ

290

ВС имеет свойство Java System, чтобы определить разрядность JVM: 32 или 64:

sun.arch.data.model=32 // 32 bit JVM 
sun.arch.data.model=64 // 64 bit JVM 

Вы можете использовать

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

, чтобы определить, является ли его 32/64 из программы.

От Sun HotSpot FAQ:

When writing Java code, how do I distinguish between 32 and 64-bit operation?

There's no public API that allows you to distinguish between 32 and 64-bit operation. Think of 64-bit as just another platform in the write once, run anywhere tradition. However, if you'd like to write code which is platform specific (shame on you), the system property sun.arch.data.model has the value "32", "64", or "unknown".

Единственная хорошая причина, если ваш Java код зависит от нативных библиотек и ваш код должен определить, какая версия (32 или 64-битный) для загрузки при запуске.

+0

Определяется ли это спецификацией Java для работы под всеми JVM, или это зависит от Hotspot? – BobMcGee

+18

Я бы не ожидал найти системные свойства 'sun. *' С IBM JVM. Другими словами, он не переносится. –

+1

Действительно ли это справедливо сейчас, когда Java принадлежит Oracle? Я запускаю аудитора среды, который будет запускать предварительное развертывание нашего приложения. Нам нужно проверить, что на 64-битных операционных ящиках установлена ​​64-разрядная Java, поскольку мы не управляем этими машинами. Мне нужно убедиться, что это все еще работает и будет продолжать работать с Oracle. –

29

Update Опять:

Я установил 32-битную JVM и повторена снова, выглядит следующим образом действительно говорит вам JVM разрядность, не OS арка:

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

Это было проверено против обоих SUN и IBM JVM (32 и 64-разрядные). Очевидно, что системное свойство - это не просто арка операционной системы.

+7

Это дает информацию об архитектуре операционной системы. Если я не ошибаюсь, это не должно быть одинаковым для JVM-битности. – codaddict

+0

Да. Он дает x86 и т. Д. Не совсем то же самое, так как я не уверен, что он дает «x64» для x86-64, работающего в 64-битных, а не 32-битных. – BobMcGee

+2

@codaddict, похоже, что это действительно бит JVM. – bryantsai

596

Вы можете попробовать в командной строке:

java -d64 -version 

Если это не 64-битной версии, вы получите сообщение, которое выглядит как:

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

Обратитесь варианты помощью JVM для получения дополнительной информации java -help

+2

Хотя это полезно знать, это не полезно b/c Мне нужно запустить его извне программы или использовать java-параметры для запуска нового процесса. – BobMcGee

+1

Извините, я совершенно неправильно понял вопрос. В самой Java, правильный способ будет таким, как описано codadict – gpampara

+3

Примечание. Флаг -d64 не работает в Windows. – Eddie

153

Просто введите java -version в свою консоль.

Если 64-разрядная версия работает, вы получите сообщение типа:

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) 

32-битная версия будет показывать что-то похожее на:

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) 

Примечание Client вместо 64-Bit Server в третья строка. Часть Client/Server не имеет значения, это имеет значение 64-Bit.

Если в вашей системе установлено несколько версий Java, перейдите в папку/bin версии Java, которую вы хотите проверить, и введите там java -version.

+0

но в hp nonstop oss env Я не получаю 64 бит или 32 бит – vels4j

+16

OP конкретно говорит ** в программе **. –

11

Дополнительная информация:

На запущенного процесса вы можете использовать (по крайней мере, с некоторыми последними версиями ВС 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 

где 14680 является PID из JVM работает приложение. «os.arch» тоже работает.

Также другие сценарии поддерживаются:

jinfo [ option ] pid 
jinfo [ option ] executable core 
jinfo [ option ] [[email protected]]remote-hostname-or-IP 

Однако также рассмотреть эту записку:.

"NOTE - Эта утилита не поддерживается и может или не может быть доступна в будущих версиях JDK В Windows В тех системах, где dbgent.dll нет, «Инструменты отладки для Windows» должны быть установлены для работы этих инструментов. Также переменная среды PATH должна содержать местоположение jvm.dll, используемое целевым процессом, или местоположение, из которого произошла ошибка Файл дампа был выпущен. "

5

В Linux, вы можете получить информацию заголовка ELF с помощью одного из следующих двух команд:

file {YOUR_JRE_LOCATION_HERE}/bin/java 

о/р: ELF 64-битный исполняемый LSB, AMD x86-64, версия 1 (SYSV), для GNU/Linux 2.4.0, динамически связаны (использует разделяемые библиотеки), для GNU/Linux 2.4.0, не лишены

или

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

о/р: Класс: ELF

3

При использовании ЮНА, вы можете проверить, является ли com.sun.jna.Native.POINTER_SIZE == 4 (32 бит) или com.sun.jna.Native.POINTER_SIZE == 8 (64 бита).

2

В операционной системе Windows 7 в "панели управления" под "Программы | Программы и компоненты" на 64-битные варианты JRE & JDK перечислены с "64-бит" в скобках (например, "Java SE Development Kit 7 Update 65 (64-разрядный) "), в то время как для 32-битных вариантов вариант не упоминается в круглых скобках (например, только« Java SE Development Kit 8 Update 60 »).

1

Чтобы получить версию виртуальной машины Java в настоящее время работает программа

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

Будет ли этот отчет для JVM или операционной системы? Вы можете запустить 32-разрядную JVM в 64-разрядной операционной системе. –

+0

Я исправил ответ. См. Обновление – Olu

+0

Что не использует JMX? –