Как узнать, работает ли JVM мое приложение в 32-битном или 64-битном? В частности, какую функцию или предпочтение я получаю, чтобы обнаружить это в программе?Как узнать, работаю ли я в 64-разрядной JVM или 32-разрядной JVM (изнутри программы)?
ответ
ВС имеет свойство Java System, чтобы определить разрядность 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 из программы.
От Sun HotSpot FAQ:
When writing Java code, how do I distinguish between 32 and 64-bit operation?
There's no public API that allows you to distinguish between 32 and 64-bit operation. Think of 64-bit as just another platform in the write once, run anywhere tradition. However, if you'd like to write code which is platform specific (shame on you), the system property
sun.arch.data.model
has the value "32", "64", or "unknown".
Единственная хорошая причина, если ваш Java код зависит от нативных библиотек и ваш код должен определить, какая версия (32 или 64-битный) для загрузки при запуске.
Определяется ли это спецификацией Java для работы под всеми JVM, или это зависит от Hotspot? – BobMcGee
Я бы не ожидал найти системные свойства 'sun. *' С IBM JVM. Другими словами, он не переносится. –
Действительно ли это справедливо сейчас, когда Java принадлежит Oracle? Я запускаю аудитора среды, который будет запускать предварительное развертывание нашего приложения. Нам нужно проверить, что на 64-битных операционных ящиках установлена 64-разрядная Java, поскольку мы не управляем этими машинами. Мне нужно убедиться, что это все еще работает и будет продолжать работать с Oracle. –
Update Опять:
Я установил 32-битную JVM и повторена снова, выглядит следующим образом действительно говорит вам JVM разрядность, не OS арка:
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-разрядные). Очевидно, что системное свойство - это не просто арка операционной системы.
Это дает информацию об архитектуре операционной системы. Если я не ошибаюсь, это не должно быть одинаковым для JVM-битности. – codaddict
Да. Он дает x86 и т. Д. Не совсем то же самое, так как я не уверен, что он дает «x64» для x86-64, работающего в 64-битных, а не 32-битных. – BobMcGee
@codaddict, похоже, что это действительно бит JVM. – bryantsai
Вы можете попробовать в командной строке:
java -d64 -version
Если это не 64-битной версии, вы получите сообщение, которое выглядит как:
This Java instance does not support a 64-bit JVM. Please install the desired version.
Обратитесь варианты помощью JVM для получения дополнительной информации java -help
Хотя это полезно знать, это не полезно b/c Мне нужно запустить его извне программы или использовать java-параметры для запуска нового процесса. – BobMcGee
Извините, я совершенно неправильно понял вопрос. В самой Java, правильный способ будет таким, как описано codadict – gpampara
Примечание. Флаг -d64 не работает в Windows. – Eddie
Просто введите 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
OP конкретно говорит ** в программе **. –
Дополнительная информация:
На запущенного процесса вы можете использовать (по крайней мере, с некоторыми последними версиями ВС 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 ] [[email protected]]remote-hostname-or-IP
Однако также рассмотреть эту записку:.
"NOTE - Эта утилита не поддерживается и может или не может быть доступна в будущих версиях JDK В Windows В тех системах, где dbgent.dll нет, «Инструменты отладки для Windows» должны быть установлены для работы этих инструментов. Также переменная среды PATH должна содержать местоположение jvm.dll, используемое целевым процессом, или местоположение, из которого произошла ошибка Файл дампа был выпущен. "
В 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
При использовании ЮНА, вы можете проверить, является ли 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 »).
Чтобы получить версию виртуальной машины Java в настоящее время работает программа
System.out.println(Runtime.class.getPackage().getImplementationVersion());
Будет ли этот отчет для JVM или операционной системы? Вы можете запустить 32-разрядную JVM в 64-разрядной операционной системе. –
Я исправил ответ. См. Обновление – Olu
Что не использует JMX? –
Просто из любопытства, почему вы должны знать естественный размер системы? Такие детали абстрагируются на Java, поэтому вам не следует (теоретически, по крайней мере) их знать. –
Это позволяет мне грубо оценить потребности в памяти для объектов из-за указателей. Любопытство тоже - казалось, должно быть, но я никогда не слышал об этом. – BobMcGee
Эта «деталь» не отвлекается при взаимодействии с интерфейсом Java Native. 32-разрядные библиотеки DLL не могут быть загружены 64-разрядной JVM (и наоборот). Таким образом, это очень важная информация для тех, кто использует JNI. Жаль, что, похоже, нет никакого портативного способа получить эту информацию. Один из способов - сначала попробовать загрузить 32-битную версию DLL, а если она не удалась, попробуйте 64-битную версию и т. Д. Уродливый! –