Как определить, запущен ли код в 64-разрядной или 32-разрядной JVM (изнутри программы)?
Как я могу определить, работает ли моя программа в 32-битной или 64-битной версии JVM? Какие функции или свойства я могу использовать для того, чтобы обнаружить это внутри программы?
5 ответ(ов)
Для проверки версии Java в вашей системе просто введите команду 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
, которое указывает на то, что версия 32-битная.
Если на вашем компьютере установлено несколько версий Java, перейдите в папку /bin той версии Java, которую вы хотите проверить, и выполните команду java -version
там.
При установке 32-битной JVM и повторной проверке я заметил, что следующая команда действительно показывает разрядность самой JVM, а не архитектуру операционной системы:
System.getProperty("os.arch");
На 64-битной системе Linux:
- "x86" при использовании 32-битной JVM
- "amd64" при использовании 64-битной JVM
Данный тест был проведён как на SUN, так и на IBM JVM (32- и 64-битных версиях). Очевидно, что свойство системы не просто отражает архитектуру операционной системы.
Если вы используете JNA, вы можете проверить, является ли com.sun.jna.Native.POINTER_SIZE == 4
(32-битная система) или com.sun.jna.Native.POINTER_SIZE == 8
(64-битная система).
На Linux вы можете получить информацию о заголовке ELF, используя одну из следующих команд:
file {ВАШ_ПУТЬ_К_JRE}/bin/java
Вывод: ELF 64-битный LSB исполняемый файл, AMD x86-64, версия 1 (SYSV), для GNU/Linux 2.4.0, динамически слинкованный (использует общие библиотеки), для GNU/Linux 2.4.0, не обфусцированный.
или
readelf -h {ВАШ_ПУТЬ_К_JRE}/bin/java | grep 'Class'
Вывод: Class: ELF64
Если вы используете JNA, вы можете сделать это следующим образом:
Platform.is64Bit()
Этот метод возвращает true
, если ваша платформа — 64-битная, и false
, если она 32-битная. Убедитесь, что у вас правильно подключен JNA в вашем проекте.
Что такое параметры -Xms и -Xmx при запуске JVM?
Регистрация нескольких хранилищ ключей в JVM
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?
Безопасно ли использовать -XX:MaxRAMFraction=1 в продакшене в контейнеризованной среде?
"Как задать количество потоков/ЦП для Java VM?"