जावा 32-बिट बनाम 64-बिट संगतता


97

क्या जावा कोड 64-बिट JVM में 32-बिट JDK के साथ 32-बिट बाइट कोड में बनाया और संकलित किया जाएगा? या क्या 64-बिट JVM को 64-बिट बाइट कोड की आवश्यकता होती है?

थोड़ा और विस्तार देने के लिए, मेरे पास एक कोड है जो 32-बिट जेवीएम चलाने वाले सोलारिस वातावरण में काम कर रहा था, लेकिन अब मुझे जेडीके और वेबलॉजिक सर्वर को 64-बिट में अपग्रेड करने के बाद मुद्दे मिल रहे हैं।


3
कृपया "मुद्दों" को स्पष्ट करें।
थोरबजोरन राव एंडरसन

मेरे पास एक समान मुद्दा है - 64 बिट वेबलॉजिक सर्वर पर एक स्प्रिंग ऐप को तैनात करना। हम विभिन्न वर्ग को अपवाद नहीं पाते हैं, और अन्य त्रुटिपूर्ण त्रुटियां हैं। इसके अलावा, यह कुछ 64 बिट मशीनों पर चलता है और चलता है, लेकिन अन्य नहीं। हम यह नहीं बता सकते कि अलग क्या है। क्या आपने इसे हल किया?
nont

2
@ न - जो भी समस्या है, वह 32vs64 बिट संकलन नहीं है।
स्टीफन सी

जवाबों:


94

हां, जावा बाइटकोड (और स्रोत कोड) प्लेटफ़ॉर्म स्वतंत्र है, यह मानते हुए कि आप प्लेटफ़ॉर्म स्वतंत्र पुस्तकालयों का उपयोग करते हैं। 32 बनाम 64 बिट से कोई फर्क नहीं पड़ता।


मैं एक सवाल मैं था की खोज करते हुए इस में भाग गया। इसलिए मैंने एक 32 बिट JVM के तहत अपने आवेदन को चलाया और 64 बिट देशी पुस्तकालय का उपयोग किया। यह ठीक चला। लेकिन जब मैं अपना आवेदन 64 बिट जेवीएम के तहत चलाता हूं और 32 बिट देशी पुस्तकालय का उपयोग करता हूं, तो यह विफल हो जाता है। यह कैसे संभव हो सकता है? बस उत्सुक।
उमंग देसाई

6
@umangdesai देशी पुस्तकालय स्वतंत्र पुस्तकालय नहीं हैं, इसलिए धारणा पकड़ में नहीं आती है।
थोरबजोरन रावन एंडरसन

क्या "कोई फर्क नहीं पड़ता" का मतलब है कि 32-बिट के साथ संकलित कोड javac64-बिट के साथ उपलब्ध कराई गई मेमोरी का लाभ उठाएगा java?
मार्कस जूनियस ब्रूटस

1
यदि आप इस पर डंक मार रहे हैं, तो देशी पुस्तकालयों के लिए देखें, जिन्हें एक जार में बांधा गया है, जो एक मंच के लिए काम करते हैं, लेकिन आपके मुद्दों को देने वाले के लिए नहीं। (यदि आपको कोई अंदाजा नहीं है कि मैं किस चीज का जिक्र कर रहा हूं, तो इस तरह की चीजें देखें: stackoverflow.com/a/14051512/150031 )।
मैट एस।

21

मैंने गलती से हमारे (लार्जिश) एप्लिकेशन को 32 बिट वीएम के बजाय 64 बिट वीएम पर चला दिया था और तब तक नोटिस नहीं किया जब तक कि कुछ बाहरी पुस्तकालयों (जेएनआई द्वारा कहा जाता है) विफल नहीं हुआ।

32 बिट प्लेटफॉर्म पर क्रमबद्ध डेटा 64 बिट प्लेटफॉर्म पर पढ़ा गया, जिसमें कोई समस्या नहीं थी।

आपको किस तरह के मुद्दे मिल रहे हैं? कुछ काम करते हैं और दूसरों को नहीं? आप JConsole आदि संलग्न करने की कोशिश की है और चारों ओर एक चोटी है?

यदि आपके पास बहुत बड़ा वीएम है तो आप पा सकते हैं कि 64 बिट में जीसी मुद्दे आपको प्रभावित कर सकते हैं।


