ฉันจะทราบได้อย่างไรว่า JVM ที่แอปพลิเคชันของฉันทำงานคือ 32 บิตหรือ 64 บิต โดยเฉพาะฟังก์ชั่นหรือคุณสมบัติใดที่ฉันสามารถใช้เพื่อตรวจจับสิ่งนี้ภายในโปรแกรม?
ฉันจะทราบได้อย่างไรว่า JVM ที่แอปพลิเคชันของฉันทำงานคือ 32 บิตหรือ 64 บิต โดยเฉพาะฟังก์ชั่นหรือคุณสมบัติใดที่ฉันสามารถใช้เพื่อตรวจจับสิ่งนี้ภายในโปรแกรม?
คำตอบ:
คุณเรียกคืนคุณสมบัติระบบที่ทำเครื่องหมายเป็นพยานของ 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- บิตเมื่อเริ่มต้นหรือไม่
sun.*
คุณสมบัติของระบบด้วย IBM JVM มันไม่ได้พกพาได้
สำหรับบางรุ่นของ 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 เวอร์ชันที่ทันสมัยอีกต่อไป
java -d32 -version
เพื่อตรวจสอบว่าคุณไม่ได้ใช้ 32- บิต ทั้งสองต้องการทำงานต่อWin7
ไป
java -d32 -version
java -d64 -version
เพียงพิมพ์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
นั่น
ฉันติดตั้ง 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 บิต) เห็นได้ชัดว่าคุณสมบัติของระบบไม่ได้เป็นเพียงส่วนโค้งระบบปฏิบัติการ
os.arch
มีค่าที่เป็นไปได้มากมายมันยากที่จะบอกได้ว่ามันคือ 32 หรือ 64 บิต ดูlopica.sourceforge.net/os.html
ข้อมูลเสริม:
บน กระบวนการที่ใช้งานอยู่คุณสามารถใช้ (อย่างน้อยกับรุ่นล่าสุดของ 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 ถูกสร้างขึ้น "
บน 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
หากคุณใช้ JNA คุณสามารถตรวจสอบว่าcom.sun.jna.Native.POINTER_SIZE == 4
(32 บิต) หรือcom.sun.jna.Native.POINTER_SIZE == 8
(64 บิต)
ภายใต้ Windows 7 ใน " แผงควบคุม " ภายใต้ " โปรแกรม | โปรแกรมและคุณลักษณะ " ตัวแปรรุ่น 64 บิตของ JRE & JDK อยู่ในรายการด้วย " 64- บิต " ในวงเล็บ (เช่น " Java SE Development Kit 7 Update 65 (64- บิต) ) ") ในขณะที่ตัวแปร 32 บิตตัวแปรไม่ได้กล่าวถึงในวงเล็บ (เช่น" Java SE Development Kit 8 Update 60 ")
หากคุณกำลังใช้ JNA Platform.is64Bit()
คุณสามารถทำเช่นนี้
สำหรับ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
เพื่อไม่ให้แพลตฟอร์มทำงานได้อย่างอิสระ
หากต้องการรับเวอร์ชันของ JVM ที่กำลังรันโปรแกรมอยู่
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
หรือnull
เปิดJava 10
และไม่ตอบคำถามต่อไป