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

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

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

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 бит) для загрузки при запуске.

303
14 янв. '10 в 6:44
источник

Связанные вопросы


Похожие вопросы

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

java -d64 -version

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

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

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

642
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 там.

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

31
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, используемое целевым процессом, или местоположение, из которого был создан файл дампа сбоев".

13
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

6
07 июня '12 в 11:50
источник

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

6
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
06 сент. '15 в 23:54
источник

В Windows вы можете проверить исходное местоположение Java. Если он содержит (x86) он 32-bit иначе 64-bit:

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

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

Примеры путей:

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

Зачем заботиться о решении Windows только?

Если вам нужно знать, в какой битовой версии вы работаете, вы, вероятно, будете играть с родным кодом в Windows так что независимость от платформы в любом случае выходит за пределы окна.

0
08 авг. '18 в 0:06
источник

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

System.out.println(Runtime.class.getPackage().getImplementationVersion());
-1
12 сент. '17 в 21:54
источник

Посмотрите другие вопросы по меткам или Задайте вопрос