web-dev-qa-db-ja.com

64ビットJVMまたは32ビットJVM(プログラム内から)のどちらで実行しているのかどうかを確認する方法

アプリケーションが実行されているJVMが32ビットと64ビットのどちらであるかを確認する方法はありますか。具体的には、プログラム内でこれを検出するために使用できる関数やプロパティは何ですか?

538
BobMcGee

Sunには、JVMのビット数(32または64)を判断するためのJava Systemプロパティがあります。

Sun.Arch.data.model=32 // 32 bit JVM
Sun.Arch.data.model=64 // 64 bit JVM

あなたが使用することができます

System.getProperty("Sun.Arch.data.model") 

プログラムからその32/64かどうかを判断します。

からSun HotSpot FAQ

Javaコードを書くとき、32ビット操作と64ビット操作をどのように区別しますか?

32ビット操作と64ビット操作を区別できるようにするためのパブリックAPIはありません。 64ビットは、一度書くだけで別のプラットフォームとして考えることができ、どこでも実行できます。ただし、プラットフォーム固有のコードを作成したい場合(残念)、システムプロパティSun.Arch.data.modelの値は "32"、 "64"、または "unknown"です。

唯一の正当な理由は、あなたのJavaコードがネイティブライブラリに依存していて、あなたのコードが起動時にロードするバージョン(32または64ビット)を決定する必要がある場合です。

307
codaddict

あなたはコマンドラインで試すことができます:

Java -d64 -version

64ビット版ではない場合は、次のようなメッセージが表示されます。

このJavaインスタンスは64ビットJVMをサポートしません。希望のバージョンをインストールしてください。

詳細についてはJVMのヘルプオプションを参照してください。Java -help

668
gpampara

コンソールに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)

3行目の64-Bit Serverの代わりにClientに注意してください。 Client/Serverの部分は無関係です。重要なのは64-Bitの欠如です。

システムに複数のJavaバージョンがインストールされている場合は、確認したいJavaバージョンの/ binフォルダーに移動して、そこにJava -versionと入力します。

179
Sedat Kilinc

32ビットのJVMをインストールして再試行しました。OSArchではなく、次のようにしてJVMのビット数がわかります。

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ビット)の両方に対してテストされました。明らかに、システムプロパティはオペレーティングシステムArchだけではありません。

34
bryantsai

補足情報:

実行中のプロセスで あなたは(少なくともいくつかの最近の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はアプリケーションを実行しているjvmのPIDです。 "os.Arch"も動きます。

他のシナリオもサポートされています。

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [[email protected]]remote-hostname-or-IP 

ただし、このメモも検討してください。

" _ note _ - このユーティリティはサポートされておらず、JDKの将来のバージョンでは利用できないかもしれません。dbgent.dllが存在しないWindowsシステムでは、 'Debugging Tools for Windows'をインストールする必要があります。また、PATH環境変数には、ターゲットプロセスが使用するjvm.dllの場所、またはクラッシュダンプファイルの生成元の場所を含める必要があります。」

14
dim

Linuxでは、次の2つのコマンドのいずれかを使用してELFヘッダー情報を取得できます。

file {YOUR_JRE_LOCATION_HERE}/bin/Java

o/p:ELF 64ビットLSB実行可能ファイル、AMD x86-64、バージョン1(SYSV)、GNU/Linux 2.4.0用、動的リンク(共用ライブラリーを使用)、GNU/Linux 2.4.0用、削除されていない

または

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

o/p:クラス:ELF64

7
jawsnnn

JNAを使用している場合は、com.Sun.jna.Native.POINTER_SIZE == 4(32ビット)かcom.Sun.jna.Native.POINTER_SIZE == 8(64ビット)かを確認できます。

6
Anthony Hayward

Windows 7では、 " プログラム|プログラムと機能 "の下の " コントロールパネル "に、64ビット版のJRE&JDKが括弧内に " 64-bit "と表示されます。 " Java SE開発キット7アップデート65(64ビット) ")一方、32ビット版の場合、その変種は括弧で囲まれていません(例: " Java SE開発キット8アップデート60 " ).

1
user1364368

JNAを使用している場合は、thisPlatform.is64Bit()を実行できます。

0
鹞之神乐

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のネイティブコードをいじる必要があるため、とにかくプラットフォームに依存しません。

0
BullyWiiPlaza