32-разрядная совместимость с 32-разрядными версиями по сравнению с 64-разрядной

Будет ли Java-код построен и скомпилирован с 32-разрядным JDK в 32-разрядный байт-код в 64-разрядной JVM? Или 64-разрядная JVM требует 64-битного байтового кода?

Чтобы дать немного больше подробностей, у меня есть код, который работал в среде Solaris с 32-разрядной JVM, но теперь у меня возникают проблемы после обновления JDK и Weblogic Server до 64-разрядных.

Ответ 1

Да, байт-код Java (и исходный код) независим от платформы, предполагая, что вы используете независимые от платформы библиотеки. 32 против 64 бит не должны иметь значения.

Ответ 2

Я случайно запустил наше (большое) приложение на 64-битной виртуальной машине вместо 32-битной виртуальной машины и не заметил, что некоторые внешние библиотеки (вызванные JNI) начали сбой.

Данные, сериализованные на 32-битной платформе, были прочитаны на 64-битной платформе без каких-либо проблем.

Какие проблемы вы получаете? Некоторые вещи работают, а не другие? Вы пытались подключить JConsole и т.д. И иметь пик вокруг?

Если у вас очень большая виртуальная машина, вы можете обнаружить, что проблемы с GC на 64 бит могут повлиять на вас.

Ответ 3

Да к первому вопросу, а не ко второму вопросу; это виртуальная машина. Вероятно, ваши проблемы связаны с неопределенными изменениями в реализации библиотеки между версиями. Хотя это может быть, скажем, состояние гонки.

Есть несколько обручей, которые должна пройти VM. В частности, ссылки обрабатываются в файлах классов, как если бы они занимали то же место, что и int в стеке. double и long заняты двумя опорными слотами. Например, поля, там какая-то перегруппировка, как правило, проходит VM. Все это делается (относительно) прозрачно.

Также некоторые 64-разрядные JVM используют "сжатые oops". Поскольку данные выровнены примерно по 8 или 16 байт, три или четыре бита адреса бесполезны (хотя для некоторых алгоритмов может быть украден бит "отметки" ). Это позволяет использовать 32-разрядные адресные данные (поэтому, используя половину полосы пропускания и, следовательно, быстрее) использовать размеры кучи 35 или 36 бит на 64-битной платформе.

Ответ 4

Все байтовые коды основаны на 8 бит. (Вот почему его называемый код BYTE). Все инструкции имеют кратность 8 бит. Мы разрабатываем 32-битные машины и запускаем наши серверы с 64-разрядной JVM.

Не могли бы вы дать некоторые детали проблемы, с которой вы столкнулись? Тогда у нас может быть шанс помочь вам. В противном случае мы просто угадали бы, что проблема у вас есть.

Ответ 5

Если у вас нет собственного кода (машинный код, скомпилированный для определенной дуги), ваш код будет работать одинаково хорошо в 32-битной и 64-разрядной JVM.

Обратите внимание, однако, что из-за больших адресов (32-разрядный - 4 байта, 64-разрядный - 8 байтов) для 64-разрядной JVM потребуется больше памяти, чем 32-разрядная JVM для одной и той же задачи.

Ответ 6

32-разрядная и 64-разрядная разница становится более важной, когда вы взаимодействуете с родными библиотеками. 64-битная Java не сможет взаимодействовать с 32-разрядной не-Java-dll (через JNI)

Ответ 8

Java JNI требует, чтобы библиотеки ОС с той же "bittiness", что и JVM. Если вы попытаетесь создать что-то, что зависит, например, от IESHIMS.DLL(живет в% ProgramFiles%\Internet Explorer), вам нужно взять 32-битную версию, когда ваша JVM - 32-битная, 64-битная версия, когда ваша JVM - 64-битная. Аналогично для других платформ.

Кроме того, вы должны быть настроены. Сгенерированный байт-код Java s/b тот же.

Обратите внимание, что вы должны использовать компилятор на 64 бит Java для более крупных проектов, поскольку он может адресовать больше памяти.

Ответ 9

yo, где неправильно! На эту тему я написал вопрос оракулу. Ответ был.

"Если вы скомпилируете свой код на 32-битной машине, ваш код должен работать только на 32-битном процессоре. Если вы хотите запустить свой код на 64-битной JVM, вам нужно скомпилировать ваши файлы классов на 64-битной машине используя 64-битный JDK."