ฉันจะบอกได้อย่างไรว่าฉันใช้ JVM 64- บิตหรือ JVM 32- บิต (จากภายในโปรแกรม)


563

ฉันจะทราบได้อย่างไรว่า JVM ที่แอปพลิเคชันของฉันทำงานคือ 32 บิตหรือ 64 บิต โดยเฉพาะฟังก์ชั่นหรือคุณสมบัติใดที่ฉันสามารถใช้เพื่อตรวจจับสิ่งนี้ภายในโปรแกรม?


3
เพียงแค่อยากรู้อยากเห็นทำไมคุณต้องรู้ขนาดธรรมชาติของระบบ? รายละเอียดเช่นนี้ถูกแยกออกเป็นภาษาจาวาดังนั้นคุณไม่ควรที่จะรู้ (ในทางทฤษฎีอย่างน้อย)
Patrick Niedzielski

3
มันช่วยให้ฉันประเมินความต้องการหน่วยความจำสำหรับวัตถุต่างๆโดยประมาณเนื่องจากพอยน์เตอร์ อยากรู้อยากเห็นเหมือนกัน - ดูเหมือนว่าควรจะมีวิธี แต่ฉันไม่เคยได้ยินมัน
BobMcGee

85
"รายละเอียด" นี้ไม่ได้ถูกแยกออกไปเมื่อทำการโต้ตอบกับ Java Native Interface DLLs 32 บิตไม่สามารถโหลดด้วย JVM 64 บิต (และในทางกลับกัน) ดังนั้นนี่เป็นข้อมูลที่จำเป็นสำหรับทุกคนที่ใช้ JNI น่าเสียดายที่ดูเหมือนว่าจะไม่มีวิธีพกพาในการรับข้อมูลนี้ วิธีหนึ่งคือการลองโหลด DLL รุ่น 32 บิตก่อนและหากล้มเหลวให้ลองใช้รุ่น 64 บิต ฯลฯ น่าเกลียด!
Joonas Pulakka

12
อีกสถานการณ์ที่การแยกแยะระหว่าง JVM 32 หรือ 64 บิตนั้นสำคัญสำหรับไฟล์ที่แม็พ บนระบบ 32 บิตเพียง 2GB เท่านั้นที่สามารถแมปได้ดังนั้นจึงเป็นสิ่งสำคัญในการแมปและยกเลิกการแบ่งส่วนไฟล์ตามลำดับเพื่อไม่ให้เกินขีด จำกัด นี้ในขณะที่ 64 บิต jvms ข้อ จำกัด นั้นสูงกว่ามากมาก
Simone Gianni

2
เป็นเรื่องดีจริง ๆ ที่สามารถเลือกอัลกอริธึมเชิงตัวเลขที่จะเร็วที่สุดสำหรับเครื่องที่มีปัญหา
dfeuer

คำตอบ:


317

คุณเรียกคืนคุณสมบัติระบบที่ทำเครื่องหมายเป็นพยานของ JVM นี้ด้วย:

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

ผลลัพธ์ที่เป็นไปได้คือ:

  • "32" - JVM แบบ 32 บิต
  • "64" - JVM 64 บิต
  • "unknown" - ไม่ทราบ JVM

ตามที่อธิบายไว้ในคำถามที่พบบ่อย HotSpot :

เมื่อเขียนโค้ด Java ฉันจะแยกความแตกต่างระหว่างการทำงานแบบ 32 และ 64 บิตได้อย่างไร

ไม่มี API สาธารณะที่อนุญาตให้คุณแยกแยะระหว่างการทำงานแบบ 32 และ 64 บิต คิดว่า 64- บิตเป็นเพียงแพลตฟอร์มเดียวในการเขียนครั้งเดียวรันประเพณีได้ทุกที่ อย่างไรก็ตามหากคุณต้องการเขียนโค้ดซึ่งเป็นแพลตฟอร์มเฉพาะ (น่าละอายกับคุณ) คุณสมบัติของระบบ sun.arch.data.model มีค่า "32", "64" หรือ "ไม่รู้จัก"

ตัวอย่างที่อาจจำเป็นคือถ้าโค้ด Java ของคุณขึ้นอยู่กับไลบรารีดั้งเดิมและคุณจำเป็นต้องพิจารณาว่าจะโหลดไลบรารีรุ่น 32- หรือ 64- บิตเมื่อเริ่มต้นหรือไม่


