32-розрядна сумісність Java проти 64-бітної сумісності


97

Чи буде вбудований і компільований код Java проти 32-розрядного JDK в 32-розрядний байт-код в 64-розрядному JVM? Або 64-розрядна JVM вимагає 64-розрядного байт-коду?

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


3
уточнюйте, будь ласка, "питання".
Thorbjørn Ravn Andersen

У мене є аналогічна проблема - розгортання весняного додатка на 64-бітному веб-сервері. Ми отримуємо різні не знайдені винятки класу та інші непотрібні помилки. Крім того, він розгортається та працює на деяких 64-бітних машинах, але не на інших. Однак ми не можемо сказати, чим відрізняється. Ви вирішили це?
неділя

2
@nont - яка б не була проблема, це не компіляція бітів 32vs64.
Стівен C

Відповіді:


94

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


Я наткнувся на це, шукаючи питання, яке у мене було. Так я запустив свою програму під 32-бітовим JVM і використав 64-бітну рідну бібліотеку. Це пройшло чудово. Але коли я запускаю свою програму під 64-бітовим JVM і використовую 32-бітну рідну бібліотеку, вона не спрацьовує. Як це могло бути можливим? Просто цікаво.
Umang Desai

6
Народні бібліотеки @umangdesai не є незалежними від платформи бібліотеками, отже, припущення не відповідає.
Thorbjørn Ravn Andersen

Чи "не має значення" означає, що код, скомпільований з 32-розрядної javac, скористається пам'яттю, доступною за допомогою 64-розрядних java?
Маркус Юній Брут

1
Якщо ви зациклюєтесь на цьому, слідкуйте за рідними бібліотеками, які вкладені в банку, які працюють на одній платформі, а не на тій, яка видає вам проблеми. (Якщо ви поняття не маєте, про що я маю на увазі, дивіться такі речі: stackoverflow.com/a/14051512/155631 ).
Метт С.

21

Я випадково запустив нашу (велику) програму на 64-бітовому ВМ, а не на 32-бітовому ВМ, і не помітив, поки деякі зовнішні бібліотеки (звані JNI) почали виходити з ладу.

Дані, серіалізовані на 32-бітній платформі, зачитувалися на 64-бітній платформі, без проблем.

Які проблеми ви отримуєте? Чи працюють деякі речі, а не інші? Ви пробували приєднати JConsole тощо і маєте пік навколо?

Якщо у вас дуже велика віртуальна машина, ви можете виявити, що проблеми з GC у 64 бітах можуть вплинути на вас.


1
ти хочеш сказати, що бібліотеки JNI не працюватимуть у 64-розрядної ВМ, якщо вони 32-розрядні?
К. Росс

1
Вони не працюють. Колега повідомив, що вони це зробили (що я вважаю підозрілим - як мінімум). Мені було цікаво, чи він бігає на Соляріс, і чи не відбувається якась дурня? Не було; він помилявся, і він працював під 32-бітовим.
Fortyrunner

У мене була подібна проблема з бібліотекою JNI. Не було сумісності між 32-розрядною та 64-розрядною бібліотеками.
Ерік Робертсон,

Дійсно, ваші війська JNI потрібно замінити. Можливо, ви можете просто завантажити 64-бітну альтернативу з веб-сайту постачальника. (Це зробило трюк для мене, для всіх бібліотек JNI, якими я користувався).
bvdb

Це були внутрішні бібліотеки, і 64-бітовий еквівалент не був доступний, тому повернення до 32-бітного було впорядкованим днем ​​..
Fortyrunner

11

Так на перше питання і ні на друге питання; це віртуальна машина. Можливо, ваші проблеми пов'язані з невстановленими змінами в реалізації бібліотеки між версіями. Хоча це може бути, скажімо, умова гонки.

Є кілька обручів, через які VM має пройти. Особливо посилання обробляються у файлах класу так, ніби вони займають таке ж місце, як і ints у стеці. doubleі longзаймати два опорні проміжки. Наприклад, поля є деяка перебудова, через яку ВМ зазвичай проходить. Це все робиться (відносно) прозоро.

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


3
Ви мене здивуєте. Я не думав, що існує таке поняття, як 32-розрядний байт-код або 64-розрядний байт-код.
Джон Скіт,

3
Перечитуючи свою відповідь - ви впевнені, що не просто думали навпаки? (Так, тоді ні.)
Джон Скіт,

+1 до Джона Скіта. Я писав той же коментар, але мені зателефонували.
Майкл Майєрс

Я мав на увазі не так, а з питаннями навпаки. Скасували редагування та відредагували (і додамо трохи більше інформації).
Том Хотін - тайклін

4
@Jon Skeet: немає 32-бітового та 64-бітового байт-коду, але коли JITed вказівники в JVM складаються (як правило) 32 або 64 бітні, залежно від платформи. А з компресованим OOPS вони можуть використовувати 32-бітові вказівники в багатьох місцях, навіть на 64-бітових JVM. Це економить зовсім небагато пам'яті та збільшує локальність коду, тим самим ведучи до більшої швидкості.
Йоахім Зауер

9

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

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


8

Якщо у вас немає нативного коду (машинного коду, складеного для конкретної архітехніки), ваш код буде працювати однаково добре в 32-бітному та 64-бітному JVM.

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


Також зауважте, що 32-розрядний JVM в 64-бітній системі може мати більше пам'яті, ніж 32-розрядний JVM в 32-бітній системі, тому це може бути цікавим варіантом, якщо ви "використовуєте кілька ГБ пам'яті "додаток.
Thorbjørn Ravn Andersen

3

Різниця між 32-розрядною та 64-бітною версією стає важливішою при взаємодії з рідними бібліотеками. 64-розрядна Java не зможе взаємодіяти з 32-розрядним dll без Java (через JNI)


5
Ви не дали нічого нового в цьому дуже старому питанні.
Остін Генлі


0

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

Крім цього, у вас має бути все налаштовано. Створений байт-код Java s / b те саме.

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


-5

йо, де не так! До цієї теми я написав запитання до oracle. Відповідь була.

"Якщо ви компілюєте свій код на 32-бітній машині, ваш код повинен працювати лише на 32-бітовому процесорі. Якщо ви хочете запустити свій код на 64-бітовому JVM, вам слід скласти файли класу на 64-бітній машині за допомогою 64 -Біт JDK. "


5
Формат байтового коду Java-код зазвичай компілюється в той самий незалежно від 32-бітної або 64-бітної платформ. Правила різні для будь-якого нативного коду, але байт-код Java є портативним.
МакДауелл

4
Так, схоже, хто з Oracle відповідав на ваше запитання, або неправильно його зрозумів, або нічого не знав про JVM.
Paŭlo Ebermann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.