1
क्या आप कह रहे हैं कि यदि वे 32 बिट हैं तो जेएनआई लाइब्रेरी 64 बिट वीएम में काम नहीं करेगी?
सी। रॉस

1
वे काम नहीं करते। एक सहकर्मी ने बताया था कि उन्होंने ऐसा किया था (जो मुझे संदिग्ध लगा - कम से कम कहने के लिए)। मैं सोचता था कि क्या वह सोलारिस पर चल रहा था और वहाँ किसी तरह की छटपटाहट चल रही थी। वहाँ नहीं था; वह गलत था और यह 32 बिट के तहत चल रहा था।
Fortununner

मेरे पास जेएनआई लाइब्रेरी के साथ एक समान मुद्दा था। 32-बिट और 64-बिट लाइब्रेरी के बीच कोई संगतता नहीं थी।
एरिक रॉबर्टसन

वास्तव में, आपके जेएनआई के कामों को बदलने की जरूरत है। आप शायद विक्रेता की वेबसाइट से 64 बिट विकल्प डाउनलोड कर सकते हैं। (जो मेरे लिए जेएनआई के उन सभी कामों के लिए चाल चली, जो मैंने इस्तेमाल की)।
bvdb

ये आंतरिक पुस्तकालय थे और कोई 64 बिट समतुल्य उपलब्ध नहीं था, इसलिए 32 बिट पर वापस दिन का क्रम था ..
Fortyrunner

11

पहले प्रश्न के लिए हाँ और दूसरे प्रश्न के लिए नहीं; यह एक वर्चुअल मशीन है। आपकी समस्याएं संभवतः संस्करणों के बीच पुस्तकालय कार्यान्वयन में अनिर्दिष्ट परिवर्तनों से संबंधित हैं। हालांकि यह हो सकता है, कहते हैं, एक दौड़ की स्थिति।

कुछ हुप्स हैं जिनसे वीएम को गुजरना पड़ता है। विशेष रूप से संदर्भों को वर्ग फ़ाइलों में माना जाता है जैसे कि वे intस्टैक पर एस के समान स्थान लेते हैं । doubleतथाlong दो संदर्भ स्लॉट लें। उदाहरण के लिए फ़ील्ड, वीएम कुछ पुनर्व्यवस्था है जो आमतौर पर किसी भी माध्यम से जाती है। यह सब (अपेक्षाकृत) पारदर्शी तरीके से किया जाता है।

साथ ही कुछ 64-बिट JVM "संपीड़ित ऊप्स" का उपयोग करते हैं। क्योंकि डेटा हर 8 या 16 बाइट्स के आसपास संरेखित होता है, पते के तीन या चार बिट बेकार होते हैं (हालांकि कुछ एल्गोरिदम के लिए "निशान" बिट चोरी हो सकता है)। यह 32-बिट एड्रेस डेटा (इसलिए आधे बैंडविड्थ का उपयोग करके, और इसलिए तेजी से) 64-बिट प्लेटफॉर्म पर 35- या 36-बिट्स के ढेर का उपयोग करने की अनुमति देता है।


3
तुमने मुझे चौंका दिया। मुझे नहीं लगा कि 32-बिट बाइट कोड या 64-बिट बाइट कोड जैसी कोई चीज थी।
जॉन स्कीट

3
अपना उत्तर पुन: प्रस्तुत करना - क्या आप सुनिश्चित हैं कि आप इसका मतलब यह नहीं चाहते थे कि यह दूसरा रास्ता है? (हां तब नहीं।)
जॉन स्कीट

जॉन स्कीट को +1। मैं वही टिप्पणी लिख रहा था, लेकिन मुझे बुलाया गया।
माइकल मायर्स

मेरा मतलब हां नहीं था, लेकिन सवालों के साथ दूसरे तरीके से। वापस संपादित करें और संपादित करें (और थोड़ा और जानकारी डालें)।
टॉम हैटिन

4
@Jon Skeet: कोई 32-बिट और 64-बिट बायटेकोड नहीं है, लेकिन जब JVM में संकेत दिए गए हैं (आमतौर पर) 32 या 64 बिट, प्लेटफॉर्म पर निर्भर करता है। और संपीडित OOPS के साथ वे 64 बिट JVM पर भी कई स्थानों पर 32 बिट पॉइंटर्स का उपयोग कर सकते हैं। यह मेमोरी की थोड़ी बहुत बचत करता है और कोड लोकलिटी को बढ़ाता है, जिससे अधिक से अधिक गति होती है।
जोकिम सॉयर

