यदि मैं 64-बिट JVM या 32-बिट JVM (किसी प्रोग्राम के भीतर से) में चल रहा हूं, तो मैं कैसे बता सकता हूं?


563

मैं कैसे बता सकता हूं कि जेवीएम जिसमें मेरा आवेदन 32 बिट या 64-बिट है? विशेष रूप से, कार्यक्रम के भीतर इसका पता लगाने के लिए मैं किन कार्यों या गुणों का उपयोग कर सकता हूं?


3
जिज्ञासा से बाहर, आपको सिस्टम के प्राकृतिक आकार को जानने की आवश्यकता क्यों होगी? विवरण जैसे कि यह जावा में सारगर्भित है, इसलिए आपको (सिद्धांत में, कम से कम) उन्हें नहीं जानना चाहिए।
पैट्रिक Niedzielski

3
यह मुझे संकेत के कारण वस्तुओं के लिए स्मृति आवश्यकताओं का अनुमान लगाने में मदद करता है। उत्सुकता भी - ऐसा लग रहा था कि एक रास्ता होना चाहिए, लेकिन मैंने इसके बारे में कभी नहीं सुना।
BobMcGee

85
यह "विस्तार" जावा नेटिव इंटरफेस के साथ बातचीत करते समय दूर नहीं है। 32-बिट DLL को 64-बिट JVM (और इसके विपरीत) से लोड नहीं किया जा सकता है। तो यह जेएनआई का उपयोग करने वाले किसी भी व्यक्ति के लिए काफी आवश्यक जानकारी है। यह अफ़सोस की बात है कि इस जानकारी को प्राप्त करने का कोई पोर्टेबल तरीका नहीं है। एक तरीका यह है कि आप पहले DLL के 32-बिट संस्करण को लोड करने का प्रयास करें, और यदि यह विफल रहता है, तो 64-बिट संस्करण आदि का प्रयास करें, अग्ली!
Joonas Pulakka

12
एक अन्य स्थिति जहां 32 या 64 बिट JVM के बीच समझदारी है, मैप की गई फ़ाइलों के लिए महत्वपूर्ण है। 32 बिट सिस्टम पर केवल 2GB की मैपिंग की जा सकती है, इसलिए यह जरूरी है कि फाइल सेगमेंट को मैप करें और उसी के अनुसार सेगमेंट करें, ताकि यह सीमा पार न हो, जबकि 64 बिट jvms की सीमा बहुत अधिक, बहुत अधिक है।
सिमोन गियानी

2
यह वास्तव में अच्छा है कि संख्यात्मक एल्गोरिथ्म का चयन करने में सक्षम होना चाहिए जो कि मशीन में सबसे तेज़ होगा।
dfeuer

जवाबों:


317

आप उस सिस्टम प्रॉपर्टी को पुनः प्राप्त करते हैं जो इस JVM की बिटनेस को चिन्हित करता है:

System.getProperty("sun.arch.data.model");

संभावित परिणाम हैं:

  • "32" - 32-बिट जेवीएम
  • "64" - 64-बिट जेवीएम
  • "unknown" - अज्ञात जेवीएम

जैसा कि हॉटस्पॉट FAQ में वर्णित है :

जावा कोड लिखते समय, मैं 32 और 64-बिट ऑपरेशन के बीच अंतर कैसे कर सकता हूं?

कोई सार्वजनिक एपीआई नहीं है जो आपको 32 और 64-बिट ऑपरेशन के बीच अंतर करने की अनुमति देता है। 64-बिट को केवल एक बार लिखने के लिए एक और मंच के रूप में सोचें, कहीं भी परंपरा को चलाएं। हालाँकि, यदि आप कोड लिखना चाहते हैं जो कि प्लेटफ़ॉर्म विशिष्ट (आप पर शर्म की बात है), सिस्टम प्रॉपर्टी sun.arch.data.model का मान "32", "64", या "अज्ञात" है।

एक उदाहरण जहां यह आवश्यक हो सकता है यदि आपका जावा कोड देशी पुस्तकालयों पर निर्भर करता है, और आपको यह निर्धारित करने की आवश्यकता है कि स्टार्टअप पर पुस्तकालयों के 32- या 64-बिट संस्करण को लोड करना है या नहीं।


22
मैं sun.*आईबीएम JVM के साथ सिस्टम प्रॉपर्टी खोजने की उम्मीद नहीं करूंगा । दूसरे शब्दों में, यह पोर्टेबल नहीं है।
पास्कल थिवेंट

8
आप कमांड लाइन से कैसे बता सकते हैं? यदि आप 32-बिट या 64-बिट चला रहे हैं? बस उत्सुक।
Xonatron

17
सूर्य-आश्रित उत्तर क्यों स्वीकार किया जाता है? "os.arch" मालिकाना सूरज पैकेज का उपयोग किए बिना एक ही बात को पूरा करेगा।
b1nary.atr0phy

