Làm cách nào để biết JVM mà ứng dụng của tôi chạy là 32 bit hay 64 bit? Cụ thể, những chức năng hoặc thuộc tính nào tôi có thể sử dụng để phát hiện điều này trong chương trình?
Làm cách nào để biết JVM mà ứng dụng của tôi chạy là 32 bit hay 64 bit? Cụ thể, những chức năng hoặc thuộc tính nào tôi có thể sử dụng để phát hiện điều này trong chương trình?
Câu trả lời:
Bạn truy xuất thuộc tính hệ thống đánh dấu độ bit của JVM này bằng:
System.getProperty("sun.arch.data.model");
Kết quả có thể là:
"32"
- JVM 32 bit"64"
- JVM 64 bit"unknown"
- JVM không xác địnhNhư được mô tả trong Câu hỏi thường gặp về HotSpot :
Khi viết mã Java, làm cách nào để phân biệt hoạt động 32 và 64 bit?
Không có API công khai nào cho phép bạn phân biệt hoạt động 32 và 64 bit. Hãy nghĩ về 64-bit như một nền tảng khác trong bài viết một lần, chạy bất cứ nơi nào truyền thống. Tuy nhiên, nếu bạn muốn viết mã dành riêng cho nền tảng (xấu hổ về bạn), thuộc tính hệ thống sun.arch.data.model có giá trị "32", "64" hoặc "không xác định".
Một ví dụ trong đó điều này có thể cần thiết là nếu mã Java của bạn phụ thuộc vào các thư viện nguyên gốc và bạn cần xác định xem có nên tải phiên bản 32 hoặc 64 bit của các thư viện khi khởi động hay không.
sun.*
các thuộc tính hệ thống với IBM JVM. Nói cách khác, nó không phải là di động.
Đối với các phiên bản Java nhất định, bạn có thể kiểm tra độ bit của JVM từ dòng lệnh bằng các cờ -d32
và -d64
.
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
Để kiểm tra JVM 64 bit, hãy chạy:
$ java -d64 -version
Nếu đó không phải là JVM 64 bit, bạn sẽ nhận được điều này:
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
Tương tự, để kiểm tra JVM 32 bit, hãy chạy:
$ java -d32 -version
Nếu đó không phải là JVM 32 bit, bạn sẽ nhận được điều này:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
Các cờ này đã được thêm vào trong Java 7, không dùng nữa trong Java 9, đã bị xóa trong Java 10 và không còn có sẵn trên các phiên bản hiện đại của Java.
java -d32 -version
để xác minh rằng bạn không chạy 32-bit. Cả hai đều mong muốn làm việc trên Win7
.
java -d32 -version
và cũng từ java -d64 -version
.
Chỉ cần gõ java -version
vào bảng điều khiển của bạn.
Nếu phiên bản 64 bit đang chạy, bạn sẽ nhận được một thông báo như:
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)
Phiên bản 32 bit sẽ hiển thị nội dung tương tự:
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)
Lưu ý Client
thay vì 64-Bit Server
trong dòng thứ ba. Một Client/Server
phần là không liên quan, đó là sự vắng mặt của 64-Bit
vấn đề.
Nếu nhiều phiên bản Java được cài đặt trên hệ thống của bạn, hãy điều hướng đến thư mục / bin của phiên bản Java mà bạn muốn kiểm tra và nhập vào java -version
đó.
Tôi đã cài đặt JVM 32 bit và thử lại lần nữa, có vẻ như những điều sau đây cho bạn biết bit JVM, không phải vòm OS:
System.getProperty("os.arch");
#
# on a 64-bit Linux box:
# "x86" when using 32-bit JVM
# "amd64" when using 64-bit JVM
Điều này đã được thử nghiệm đối với cả JVM của SUN và IBM (32 và 64 bit). Rõ ràng, tài sản hệ thống không chỉ là vòm hệ điều hành.
os.arch
có nhiều giá trị có thể, thật khó để biết đó là 32 hay 64 bit. Xem lopica.sourceforge.net/os.html
Thông tin bổ sung:
Trong quá trình chạy, bạn có thể sử dụng (ít nhất là với một số phiên bản Sun JDK5 / 6 gần đây):
$ /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
Trong đó 14680 là PID của jvm chạy ứng dụng. "Os.arch" cũng hoạt động.
Ngoài ra các kịch bản khác được hỗ trợ:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
Tuy nhiên cũng xem xét lưu ý này:
" LƯU Ý - Tiện ích này không được hỗ trợ và có thể có hoặc không có sẵn trong các phiên bản tương lai của JDK. Trong Hệ thống Windows không có dbgent.dll, 'Công cụ gỡ lỗi cho Windows' cần được cài đặt để các công cụ này hoạt động. Biến môi trường PATH phải chứa vị trí của jvm.dll được sử dụng bởi quy trình đích hoặc vị trí mà tệp Crash Dump được tạo ra. "
Trên Linux, bạn có thể nhận thông tin tiêu đề ELF bằng cách sử dụng một trong hai lệnh sau:
file {YOUR_JRE_LOCATION_HERE}/bin/java
o / p: ELB 64-bit thực thi LSB , AMD x86-64, phiên bản 1 (SYSV), cho GNU / Linux 2.4.0, được liên kết động (sử dụng libs chia sẻ), cho GNU / Linux 2.4.0, không bị tước
hoặc là
readelf -h {YOUR_JRE_LOCATION_HERE}/bin/java | grep 'Class'
o / p: Lớp: ELF 64
Nếu bạn đang sử dụng JNA, bạn có thể kiểm tra xem com.sun.jna.Native.POINTER_SIZE == 4
(32 bit) hay com.sun.jna.Native.POINTER_SIZE == 8
(64 bit).
Trong Windows 7 trong " Bảng điều khiển " trong " Chương trình | Chương trình và Tính năng ", các biến thể 64 bit của JRE & JDK được liệt kê với " 64 bit " trong ngoặc đơn (ví dụ: " Bộ phát triển Java SE 7 Cập nhật 65 (64-Bit ) "), trong khi đối với các biến thể 32 bit, biến thể này không được đề cập trong ngoặc đơn (ví dụ:" Java SE Development Kit 8 Update 60 ").
Đối với Windows
, bạn có thể kiểm tra Java
vị trí nhà. Nếu nó chứa (x86)
nó thì 32-bit
khác 64-bit
:
public static boolean is32Bit()
{
val javaHome = System.getProperty("java.home");
return javaHome.contains("(x86)");
}
public static boolean is64Bit()
{
return !is32Bit();
}
Đường dẫn ví dụ:
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
giải pháp duy nhất?Nếu bạn cần biết phiên bản bit nào bạn đang chạy, có khả năng bạn đang loay hoay với mã gốc trên Windows
nền tảng vì vậy tính độc lập của nền tảng sẽ xuất hiện ngoài cửa sổ.
Để có được phiên bản JVM hiện đang chạy chương trình
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
hoặc null
trên Java 10
và không trả lời câu hỏi nào.