9

सभी बाइट कोड 8-बिट आधारित हैं। (इसीलिए इसका नाम BYTE कोड है) सभी निर्देश आकार में 8-बिट्स के कई हैं। हम 32-बिट मशीनों पर विकसित होते हैं और 64-बिट जेवीएम के साथ हमारे सर्वर चलाते हैं।

क्या आप समस्या का कुछ विस्तार दे सकते हैं? तब हमारे पास आपकी मदद करने का मौका हो सकता है। अन्यथा हम सिर्फ अनुमान लगा रहे होंगे कि आपको क्या समस्या है।


8

जब तक आपके पास मूल कोड (विशिष्ट आर्किटेकचर के लिए संकलित मशीन कोड) नहीं है, आपका कोड 32-बिट और 64-बिट जेवीएम में समान रूप से चलेगा।

हालाँकि, ध्यान दें कि बड़े एड्रेसेस के कारण (32-बिट 4 बाइट्स है, 64-बिट 8 बाइट्स है) 64-बिट JVM को समान कार्य के लिए 32-बिट JVM से अधिक मेमोरी की आवश्यकता होगी।


यह भी ध्यान दें कि 32-बिट JVM 64-बिट सिस्टम पर 32-बिट JVM की तुलना में 32-बिट सिस्टम पर अधिक मेमोरी उपलब्ध हो सकती है, इसलिए यह एक दिलचस्प विकल्प हो सकता है यदि आपके पास "कुछ जीबी मेमोरी का उपयोग करें" “आवेदन।
थोरबजोरन रावन एंडरसन

3

32-बिट बनाम 64-बिट अंतर अधिक महत्वपूर्ण हो जाता है जब आप देशी पुस्तकालयों के साथ हस्तक्षेप कर रहे होते हैं। 64-बिट जावा 32-बिट गैर-जावा dll (JNI के माध्यम से) के साथ इंटरफेस करने में सक्षम नहीं होगा


5
आपने इस बहुत पुराने प्रश्न को कुछ नया नहीं दिया।
ऑस्टिन हेनले


0

जावा जेएनआई को जेवीएम के समान "बिट्टीनेस" के ओएस लाइब्रेरी की आवश्यकता होती है। यदि आप कुछ ऐसा निर्माण करने का प्रयास करते हैं, जो निर्भर करता है, उदाहरण के लिए, IESHIMS.DLL पर (% ProgramFiles% \ Internet Explorer में रहता है) तो आपको 32V संस्करण लेने की आवश्यकता है जब आपका JVM 32bit है, 64V संस्करण जब आपका VVM 64bit है। इसी तरह अन्य प्लेटफार्मों के लिए।

इसके अलावा, आपको सभी सेट होना चाहिए। उत्पन्न जावा बाइटकोड / एस वही।

ध्यान दें कि आपको बड़ी परियोजनाओं के लिए 64 बिट जावा कंपाइलर का उपयोग करना चाहिए क्योंकि यह अधिक मेमोरी को संबोधित कर सकता है।


-5

यो गलत कहाँ है! इस विषय के लिए मैंने एक सवाल लिखा था। जवाब था।

"यदि आप 32 बिट मशीन पर अपना कोड संकलित करते हैं, तो आपका कोड केवल 32 बिट प्रोसेसर पर चलना चाहिए। यदि आप 64 बिट जेवीएम पर अपना कोड चलाना चाहते हैं, तो आपको 64 बिट मशीन पर 64 के उपयोग से अपनी कक्षा की फाइलें संकलित करनी होंगी। -बीट जेडीके। "


5
बाइट कोड प्रारूप जावा कोड आमतौर पर करने के लिए संकलित किया गया है 32bit या 64bit प्लेटफार्मों की परवाह किए बिना एक ही है। किसी भी मूल कोड के लिए नियम अलग हैं लेकिन जावा बाइट कोड पोर्टेबल है।
मैकडॉवेल

4
हाँ, ऐसा लगता है कि जो भी ओरेकल पर था वह आपके प्रश्न का उत्तर दे रहा था या तो इसे गलत समझा या जेवीएम के बारे में कुछ भी नहीं पता था।
पाओलो एबरमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.