7
@ b1naryatr0phy, ऑपरेटिंग सिस्टम या JVM पर os.arch रिपोर्ट करता है? मैं अक्सर विकास के उद्देश्यों के लिए अपने 64-बिट वर्कस्टेशन पर 32-बिट जेवीएम चलाता हूं।
Skiphoppy

7
यह संपत्ति आईबीएम जेवीएम पर समर्थित है, लेकिन जीसीजे पर नहीं। देखें stackoverflow.com/questions/807263/…
Emmanuel Bourg

707

जावा के कुछ संस्करणों के लिए, आप झंडे के साथ कमांड लाइन से जेवीएम की बिटनेस की जांच कर सकते हैं -d32और -d64

$ java -help
...
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available

64-बिट JVM की जांच करने के लिए, दौड़ें:

$ java -d64 -version

यदि यह 64-बिट JVM नहीं है, तो आपको यह मिलेगा:

Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.

इसी तरह, 32-बिट JVM के लिए जाँच करें, चलाने के लिए:

$ java -d32 -version

यदि यह 32-बिट JVM नहीं है, तो आपको यह मिलेगा:

Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.

ये ध्वज जावा 7 में जोड़े गए, जावा 9 में पदावनत , जावा 10 में हटाए गए, और अब जावा के आधुनिक संस्करणों पर उपलब्ध नहीं हैं।


3
हालांकि यह जानना अच्छा है, यह उपयोगी नहीं है b / c मुझे इसे प्रोग्राम के बाहर से चलाने की आवश्यकता है या एक नई प्रक्रिया शुरू करने के लिए जावा विकल्पों का उपयोग करें।
BobMcGee

13
ठीक वही जो मेरे द्वारा खोजा जा रहा था। और आप java -d32 -versionसत्यापित करने के लिए चला सकते हैं कि आप 32-बिट नहीं चला रहे हैं। दोनों काम करना चाहते हैं Win7
Xonatron

31
मैं विंडोज 7 पर हूं, और मुझे 'गैर-मान्यता प्राप्त विकल्प' त्रुटि java -d32 -version भी और से भी मिलती हैjava -d64 -version
ईली

40
"-D64" का उपयोग न करें, इसके लिए कुछ पूरी तरह से अलग करता है। यह "64" नामक एक सिस्टम गुण को परिभाषित करता है। यह निश्चित रूप से वह नहीं है जो यहां चाहिए।
जोनाथन हेडलैंड

9
-D32 या -d64 झंडे केवल जावा 7 या अधिक के लिए काम करेंगे।
darrenmc

187

बस java -versionअपने कंसोल में टाइप करें।

यदि 64 बिट संस्करण चल रहा है, तो आपको एक संदेश मिलेगा:

java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)

32 बिट संस्करण कुछ इसी तरह दिखाएगा:

java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)

तीसरी पंक्ति के Clientबजाय ध्यान दें 64-Bit Server। यह Client/Serverहिस्सा अप्रासंगिक है, यह 64-Bitउस मामलों की अनुपस्थिति है।

यदि आपके सिस्टम पर एक से अधिक जावा संस्करण स्थापित हैं, तो आप जिस जावा संस्करण की जांच करना चाहते हैं, java -versionवहां / टाइप करें और वहां टाइप करें ।


लेकिन hp नॉनस्टॉप oss env में मुझे 64bit या 32 बिट नहीं मिल रहा है
vels4j

28
ओपी कार्यक्रम के भीतर विशेष रूप से कहते हैं ।
टॉम ज़ातो -

34

मैंने 32-बिट JVM स्थापित किया और इसे फिर से प्राप्त किया, ऐसा लगता है कि निम्नलिखित आपको JVM बिटनेस बताता है, ओएस आर्क नहीं:

System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM

यह SUN और IBM JVM (32 और 64-बिट) दोनों के खिलाफ परीक्षण किया गया था। स्पष्ट रूप से, सिस्टम गुण केवल ऑपरेटिंग सिस्टम आर्च नहीं है।


7
यह ऑपरेटिंग सिस्टम आर्किटेक्चर की जानकारी देता है। अगर मैं गलत नहीं हूँ, यह JVM बिटनेस के समान नहीं है।
कोडादिक

2
@codadict, ऐसा लगता है कि यह वास्तव में JVM बिटनेस है।
bryantsai

20
@codaddict यह पूरी तरह से गलत है (और मुझे नहीं पता कि छह पीपीएल ने टिप्पणी क्यों की है।) "os.arch" को जेवीएम संस्करण को वापस करने के लिए डिज़ाइन किया गया है। यदि आप वास्तव में ओएस का पता लगाने के लिए इस पर भरोसा कर रहे हैं तो अपने लिए और ईश्वर की मदद करें।
b1nary.atr0phy

6
os.archकई संभावित मूल्य हैं, यह बताना मुश्किल है कि क्या यह 32 या 64 बिट्स है। देखें lopica.sourceforge.net/os.html
एम्मानुएल बॉर्ग

2
यह मानव आंखों के लिए एक स्ट्रिंग है और वैध मूल्यों की सख्त परिभाषा के बिना, इस पर भरोसा करना एक अच्छा विचार नहीं है - कोड लिखें जो इसके बजाय वास्तविक कार्यक्षमता की जांच करता है।
थोर्बोजर्न रेवन एंडरसन

