Як я можу дізнатися, чи працює я в 64-бітному JVM або 32-бітному JVM (з програми)?


563

Як я можу визначити, що JVM, в якому працює моя програма, 32-ти або 64-розрядний? Зокрема, які функції чи властивості я можу використовувати для виявлення цього в програмі?


3
Навіщо з цікавості, чому ви повинні знати природні розміри системи? Такі деталі вилучені на Java, тому вам не слід (принаймні теоретично) їх знати.
Патрік Недзельський

3
Це дозволяє приблизно оцінити потреби в пам'яті для об'єктів за допомогою покажчиків. Цікавість теж - здавалося, що має бути спосіб, але я ніколи про неї не чув.
BobMcGee

85
Ця "деталь" не абстрагується під час взаємодії з Java Native Interface. 32-бітні DLL файли не можна завантажувати 64-бітним JVM (і навпаки). Отже, це досить важлива інформація для тих, хто використовує JNI. Шкода, що, мабуть, немає портативного способу отримання цієї інформації. Один із способів - спершу спробувати завантажити 32-бітну версію DLL, а якщо вона не вдасться, спробуйте 64-бітну версію тощо. Некрасиво!
Joonas Pulakaka

12
Інша ситуація, коли розрізнення між 32 або 64 бітовими JVM важливо, - це картографічні файли. У 32-бітових системах можна відобразити лише 2 ГБ, тому важливо відповідно зіставити та скасувати карти сегментів файлів, щоб цей ліміт не був перевищений, тоді як у 64-бітових jvms ліміт набагато, набагато, набагато вище.
Сімоне Джанні

2
Дійсно приємно мати можливість вибирати числовий алгоритм, який буде найшвидшим на відповідній машині.
dfeuer

Відповіді:


317

Ви отримуєте системне властивість, яке позначає біт цього 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-бітну версію бібліотек при запуску.


22
Я не сподівався знайти sun.*системні властивості з IBM JVM. Іншими словами, це не портативно.
Паскаль Thivent

8
Як ви можете сказати з командного рядка? Якщо ви працюєте 32-розрядні або 64-бітні? Просто цікаво.
Xonatron

17
Чому прийнята відповідь залежає від сонця? "os.arch" зробить те ж саме, не використовуючи власні пакети НД.
b1nary.atr0phy

7
@ b1naryatr0phy, чи звітує os.arch про Операційну систему чи JVM? Я часто запускаю 32-розрядний JVM на своїй 64-бітній робочій станції для цілей розвитку.
skiphoppy

7
Ця властивість підтримується на JVM IBM, але не в GCJ. Дивіться stackoverflow.com/questions/807263/…
Еммануель Бург

707

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


3
Хоча це добре знати, це не корисно, якщо мені потрібно запустити його поза програмою або використовувати параметри Java для запуску нового процесу.
BobMcGee

13
Саме те, що я шукав. І ви можете запустити, java -d32 -versionщоб переконатися, що ви не працюєте 32-розрядні. Обидва бажають працювати над Win7.
Xonatron

31
Я в Windows 7, і я отримую помилку "нерозпізнаної опції" від, java -d32 -version а також від java -d64 -version .
ely

40
Не використовуйте "-D64", оскільки це робить щось зовсім інше. Він визначає властивість системи під назвою "64". Це, безумовно, не те, що тут хочеться.
Джонатан Хедленд

9
Прапори -d32 або -d64 працюватимуть лише для Java 7 або новішої версії.
darrenmc

187

Просто введіть 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її.


але в hp nonstop oss env я не отримую 64-бітний або 32-бітний
vels4j

28
В рамках програми спеціально йдеться .
Томаш Зато - Відновити Моніку

34

Я встановив 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-розрядні). Зрозуміло, що властивість системи - це не тільки арка операційної системи.


7
Це дає інформацію про архітектуру операційної системи. Якщо я не помиляюся, це не повинно бути таким же бітом JVM.
кодифікація

2
@codaddict, схоже, це дійсно біт JVM.
брянцай

20
@codaddict Це абсолютно помилково (і я поняття не маю, чому шість ppl проголосували за цей коментар.) "os.arch" призначений для повернення версії JVM. Перевірте це на собі, і Бог допоможе вам, якщо ви дійсно покладаєтесь на це для виявлення ОС.
b1nary.atr0phy

6
os.archмає багато можливих значень, важко сказати, чи є це 32 або 64 біта. Дивіться lopica.sourceforge.net/os.html
Еммануель Бург

2
Це рядок, призначений для людських очей, і без чіткого визначення дійсних значень, покладатися на це не є хорошою ідеєю - написати натомість код, який перевіряє фактичну функціональність.
Thorbjørn Ravn Andersen

15

Додаткова інформація:

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


7

В 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'

o / p: Клас: ELF 64


6

Якщо ви використовуєте JNA, ви можете перевірити, чи com.sun.jna.Native.POINTER_SIZE == 4(32 біт), або com.sun.jna.Native.POINTER_SIZE == 8(64 біт).


Це розумно, але доступ до розміру вказівника значно повільніший, ніж інші рішення тут (для його ініціалізації потрібен певний час).
BullyWiiPlaza

1

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



-1

Бо 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тому незалежність платформи все одно виходить з вікна.


-2

Щоб отримати версію JVM, що працює в даний момент

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

Чи буде цей звіт для СВМ або операційної системи? У 64-бітній операційній системі можна запустити 32-бітний JVM.
Thorbjørn Ravn Andersen

Це не використовує JMX?
Thorbjørn Ravn Andersen

2
Це повертає щось на кшталт 1.8.0_172або nullввімкнення Java 10і жодним чином не відповідає на питання.
BullyWiiPlaza
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.