22
ฉันไม่คิดว่าจะหาsun.*คุณสมบัติของระบบด้วย IBM JVM มันไม่ได้พกพาได้
Pascal Thivent

8
คุณจะบอกได้อย่างไรจากบรรทัดคำสั่ง หากคุณใช้ 32- บิตหรือ 64- บิต? แค่สงสัย.
Xonatron

17
ทำไมคำตอบที่ยอมรับขึ้นอยู่กับดวงอาทิตย์? "os.arch" จะทำสิ่งเดียวกันโดยไม่ต้องใช้แพ็คเกจกันแดดที่เป็นกรรมสิทธิ์
b1nary.atr0phy

7
@ b1naryatr0phy, os.arch รายงานเกี่ยวกับระบบปฏิบัติการหรือ JVM หรือไม่? ฉันมักจะเรียกใช้ JVM แบบ 32 บิตบนเวิร์กสเตชัน 64 บิตของฉันเพื่อวัตถุประสงค์ในการพัฒนา
skiphoppy

7
คุณสมบัตินี้ได้รับการสนับสนุนบน IBM JVMs แต่ไม่ใช่ใน GCJ ดูstackoverflow.com/questions/807263/…
Emmanuel Bourg

707

สำหรับบางรุ่นของ Java คุณสามารถตรวจสอบ bitness ของ JVM จากบรรทัดคำสั่งที่มีธงและ-d32-d64

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

ในการตรวจสอบ JVM 64 บิตให้รัน:

$ java -d64 -version

หากไม่ใช่ JVM แบบ 64 บิตคุณจะได้รับ:

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

ในทำนองเดียวกันเมื่อต้องการตรวจสอบ JVM แบบ 32 บิตให้เรียกใช้:

$ java -d32 -version

หากไม่ใช่ JVM แบบ 32 บิตคุณจะได้รับ:

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

การตั้งค่าสถานะเหล่านี้ถูกเพิ่มใน Java 7, เลิกใช้แล้วใน Java 9, ถูกลบใน Java 10 และไม่สามารถใช้ได้บน Java เวอร์ชันที่ทันสมัยอีกต่อไป


3
แม้ว่าจะรู้ดี แต่ก็ไม่มีประโยชน์ b / c ฉันต้องเรียกใช้จากนอกโปรแกรมหรือใช้ตัวเลือก java เพื่อเริ่มกระบวนการใหม่
BobMcGee

13
สิ่งที่ฉันกำลังมองหา และคุณสามารถเรียกใช้java -d32 -versionเพื่อตรวจสอบว่าคุณไม่ได้ใช้ 32- บิต ทั้งสองต้องการทำงานต่อWin7ไป
Xonatron

31
ผมบน Windows 7 และฉันได้รับ 'ตัวเลือกที่ไม่รู้จัก' ข้อผิดพลาดจากและจากjava -d32 -version java -d64 -version
ely

40
อย่าใช้ "-D64" เพื่อทำสิ่งที่แตกต่างอย่างสิ้นเชิง มันกำหนดคุณสมบัติของระบบที่เรียกว่า "64" นี่ไม่ใช่สิ่งที่ต้องการอย่างแน่นอนที่นี่
Jonathan Headland

9
แฟล็ก -d32 หรือ -d64 จะทำงานกับ Java 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 เวอร์ชันหลายเวอร์ชันบนระบบของคุณให้นำทางไปยังโฟลเดอร์ / bin ของเวอร์ชัน Java ที่คุณต้องการตรวจสอบและพิมพ์ที่java -versionนั่น


แต่ใน hp nonstop oss env ฉันไม่ได้รับ 64 บิตหรือ 32 บิต
vels4j

28
OP เฉพาะกล่าวว่าภายในโปรแกรม
Tomáš Zato - Reinstate Monica

34

ฉันติดตั้ง JVM แบบ 32 บิตแล้วลองใหม่อีกครั้งดูเหมือนว่าข้อความต่อไปนี้จะบอกคุณเกี่ยวกับพยานหลักฐานของ JVM ไม่ใช่ OS Arch:

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 bitness
codaddict

2
@caddaddict ดูเหมือนว่าจะเป็นพยาน JVM แน่นอน
bryantsai

