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

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

Ответы [ 11 ]

670 голосов
/ 14 января 2010

Для определенных версий 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.

311 голосов
/ 14 января 2010

Вы получаете системное свойство , которое помечает разрядность этой JVM следующим образом:

System.getProperty("sun.arch.data.model");

Возможные результаты:

  • "32" - 32-разрядная JVM
  • "64" - 64-битная JVM
  • "unknown" - Неизвестная JVM

Как описано в FAQ по HotSpot :

Как различать 32-битную и 64-битную операции при написании кода Java?

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

Пример, где это может быть необходимо, - это если ваш Java-код зависит от собственных библиотек, и вам нужно определить, загружать ли 32- или 64-битную версию библиотек при запуске.

179 голосов
/ 04 июня 2011

Просто введите 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 там.

34 голосов
/ 14 января 2010

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

15 голосов
/ 16 февраля 2012

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

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

7 голосов
/ 07 июня 2012

В 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 голосов
/ 10 апреля 2015

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

1 голос
/ 06 сентября 2015

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

0 голосов
/ 08 января 2019

Если вы используете JNA, вы можете сделать это Platform.is64Bit().

0 голосов
/ 08 августа 2018

Для 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, поэтому независимость от платформы в любом случае не учитывается.

...