Java 32 bit ve 64 bit uyumluluğu


97

32-bit JDK'ya karşı 32-bit bayt koduna göre derlenen ve derlenen Java kodu 64-bit JVM'de çalışır mı? Yoksa 64 bitlik bir JVM, 64 bit bayt kodu gerektirir mi?

Biraz daha ayrıntı vermek gerekirse, 32 bit JVM çalıştıran Solaris ortamında çalışan kodum var, ancak şimdi JDK ve Weblogic Sunucusunu 64 bit'e yükselttikten sonra sorunlar alıyorum.


3
lütfen "sorunları" açıklığa kavuşturun.
Thorbjørn Ravn Andersen

Benzer bir sorun yaşıyorum - 64 bit weblogic sunucuda bir bahar uygulaması dağıtmak. İstisnalar bulunmayan çeşitli sınıflar ve diğer yardımcı olmayan hatalar alıyoruz. Ayrıca, bazı 64 bit makinelerde dağıtılır ve çalışır, ancak diğerlerinde çalışmaz. Ancak neyin farklı olduğunu söyleyemeyiz. Bunu çözdün mü?
hayır

2
@nont - sorun ne olursa olsun, 32vs64 bit derleme değildir.
Stephen C

Yanıtlar:


94

Evet, Java bayt kodu (ve kaynak kodu), platformdan bağımsız kitaplıkları kullandığınızı varsayarak platformdan bağımsızdır. 32'ye karşı 64 bit önemli olmamalıdır.


Sahip olduğum bir soruyu ararken bununla karşılaştım. Bu yüzden uygulamamı 32 bit JVM altında çalıştırdım ve 64 bit yerel kitaplık kullandım. İyi gitti. Ancak uygulamamı 64 bit JVM altında çalıştırdığımda ve 32 bit yerel kitaplık kullandığımda başarısız oluyor. Bu nasıl mümkün olabilir? Sadece merak.
Umang Desai

6
@umangdesai yerel kitaplıkları, platformdan bağımsız kitaplıklar değildir, dolayısıyla varsayım geçerli değildir.
Thorbjørn Ravn Andersen

"Önemi olmamalı", 32 bit ile derlenen kodun javac64 bit ile sağlanan bellekten yararlanacağı anlamına mı gelir java?
Marcus Junius Brutus

1
Bu konuda sıkıntı yaşıyorsanız, tek bir platform için çalışan, ancak size sorun çıkaran için olmayan bir kavanozda paketlenmiş yerel kitaplıklara dikkat edin. (Neden bahsettiğim hakkında hiçbir fikriniz yoksa, şuna benzer şeylere bakın: stackoverflow.com/a/14051512/155631 ).
Matt S.

21

(Büyükçe) uygulamamızı yanlışlıkla 32bit VM yerine 64bit VM üzerinde çalıştırdım ve bazı harici kitaplıklar (JNI tarafından çağrılan) başarısız olmaya başlayana kadar fark etmedim.

32bit platformda serileştirilen veriler 64bit platformda hiçbir sorun olmadan okundu.

Ne tür sorunlar yaşıyorsun? Bazı şeyler işe yarıyor mu, diğerleri değil mi? JConsole vb. Takmayı denediniz ve etrafta bir zirve yaptınız mı?

Çok büyük bir sanal makineniz varsa, 64 bit'teki GC sorunlarının sizi etkileyebileceğini fark edebilirsiniz.


1
JNI kitaplıklarının 32 bit olmaları durumunda 64 bitlik bir VM'de çalışmayacağını mı söylüyorsunuz?
C. Ross

1
Çalışmıyorlar. Bir meslektaşım yaptıklarını bildirdi (en azından şüpheli buldum). Solaris ile mi koştuğunu ve bir tür düşünceler olup olmadığını merak ettim. Orada değildi; yanılıyordu ve 32bit altında çalışıyordu.
Fortyrunner

Bir JNI kitaplığıyla benzer bir sorun yaşadım. 32 bit ve 64 bit kitaplıklar arasında uyumluluk yoktu.
Erick Robertson

Aslında, JNI kitaplıklarınızın değiştirilmesi gerekiyor. 64bit alternatifini muhtemelen satıcının web sitesinden indirebilirsiniz. (Bu, kullandığım tüm JNI kitaplıkları için benim için hile yaptı).
bvdb

Bunlar dahili kütüphanelerdi ve 64 bit eşdeğeri mevcut değildi, bu yüzden 32 bit'e geri dönmek günün
sırasıydı

11

İlk soruya evet, ikinci soruya hayır; bu sanal bir makinedir. Sorunlarınız muhtemelen, sürümler arasında kitaplık uygulamasındaki belirtilmemiş değişikliklerle ilgilidir. Diyelim ki bir yarış durumu olabilir.

VM'nin geçmesi gereken bazı çemberler var. Özellikle referanslar, sınıf dosyalarında int, yığındaki s ile aynı alanı almışlar gibi ele alınır . doubleve longiki referans yuvasını alın. Örneğin alanlar, sanal makinenin genellikle yine de geçtiği bazı yeniden düzenlemeler vardır. Bunların hepsi (nispeten) şeffaf bir şekilde yapılır.

