Как я могу узнать, работает ли я в 64-разрядной JVM или 32-разрядной JVM (изнутри программы)?

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

473
задан BobMcGee 14 янв. '10 в 6:38
источник поделиться

9 ответов

Sun обладает свойством 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:

При написании кода Java, как мне различают 32 и 64-битные операция?

Нет публичного API, который позволяет вам различать 32 и 64-битные операция. Подумайте о 64-битных другая платформа в однократной записи, бежать везде традиции. Однако, если вы хотите написать код, который конкретная платформа (позор вам), системное свойство sun.arch.data.modelимеет значение "32", "64" или "Неизвестный".

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

287
ответ дан codaddict 14 янв. '10 в 6:44
источник поделиться

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

java -d64 -version

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

Этот экземпляр Java не поддерживает 64-битную JVM. Установите нужную версию.

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

579
ответ дан gpampara 14 янв. '10 в 8:00
источник поделиться

Просто введите 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 там.

147
ответ дан Sedat Kilinc 03 июня '11 в 23:58
источник поделиться

Обновить снова:

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

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-разрядные). Очевидно, что системное свойство - это не просто арка операционной системы.

28
ответ дан bryantsai 14 янв. '10 в 6:47
источник поделиться

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

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

где 14680 - это PID jvm, запускающей приложение. "os.arch" тоже работает.

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

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

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

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

10
ответ дан dim 16 февр. '12 в 22:04
источник поделиться

В 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 64

4
ответ дан jawsnnn 07 июня '12 в 11:50
источник поделиться

Если вы используете JNA, вы можете проверить, есть ли com.sun.jna.Native.POINTER_SIZE == 4 (32 бит) или com.sun.jna.Native.POINTER_SIZE == 8 (64 бит).

2
ответ дан Anthony Hayward 10 апр. '15 в 19:49
источник поделиться

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

1
ответ дан user1364368 06 сент. '15 в 23:54
источник поделиться

Чтобы получить версию JVM, в настоящее время запущенную программу

System.out.println(Runtime.class.getPackage().getImplementationVersion());
0
ответ дан Olu 12 сент. '17 в 21:54
источник поделиться

Другие вопросы по меткам