Làm cách nào để biết tôi đang chạy trong JVM 64 bit hay JVM 32 bit (từ trong một chương trình)?


563

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?


3
Vì tò mò, tại sao bạn cần biết kích thước tự nhiên của hệ thống? Các chi tiết như thế này được trừu tượng hóa trong Java, vì vậy bạn ít nhất (về lý thuyết, ít nhất) phải biết chúng.
Patrick Niedzielski

3
Nó cho phép tôi ước tính khoảng các yêu cầu bộ nhớ cho các đối tượng do con trỏ. Tò mò quá - dường như nên có một cách, nhưng tôi chưa bao giờ nghe về nó.
BobMcGee

85
"Chi tiết" này không bị trừu tượng hóa khi tương tác với Giao diện gốc Java. DLL 32 bit không thể được tải với JVM 64 bit (và ngược lại). Vì vậy, đây là thông tin khá cần thiết cho bất cứ ai sử dụng JNI. Thật đáng tiếc rằng dường như không có cách di động để có được thông tin này. Một cách là trước tiên hãy thử tải phiên bản DLL 32 bit và nếu thất bại, hãy thử phiên bản 64 bit, v.v ... Xấu xí!
Joonas Pulakka

12
Một tình huống khác trong đó phân biệt giữa các JVM 32 hoặc 64 bit là quan trọng là đối với các tệp được ánh xạ. Trên các hệ thống 32 bit, chỉ có thể ánh xạ 2GB, do đó, điều quan trọng là ánh xạ và hủy ánh xạ các phân đoạn tệp sao cho giới hạn này không bị vượt quá, trong khi trên 64 bit jvms thì giới hạn cao hơn rất nhiều.
Simone Gianni

2
Thật tuyệt khi có thể chọn thuật toán số sẽ nhanh nhất trên máy.
dfeuer

Câu trả lời:


317

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 định

Như đượ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.


22
Tôi sẽ không tìm thấy 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.
Pascal Thivent

8
Làm thế nào bạn có thể nói từ dòng lệnh? Nếu bạn đang chạy 32 bit hay 64 bit? Chỉ tò mò thôi.
Xonatron 2/212

17
Tại sao câu trả lời được chấp nhận phụ thuộc vào mặt trời? "Os.arch" sẽ hoàn thành điều tương tự mà không phải sử dụng các gói mặt trời độc quyền.
b1nary.atr0phy

7
@ b1naryatr0phy, os.arch có báo cáo về Hệ điều hành hay JVM không? Tôi thường chạy JVM 32 bit trên máy trạm 64 bit của mình, cho mục đích phát triển.
Skiphoppy

7
Thuộc tính này được hỗ trợ trên các JVM của IBM, nhưng không phải trên GCJ. Xem stackoverflow.com/questions/807263/ Mạnh
Emmanuel Bourg

707

Đố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-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.


3
Mặc dù điều này là tốt để biết, nhưng nó không hữu ích vì tôi cần chạy nó từ bên ngoài chương trình hoặc sử dụng các tùy chọn java để bắt đầu một quy trình mới.
BobMcGee

13
Chính xác những gì tôi đang tìm kiếm. Và bạn có thể chạy 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.
Xonatron 2/212

31
Tôi đang dùng Windows 7 và tôi gặp lỗi 'tùy chọn không nhận dạng' từ java -d32 -version và cũng từ java -d64 -version .
ely

40
Không sử dụng "-D64", vì điều đó hoàn toàn khác. Nó định nghĩa một thuộc tính hệ thống gọi là "64". Đây chắc chắn không phải là những gì đang muốn ở đây.
Jonathan Headland

9
Các cờ -d32 hoặc -d64 sẽ chỉ hoạt động cho Java 7 trở lên.
darrenmc

188

Chỉ cần gõ java -versionvà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 ý Clientthay vì 64-Bit Servertrong dòng thứ ba. Một Client/Serverphần là không liên quan, đó là sự vắng mặt của 64-Bitvấ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đó.


nhưng trong hp nonstop oss env Tôi không nhận được 64 bit hoặc 32 bit
vels4j

28
OP đặc biệt nói trong chương trình .
Tomáš Zato - Phục hồi Monica

34

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.


7
Điều này cung cấp thông tin kiến ​​trúc hệ điều hành. Nếu tôi không sai, điều này không cần phải giống với bit JVM.
codaddict

2
@codaddict, có vẻ như đó là bitcoin JVM.
bryantsai

20
@codaddict Điều đó hoàn toàn sai (và tôi không biết tại sao sáu ppl đã bỏ phiếu nhận xét đó.) "os.arch" được thiết kế để trả về phiên bản JVM. Hãy tự mình kiểm tra và thần sẽ giúp bạn nếu bạn thực sự dựa vào điều này để phát hiện HĐH.
b1nary.atr0phy

6
os.archcó nhiều giá trị có thể, thật khó để biết đó là 32 hay 64 bit. Xem lopica.sourceforge.net/os.html
Emmanuel Bourg

2
Đây là một chuỗi dành cho mắt người và không có định nghĩa chặt chẽ về các giá trị hợp lệ, dựa vào đây không phải là một ý tưởng hay - viết mã kiểm tra chức năng thực tế thay thế.
Thorbjørn Ravn Andersen

15

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. "


7

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


6

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).


Điều này là thông minh nhưng truy cập kích thước con trỏ chậm hơn đáng kể so với các giải pháp khác ở đây (nó cần một chút thời gian để khởi tạo).
BullyWiiPlaza

1

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 ").


1

Nếu bạn đang sử dụng JNA, bạn có thể làm điều này Platform.is64Bit().


-1

Đối với Windows, bạn có thể kiểm tra Javavị trí nhà. Nếu nó chứa (x86)nó thì 32-bitkhá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

Tại sao phải quan tâm đến một Windowsgiả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 Windowsnề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ổ.


-2

Để có được phiên bản JVM hiện đang chạy chương trình

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

Điều đó sẽ báo cáo cho JVM hoặc hệ điều hành? Bạn có thể chạy JVM 32 bit trên hệ điều hành 64 bit.
Thorbjørn Ravn Andersen

Điều đó không sử dụng JMX?
Thorbjørn Ravn Andersen

2
Điều này trả về một cái gì đó như 1.8.0_172hoặc nulltrên Java 10và không trả lời câu hỏi nào.
BullyWiiPlaza
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.