Ayrıca bazı 64 bit JVM'ler "sıkıştırılmış hata" kullanır. Veriler her 8 veya 16 bayta bir hizalandığından, adresin üç veya dört biti işe yaramaz (bazı algoritmalar için bir "işaret" biti çalınabilir). Bu, 32 bit adres verilerinin (dolayısıyla bant genişliğinin yarısı kadar ve dolayısıyla daha hızlı) 64 bitlik bir platformda 35 veya 36 bit yığın boyutlarını kullanmasına izin verir.


3
Beni şaşırtıyorsun. 32-bit bayt kodu veya 64-bit bayt kodu diye bir şey olduğunu düşünmemiştim.
Jon Skeet

3
Cevabınızı tekrar okurken - bunu tam tersi bir şekilde kastetmediğinizden emin misiniz? (Evet, sonra hayır.)
Jon Skeet

Jon Skeet'e +1. Aynı yorumu yazıyordum ama arandım.
Michael Myers

Hayır o zaman evet demek istedim, ama sorular tam tersi. Bir düzenlemeyi geri aldınız ve düzenlediniz (ve biraz daha fazla bilgi eklediniz).
Tom Hawtin - tackline

4
@Jon Skeet: 32 bit ve 64 bit bayt kodu yoktur, ancak JVM'deki işaretçiler platforma bağlı olarak (genellikle) 32 veya 64 bittir. Ve Sıkıştırılmış OOPS ile birçok yerde, 64 bit JVM'lerde bile 32 bit işaretçileri kullanabilirler. Bu, oldukça fazla bellek tasarrufu sağlar ve kod yerelliğini artırır, böylece daha yüksek hız sağlar.
Joachim Sauer

9

Tüm bayt kodu 8 bit tabanlıdır. (Bu yüzden BYTE kodu olarak adlandırılır) Tüm talimatlar boyut olarak 8 bitin katlarıdır. 32 bit makinelerde geliştiriyor ve sunucularımızı 64 bit JVM ile çalıştırıyoruz.

Karşılaştığınız problemin biraz detayını verebilir misiniz? O zaman sana yardım etme şansımız olabilir. Aksi takdirde, sorunun ne olduğunu tahmin etmiş oluruz.


8

Yerel kodunuz yoksa (belirli bir arcitechture için derlenmiş makine kodu), kodunuz 32 bit ve 64 bit JVM'de eşit derecede iyi çalışacaktır.

Bununla birlikte, daha büyük adresler nedeniyle (32-bit 4 bayt, 64-bit 8 bayttır) 64-bit bir JVM'nin aynı görev için 32-bit JVM'den daha fazla bellek gerektireceğini unutmayın.


Ayrıca, 64 bit sistemdeki 32 bit JVM'nin 32 bitlik bir sistemdeki 32 bit JVM'den daha fazla kullanılabilir belleğe sahip olabileceğini unutmayın; bu nedenle, "birkaç GB bellek kullanıyorsanız, bu ilginç bir seçenek olabilir " uygulama.
Thorbjørn Ravn Andersen

3

Yerel kitaplıklarla arabirim oluştururken 32 bit ile 64 bit arasındaki fark daha önemli hale gelir. 64 bit Java, 32 bitlik Java dışı bir dll ile (JNI aracılığıyla) arabirim kuramaz


5
Bu çok eski soruya yeni bir şey sağlamadınız.
Austin Henley


0

Java JNI, JVM ile aynı "bittiteli" işletim sistemi kitaplıklarını gerektirir. Örneğin, IESHIMS.DLL'a (% ProgramFiles% \ Internet Explorer'da yaşıyor) bağlı bir şey oluşturmaya çalışırsanız, JVM'niz 32bit olduğunda 32bit sürümünü, JVM'niz 64bit olduğunda 64bit sürümünü almanız gerekir. Aynı şekilde diğer platformlar için.

Bunun dışında, hazır olmalısın. Oluşturulan Java bayt kodu aynıdır.

Daha büyük projeler için 64bit Java derleyicisini kullanmanız gerektiğini unutmayın, çünkü daha fazla belleği adresleyebilir.


-5

Yo nerede yanlış! Bu temaya oracle'a bir soru yazdım. Cevap şuydu.

"Kodunuzu 32 Bitlik bir Makinede derlerseniz, kodunuz yalnızca 32 Bit İşlemci üzerinde çalışmalıdır. Kodunuzu 64 Bit JVM üzerinde çalıştırmak istiyorsanız, sınıf Dosyalarınızı 64 Bitlik bir Makine üzerinde bir 64 kullanarak derlemeniz gerekir. -Bit JDK. "


5
Bayt kodu biçimi Java kodu genellikle derlenmiş bakılmaksızın 32bit veya 64bit platformları aynıdır. Kurallar herhangi bir yerel kod için farklıdır ancak Java bayt kodu taşınabilirdir.
McDowell

4
Evet, görünüşe göre Oracle'da sorunuzu cevaplayan kişi ya yanlış anladı ya da JVM hakkında hiçbir şey bilmiyor.
Paŭlo Ebermann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.