Как я могу определить, является ли JVM, в которой выполняется мое приложение, 32-разрядной или 64-разрядной? В частности, какие функции или свойства я могу использовать для обнаружения этого в программе?
Как я могу определить, является ли JVM, в которой выполняется мое приложение, 32-разрядной или 64-разрядной? В частности, какие функции или свойства я могу использовать для обнаружения этого в программе?
Ответы:
Вы получаете системное свойство, которое помечает разрядность этой JVM с помощью:
System.getProperty("sun.arch.data.model");
Возможные результаты:
"32"
- 32-битная JVM"64"
- 64-битная JVM"unknown"
- Неизвестная JVMКак описано в FAQ по HotSpot :
Когда я пишу код Java, как различить 32- и 64-битные операции?
Нет общедоступного API, позволяющего различать 32- и 64-разрядные операции. Подумайте о 64-битной архитектуре как об очередной платформе, которую можно написать один раз, запустить в любом месте. Однако, если вы хотите написать код, который зависит от платформы (позор вам), системное свойство sun.arch.data.model имеет значение «32», «64» или «неизвестно».
Например, это может быть необходимо, если ваш Java-код зависит от собственных библиотек, и вам нужно определить, загружать ли 32- или 64-битную версию библиотек при запуске.
sun.*
системные свойства с IBM JVM. Другими словами, это не портативно.
Для определенных версий Java вы можете проверить битность JVM из командной строки с флагами -d32
и -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
Чтобы проверить наличие 64-битной JVM, выполните:
$ java -d64 -version
Если это не 64-битная JVM, вы получите это:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Аналогично, чтобы проверить 32-битную JVM, запустите:
$ java -d32 -version
Если это не 32-битная JVM, вы получите это:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Эти флаги были добавлены в Java 7, устарели в Java 9, удалены в Java 10 и больше не доступны в современных версиях Java.
java -d32 -version
чтобы убедиться, что вы не используете 32-разрядную версию. Оба хотят работать дальше Win7
.
java -d32 -version
и также от java -d64 -version
.
Просто введите 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
# "amd64" when using 64-bit JVM
Это было проверено как на SUN, так и на IBM JVM (32- и 64-разрядной). Понятно, что системное свойство - это не просто арка операционной системы.
os.arch
имеет много возможных значений, трудно сказать, 32-х или 64-х битные. См. Lopica.sourceforge.net/os.html
Дополнительная информация:
На работающем процессе вы можете использовать (по крайней мере, с некоторыми последними версиями 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
Однако учтите также это примечание:
« ПРИМЕЧАНИЕ. - Эта утилита не поддерживается и может или не может быть доступна в будущих версиях JDK. В системах Windows, где отсутствует dbgent.dll, необходимо установить« Средства отладки для Windows », чтобы эти инструменты работали. Переменная среды PATH должна содержать местоположение jvm.dll, используемое целевым процессом, или местоположение, из которого был создан файл аварийного дампа. "
В Linux вы можете получить информацию заголовка ELF с помощью одной из следующих двух команд:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: исполняемый 64-разрядный LSB ELF , 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
Если вы используете 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 Update 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
Windows
единственном решении?Если вам нужно знать, на какой битовой версии вы работаете, вы, скорее всего, возитесь с собственным кодом, Windows
так что независимость от платформы в любом случае не учитывается.
Чтобы получить версию JVM, в которой работает программа
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
или null
на Java 10
и не отвечает на вопрос в любом случае.