32-битная и 64-битная совместимость с Java - PullRequest
96 голосов
/ 24 апреля 2009

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

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

Ответы [ 9 ]

92 голосов
/ 24 апреля 2009

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

20 голосов
/ 24 апреля 2009

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

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

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

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

11 голосов
/ 24 апреля 2009

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

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

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

10 голосов
/ 24 апреля 2009

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

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

8 голосов
/ 24 апреля 2009

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

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

3 голосов
/ 06 сентября 2012

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

2 голосов
/ 10 ноября 2010

Добавьте в настройку параметр, указанный ниже, при создании exe

http://www.technimi.com/index.php?do=/group/java/forum/building-an-exe-using-launch4j-for-32-bit-jvm/

Надеюсь, это поможет.

спасибо ...

/ * JAV 1010 *

0 голосов
/ 31 июля 2015

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

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

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

0 голосов
/ 22 мая 2011

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

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

...