20
@caddaddict นั้นเป็นเท็จอย่างสมบูรณ์ (และฉันไม่รู้ว่าทำไมหก ppl ได้โหวตความคิดเห็นนั้น) "os.arch" ได้รับการออกแบบมาเพื่อส่งคืนเวอร์ชัน JVM ทดสอบด้วยตัวคุณเองและพระเจ้าช่วยคุณถ้าคุณใช้สิ่งนี้เพื่อการตรวจจับระบบปฏิบัติการ
b1nary.atr0phy

6
os.archมีค่าที่เป็นไปได้มากมายมันยากที่จะบอกได้ว่ามันคือ 32 หรือ 64 บิต ดูlopica.sourceforge.net/os.html
Emmanuel Bourg

2
นี่คือสตริงที่มีไว้สำหรับสายตามนุษย์และไม่มีคำจำกัดความที่ถูกต้องของค่าที่ถูกต้องการใช้สิ่งนี้ไม่ใช่ความคิดที่ดี - เขียนโค้ดที่ตรวจสอบการทำงานจริงแทน
Thorbjørn Ravn Andersen

15

ข้อมูลเสริม:

บน กระบวนการที่ใช้งานอยู่คุณสามารถใช้ (อย่างน้อยกับรุ่นล่าสุดของ Sun 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 คือ PID ของ jvm ที่รันแอ็พพลิเคชัน "os.arch" ก็ทำงานเช่นกัน

ยังรองรับสถานการณ์อื่น ๆ :

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

อย่างไรก็ตามโปรดพิจารณาหมายเหตุนี้ด้วย:

" หมายเหตุ - ยูทิลิตี้นี้ไม่ได้รับการสนับสนุนและอาจมีหรือไม่มีใน JDK รุ่นต่อไปในระบบ Windows ที่ไม่มี dbgent.dll อยู่ต้องติดตั้ง 'เครื่องมือแก้จุดบกพร่องสำหรับ Windows' เพื่อให้เครื่องมือเหล่านี้ทำงานได้ ตัวแปรสภาพแวดล้อมของ PATH ควรมีตำแหน่งของ jvm.dll ที่ใช้โดยกระบวนการเป้าหมายหรือตำแหน่งที่ไฟล์ Crash Dump ถูกสร้างขึ้น "


7

บน Linux คุณสามารถรับข้อมูลส่วนหัวของ ELF ได้โดยใช้หนึ่งในสองคำสั่งต่อไปนี้:

file {YOUR_JRE_LOCATION_HERE}/bin/java

o / p: ปฏิบัติการ LSB 64 บิต , AMD x86-64, รุ่น 1 (SYSV), สำหรับ GNU / Linux 2.4.0, เชื่อมโยงแบบไดนามิก (ใช้ libs ที่ใช้ร่วมกัน), สำหรับ GNU / Linux 2.4.0, ไม่ถูกถอด

หรือ

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

o / p: ระดับ: ELF 64


6

หากคุณใช้ JNA คุณสามารถตรวจสอบว่าcom.sun.jna.Native.POINTER_SIZE == 4(32 บิต) หรือcom.sun.jna.Native.POINTER_SIZE == 8(64 บิต)


นี่ฉลาด แต่การเข้าถึงขนาดตัวชี้นั้นช้ากว่าโซลูชันอื่น ๆ ที่นี่อย่างมาก (ต้องใช้เวลาในการเริ่มต้น)
BullyWiiPlaza

1

ภายใต้ Windows 7 ใน " แผงควบคุม " ภายใต้ " โปรแกรม | โปรแกรมและคุณลักษณะ " ตัวแปรรุ่น 64 บิตของ JRE & JDK อยู่ในรายการด้วย " 64- บิต " ในวงเล็บ (เช่น " Java SE Development Kit 7 Update 65 (64- บิต) ) ") ในขณะที่ตัวแปร 32 บิตตัวแปรไม่ได้กล่าวถึงในวงเล็บ (เช่น" Java SE Development Kit 8 Update 60 ")



-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

หากต้องการรับเวอร์ชันของ JVM ที่กำลังรันโปรแกรมอยู่

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

รายงานนั้นสำหรับ JVM หรือระบบปฏิบัติการหรือไม่ คุณสามารถรัน JVM แบบ 32 บิตบนระบบปฏิบัติการ 64 บิต
Thorbjørn Ravn Andersen

ไม่ได้ใช้ JMX เหรอ?
Thorbjørn Ravn Andersen

2
สิ่งนี้ส่งคืนสิ่งที่ชอบ1.8.0_172หรือnullเปิดJava 10และไม่ตอบคำถามต่อไป
BullyWiiPlaza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.