Как я могу сказать, если я работаю в 64-разрядной JVM или 32-разрядной JVM (из программы)?
Как я могу сказать, если JVM мое приложение работает в 32 бит или 64-бит? В частности, к какой функции или предпочтению я обращаюсь, чтобы обнаружить это в программе?
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
таким образом, независимость от платформы в любом случае выходит из окна.