15

पूरक जानकारी:

एक पर चलने वाली प्रक्रिया आप (कुछ हाल ही सूर्य JDK5 / 6 संस्करणों के साथ कम से कम) का उपयोग हो सकता है:

$ /opt/java1.5/bin/jinfo -sysprops 14680 | grep sun.arch.data.model
Attaching to process ID 14680, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
sun.arch.data.model = 32

जहां 14680 आवेदन चलाने वाले jv की PID है। "os.arch" भी काम करता है।

अन्य परिदृश्य भी समर्थित हैं:

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

हालाँकि इस नोट पर भी गौर करें:

" नोट - यह उपयोगिता असमर्थित है और JDK के भविष्य के संस्करणों में उपलब्ध हो सकती है या नहीं भी हो सकती है। विंडोज सिस्टम में जहां dbgent.dll मौजूद नहीं है, इन उपकरणों को काम करने के लिए 'डीबगिंग टूल फॉर विंडोज' को स्थापित करने की आवश्यकता है। PATH पर्यावरण चर में jvm.dll का स्थान लक्ष्य प्रक्रिया द्वारा उपयोग किया जाना चाहिए या उस स्थान से जिसमें क्रैश डंप फ़ाइल का उत्पादन किया गया था। "


7

लिनक्स पर, आप निम्नलिखित दो आदेशों में से किसी का उपयोग करके ईएलएफ हेडर की जानकारी प्राप्त कर सकते हैं:

file {YOUR_JRE_LOCATION_HERE}/bin/java

ओ / पी: जीएनयू / लिनक्स 2.4.0 के लिए ईएलएफ 64-बिट एलएसबी निष्पादन योग्य , एएमडी x86-64, संस्करण 1 (एसवाईएसवी), जीएनयू / लिनक्स 2.4.0 के लिए डायनामिकली लिंक (साझा लिबास का उपयोग करता है), छीन नहीं

या

readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'

ओ / पी: क्लास: ईएलएफ 64


6

यदि आप JNA का उपयोग कर रहे हैं, तो आप जांच सकते हैं कि क्या com.sun.jna.Native.POINTER_SIZE == 4(32 बिट) या com.sun.jna.Native.POINTER_SIZE == 8(64 बिट)।


यह चालाक है लेकिन पॉइंटर आकार तक पहुंचना यहां के अन्य समाधानों की तुलना में काफी धीमा है (इसे शुरू करने के लिए कुछ समय चाहिए)।
BullyWiiPlaza

1

" प्रोग्राम्स | प्रोग्राम्स और फीचर्स " के तहत " कंट्रोल पैनल " में विंडोज 7 के तहत JRE & JDK के 64-बिट वेरिएंट को कोष्ठक में " 64-बिट " के साथ सूचीबद्ध किया गया है (उदाहरण के लिए " जावा एसई डेवलपमेंट किट 7 अपडेट 65 (64-बिट)" ) "), जबकि 32-बिट वेरिएंट के लिए वेरिएंट को कोष्ठक (उदाहरण के लिए" सिर्फ जावा एसई डेवलपमेंट किट 8 अपडेट 60 ") में वर्णित नहीं किया गया है ।


1

यदि आप JNA का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं Platform.is64Bit()


-1

के लिए Windows, आप Javaघर का स्थान देख सकते हैं । यदि यह होता है (x86)तो यह 32-bitअन्यथा है 64-bit:

public static boolean is32Bit()
{
    val javaHome = System.getProperty("java.home");
    return javaHome.contains("(x86)");
}

public static boolean is64Bit()
{
    return !is32Bit();
}

उदाहरण पथ:

C:\Program Files (x86)\Java\jdk1.8.0_181\bin\java.exe # 32-bit
C:\Program Files\Java\jdk-10.0.2\bin\java.exe # 64-bit

Windowsएकमात्र समाधान की परवाह क्यों ?

यदि आपको यह जानने की आवश्यकता है कि आप किस बिट संस्करण पर चल रहे हैं, तो संभवतः आप देशी कोड के साथ आसपास फ़िदा हो रहे हैं, Windowsइसलिए प्लेटफ़ॉर्म-आज़ादी वैसे भी खिड़की से बाहर है।


-2

जेवीएम का संस्करण प्राप्त करने के लिए वर्तमान में कार्यक्रम चल रहा है

System.out.println(Runtime.class.getPackage().getImplementationVersion());

JVM या ऑपरेटिंग सिस्टम के लिए वह रिपोर्ट करेगा? आप 64-बिट ऑपरेटिंग सिस्टम पर 32-बिट JVM चला सकते हैं।
थोरबजोरन रावन एंडरसन

यह JMX का उपयोग नहीं करता है?
थोरबजोरन रावन एंडरसन

2
यह कुछ इस तरह 1.8.0_172या nullपर देता है Java 10और वैसे भी सवाल का जवाब नहीं देता है।
बुलीविप्लाजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.