Порядковый номер виртуальной машины Java
-
13-09-2019 - |
Вопрос
Какой порядковый номер Java использует в своей виртуальной машине?Я помню, что где-то читал, что это зависит от физической машины, на которой оно запущено, а затем в других местах, где я читал, что это всегда, по-моему, большой порядковый номер.Что из этого правильно?
Решение
Многобайтовые данные в class
файлы хранятся в формате big-endian.
От Спецификация виртуальной машины Java, Java SE 7 Edition, Глава 4:Тот самый class
Формат файла:
Файл класса состоит из потока из 8-битных байтов.Все 16-разрядные, 32-разрядные и 64-разрядные величины создаются путем чтения в два, четыре и восемь последовательных 8-разрядных байтов соответственно.Многобайтовые элементы данных всегда хранятся в порядке возрастания, где старшие байты идут первыми.
Кроме того, операнд в инструкции байт-кода также имеет порядковый номер, если он занимает несколько байт.
От Спецификация виртуальной машины Java, Java SE 7 Edition, Раздел 2.11:Краткое описание набора инструкций:
Если размер операнда превышает один байт , то он сохраняется в формате big-endian order-сначала старший байт.Для Например, 16-разрядный индекс без знака в локальных переменных хранится в виде двух байтов без знака,
byte1
иbyte2
, такой , что его значение равно(byte1 << 8) | byte2
.
Так что да, я думаю, можно сказать, что виртуальная машина Java использует big-endian.
Другие советы
Фактические рабочие данные, хранящиеся в работающем процессе, почти наверняка будут соответствовать порядку байтов исполняемого процесса.Обычно форматы файлов (включая файлы классов) располагаются в сетевом порядке (с прямым порядком байтов).
Обычно сложно сказать, что делает машина, поскольку она абстрагируется виртуальной машиной.Вы не можете использовать short[]
к byte[]
как вы можете в C и C++. java.nio.ByteOrder.nativeOrder() должен дать вам основную последовательность байтов.Сопоставление порядка байтов полезно при использовании небайтовых буферов NIO.