Як я можу визначити, що 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, яке використовується цільовим процесом, або місце, з якого був створений файл Crash Dump. "
В 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
Якщо ви використовуєте JNA, ви можете перевірити, чи com.sun.jna.Native.POINTER_SIZE == 4
(32 біт), або com.sun.jna.Native.POINTER_SIZE == 8
(64 біт).
У Windows 7 на " Панелі керування " в розділі " Програми | Програми та функції " 64-бітні варіанти JRE & JDK в дужках вказані з " 64-бітними " в дужках (наприклад, " Оновлення 65 для пакета розвитку Java SE 7" (64-розрядні) ) "), тоді як для 32-розрядних варіантів варіант не згадується в дужках (наприклад, лише" Java SE Kit 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
і жодним чином не відповідає на питання.