Czy kod Java zbudowany i skompilowany na 32-bitowym JDK do 32-bitowego kodu będzie działał w 64-bitowej JVM? A może 64-bitowa maszyna JVM wymaga 64-bitowego kodu bajtowego?
Aby dać trochę więcej szczegółów, mam kod, który działał w środowisku Solaris z 32-bitową maszyną JVM, ale teraz pojawiają się problemy po aktualizacji JDK i serwera Weblogic do wersji 64-bitowej.
Odpowiedzi:
Tak, kod bajtowy Java (i kod źródłowy) jest niezależny od platformy, przy założeniu, że używasz bibliotek niezależnych od platformy. 32 i 64 bit nie powinny mieć znaczenia.
źródło
javac
będzie korzystał z pamięci udostępnionej w wersji 64-bitowejjava
?Przypadkowo uruchomiłem naszą (dużą) aplikację na 64-bitowej maszynie wirtualnej, a nie na 32-bitowej maszynie wirtualnej, i nie zauważyłem, dopóki niektóre zewnętrzne biblioteki (wywołane przez JNI) nie zaczęły ulegać awarii.
Dane serializowane na platformie 32-bitowej zostały wczytane na platformie 64-bitowej bez żadnych problemów.
Jakie masz problemy? Czy niektóre rzeczy działają, a inne nie? Czy próbowałeś dołączyć JConsole itp. I masz szczyt?
Jeśli masz bardzo dużą maszynę wirtualną, może się okazać, że problemy z GC w wersji 64-bitowej mogą wpływać na Ciebie.
źródło
Tak na pierwsze pytanie i nie na drugie pytanie; to maszyna wirtualna. Twoje problemy są prawdopodobnie związane z nieokreślonymi zmianami w implementacji biblioteki pomiędzy wersjami. Chociaż może to być, powiedzmy, stan wyścigu.
Maszyna wirtualna musi przejść przez kilka przeszkód. W szczególności odwołania są traktowane w plikach klas tak, jakby zajmowały tyle samo miejsca co
int
s na stosie.double
ilong
zajmij dwa sloty referencyjne. Na przykład pola, istnieje pewna rearanżacja, przez którą zwykle przechodzi VM. Wszystko to odbywa się (względnie) przejrzyście.Również niektóre 64-bitowe maszyny JVM używają „skompresowanych błędów”. Ponieważ dane są wyrównane co około 8 lub 16 bajtów, trzy lub cztery bity adresu są bezużyteczne (chociaż w przypadku niektórych algorytmów może zostać skradziony bit „znacznika”). Dzięki temu 32-bitowe dane adresowe (a zatem wykorzystujące o połowę mniej przepustowości, a tym samym szybsze) mogą używać rozmiarów sterty 35- lub 36-bitowych na platformie 64-bitowej.
źródło
Cały kod bajtowy jest oparty na 8 bitach. (Dlatego nazywa się to kodem BYTE) Wszystkie instrukcje są wielokrotnością 8-bitów. Tworzymy na maszynach 32-bitowych, a nasze serwery uruchamiamy na 64-bitowej JVM.
Czy mógłbyś szczegółowo opisać problem, z którym się borykasz? Wtedy będziemy mieli szansę ci pomóc. W przeciwnym razie po prostu zgadywalibyśmy, jaki masz problem.
źródło
Jeśli nie masz kodu natywnego (kod maszynowy skompilowany dla konkretnej architektury arkusza), Twój kod będzie działał równie dobrze w 32-bitowej i 64-bitowej JVM.
Należy jednak pamiętać, że ze względu na większe adresy (32-bitowa to 4 bajty, 64-bitowa to 8 bajtów) 64-bitowa maszyna JVM będzie wymagała więcej pamięci niż 32-bitowa JVM do tego samego zadania.
źródło
Różnica między wersjami 32-bitowymi a 64-bitowymi staje się coraz ważniejsza, gdy łączysz się z bibliotekami natywnymi. 64-bitowa Java nie będzie mogła współpracować z 32-bitową biblioteką DLL inną niż Java (przez JNI)
źródło
Dodaj parametr jak poniżej w konfiguracji podczas tworzenia pliku exe
http://www.technimi.com/index.php?do=/group/java/forum/building-an-exe-using-launch4j-for-32-bit-jvm/
Mam nadzieję, że to pomoże.
dzięki...
/ jav
źródło
Java JNI wymaga bibliotek systemu operacyjnego o tej samej „zaciekłości” co JVM. Jeśli spróbujesz zbudować coś, co zależy, na przykład, od IESHIMS.DLL (znajduje się w% ProgramFiles% \ Internet Explorer), musisz wybrać wersję 32-bitową, gdy Twoja maszyna JVM jest 32-bitowa, wersję 64-bitową, gdy JVM jest 64-bitowa. To samo dotyczy innych platform.
Poza tym wszystko powinno być gotowe. Wygenerowany kod bajtowy Java s / b jest taki sam.
Zauważ, że powinieneś używać 64-bitowego kompilatora Java do większych projektów, ponieważ może on zająć więcej pamięci.
źródło
yo, gdzie źle! W tym temacie napisałem pytanie do wyroczni. Odpowiedź brzmiała.
„Jeśli kompilujesz kod na maszynie 32-bitowej, Twój kod powinien działać tylko na procesorze 32-bitowym. Jeśli chcesz uruchomić kod na 64-bitowej maszynie JVM, musisz skompilować klasę Files na maszynie 64-bitowej przy użyciu -Bit JDK. "
źródło