檢查Java程序是在64位還是32位JVM中運行

1.概述

儘管Java與平台無關,但是有時候我們不得不使用本機庫。在這些情況下,我們可能需要識別基礎平台並在啟動時加載適當的本機庫。

在本教程中,我們將學習檢查Java程序是在64位還是32位JVM上運行的不同方法。

首先,我們將展示如何使用System類來實現這一點。

然後,我們將看到如何使用Java Native Access (JNA)API來檢查JVM的位。 JNA是社區開發的庫,支持所有本機訪問。

2.使用sun.arch.data.model系統屬性

Java中的System類提供對外部定義的屬性和環境變量的訪問。它維護一個描述當前工作環境配置的“ Properties

我們可以使用“ sun.arch.data.model ”系統屬性來識別JVM位:

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

它包含“ 32”或“ 64”,分別表示32位或64位JVM。儘管此方法易於使用,但如果不存在該屬性,它將返回“未知”。因此,它將僅適用於Oracle Java版本。

讓我們看一下代碼:

public class JVMBitVersion {

 public String getUsingSystemClass() {

 return System.getProperty("sun.arch.data.model") + "-bit";

 }



 //... other methods

 }

讓我們通過單元測試來檢查這種方法:

@Test

 public void whenUsingSystemClass_thenOutputIsAsExpected() {

 if ("64".equals(System.getProperty("sun.arch.data.model"))) {

 assertEquals("64-bit", jvmVersion.getUsingSystemClass());

 } else if ("32".equals(System.getProperty("sun.arch.data.model"))) {

 assertEquals("32-bit", jvmVersion.getUsingSystemClass());

 }

 }

3.使用JNA API

JNA( Java本機訪問)支持各種平台,例如macOS,Microsoft Windows,Solaris,GNU和Linux。

它使用本機函數按名稱加載庫並檢索指向該庫中函數的指針。

3.1 Platform

另外,我們可以使用Platform類,它提供了簡化的平台信息。

它包含**is64Bit()方法,該方法檢測JVM是否為64位**。

讓我們看看它如何識別位:

public static final boolean is64Bit() {

 String model = System.getProperty("sun.arch.data.model",

 System.getProperty("com.ibm.vm.bitmode"));

 if (model != null) {

 return "64".equals(model);

 }

 if ("x86-64".equals(ARCH)

 || "ia64".equals(ARCH)

 || "ppc64".equals(ARCH) || "ppc64le".equals(ARCH)

 || "sparcv9".equals(ARCH)

 || "mips64".equals(ARCH) || "mips64el".equals(ARCH)

 || "amd64".equals(ARCH)

 || "aarch64".equals(ARCH)) {

 return true;

 }

 return Native.POINTER_SIZE == 8;

 }

此處, ARCH常量是Systemos.arch ”屬性派生的。它用於獲取操作系統體系結構:

ARCH = getCanonicalArchitecture(System.getProperty("os.arch"), osType);

這種方法適用於不同的操作系統以及不同的JDK供應商。因此,它比“ sun.arch.data.model ”系統屬性更可靠。

3.2 Native

我們可以使用Native類中的POINTER_SIZE該常數指定當前平台上本機指針的大小(以字節為單位)。

值4表示32位本機指針,而值8表示64位本機指針:

if (com.sun.jna.Native.POINTER_SIZE == 4) {

 // 32-bit

 } else if (com.sun.jna.Native.POINTER_SIZE == 8) {

 // 64-bit

 }

4。結論

在本教程中,我們學習瞭如何檢查JVM位版本。我們還觀察了JNA如何在不同平台上為我們簡化了解決方案。