アプリケーションが実行されているJVMが32ビットと64ビットのどちらであるかを確認する方法はありますか。具体的には、プログラム内でこれを検出するために使用できる関数やプロパティは何ですか?
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かどうかを判断します。
Javaコードを書くとき、32ビット操作と64ビット操作をどのように区別しますか?
32ビット操作と64ビット操作を区別できるようにするためのパブリックAPIはありません。 64ビットは、一度書くだけで別のプラットフォームとして考えることができ、どこでも実行できます。ただし、プラットフォーム固有のコードを作成したい場合(残念)、システムプロパティ
Sun.Arch.data.model
の値は "32"、 "64"、または "unknown"です。
唯一の正当な理由は、あなたのJavaコードがネイティブライブラリに依存していて、あなたのコードが起動時にロードするバージョン(32または64ビット)を決定する必要がある場合です。
あなたはコマンドラインで試すことができます:
Java -d64 -version
64ビット版ではない場合は、次のようなメッセージが表示されます。
このJavaインスタンスは64ビットJVMをサポートしません。希望のバージョンをインストールしてください。
詳細についてはJVMのヘルプオプションを参照してください。Java -help
コンソールに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
と入力します。
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だけではありません。
補足情報:
実行中のプロセスで あなたは(少なくともいくつかの最近の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 ] [server-id@]remote-hostname-or-IP
ただし、このメモも検討してください。
" _ note _ - このユーティリティはサポートされておらず、JDKの将来のバージョンでは利用できないかもしれません。dbgent.dllが存在しないWindowsシステムでは、 'Debugging Tools for Windows'をインストールする必要があります。また、PATH環境変数には、ターゲットプロセスが使用するjvm.dllの場所、またはクラッシュダンプファイルの生成元の場所を含める必要があります。」
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
JNAを使用している場合は、com.Sun.jna.Native.POINTER_SIZE == 4
(32ビット)かcom.Sun.jna.Native.POINTER_SIZE == 8
(64ビット)かを確認できます。
Windows 7では、 " プログラム|プログラムと機能 "の下の " コントロールパネル "に、64ビット版のJRE&JDKが括弧内に " 64-bit "と表示されます。 " Java SE開発キット7アップデート65(64ビット) ")一方、32ビット版の場合、その変種は括弧で囲まれていません(例: " Java SE開発キット8アップデート60 " ).
JNAを使用している場合は、thisPlatform.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
のネイティブコードをいじる必要があるため、とにかくプラットフォームに依存しません。