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


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

10 512

10 ответов:

Sun имеет системное свойство Java для определения разрядности 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 из программы.

С солнечная точка часто задаваемые вопросы:

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

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

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

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

java -d64 -version

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

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

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

просто типа 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 там.

Обновить Еще Раз:

Я установил 32-разрядную JVM и повторил ее снова, похоже, что следующее говорит вам о битности JVM, а не об арке ОС:

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

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

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

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

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

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

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

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

file {YOUR_JRE_LOCATION_HERE}/bin/java

o/p: Эльф 64-разрядный исполняемый файл LSB компания AMD с архитектурой x86-64, Версия 1 (с SysV), для GNU/Линукс 2.4.0, динамически связан (использует разделяемые библиотеки), для Linux 2.4.0, не лишен

или

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

o/p: Класс: эльф64

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

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

на 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

зачем заботиться о a Windows единственное решение?

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

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

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