アプリケーションが実行されているJVMが32ビットか64ビットかを確認するにはどうすればよいですか?具体的には、プログラム内でこれを検出するために使用できる関数またはプロパティは何ですか?
アプリケーションが実行されているJVMが32ビットか64ビットかを確認するにはどうすればよいですか?具体的には、プログラム内でこれを検出するために使用できる関数またはプロパティは何ですか?
回答:
このJVMのビット数をマークするシステムプロパティを取得するには、次のようにします。
System.getProperty("sun.arch.data.model");
可能な結果は次のとおりです。
"32"
– 32ビットJVM"64"
– 64ビットJVM"unknown"
–不明なJVMHotSpot FAQで説明されているように:
Javaコードを記述する場合、32ビットと64ビットの操作をどのように区別しますか?
32ビット操作と64ビット操作を区別できるパブリックAPIはありません。64ビットは、一度の書き込みで別のプラットフォームと考えて、どこでも伝統を実行してください。ただし、プラットフォーム固有(恥)のコードを記述したい場合、システムプロパティsun.arch.data.modelの値は「32」、「64」、または「不明」です。
これが必要になる例としては、Javaコードがネイティブライブラリに依存しており、起動時に32ビットバージョンと64ビットバージョンのどちらのライブラリをロードするかを決定する必要がある場合があります。
sun.*
IBM JVMでシステムプロパティが見つかるとは思いません。つまり、移植性はありません。
Javaの特定のバージョンでは、コマンドラインからフラグ-d32
とを使用してJVMのビット数を確認できます-d64
。
$ java -help
...
-d32 use a 32-bit data model if available
-d64 use a 64-bit data model if available
64ビットJVMを確認するには、次を実行します。
$ java -d64 -version
64ビットJVMでない場合は、次のようになります。
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
同様に、32ビットJVMを確認するには、次のコマンドを実行します。
$ java -d32 -version
32ビットJVMでない場合は、次のようになります。
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
これらのフラグはJava 7で追加され、Java 9 では非推奨になり、Java 10では削除され、Javaの最新バージョンでは使用できなくなりました。
java -d32 -version
32ビットを実行していないことを確認するために実行できます。どちらもに取り組んでほしいWin7
。
java -d32 -version
また、 から「認識できないオプション」エラーが発生しますjava -d64 -version
。
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行目のClient
代わりに注意してください64-Bit Server
。そのClient/Server
部分は無関係です、それは64-Bit
問題の不在です。
システムに複数のJavaバージョンがインストールされている場合は、確認するJavaバージョンの/ binフォルダーに移動し、java -version
そこに入力します。
32ビットのJVMをインストールして再試行しましたが、次のようにすると、OSのアーチではなく、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ビット)の両方に対してテストされました。明らかに、システムプロパティはオペレーティングシステムのアーチだけではありません。
os.arch
多くの可能な値を持っているため、32ビットか64ビットかを判別するのは困難です。lopica.sourceforge.net/os.htmlを
補足情報:
上で実行中のプロセス、あなたは(少なくともいくつかの最近の日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
ただし、次の点にも注意してください。
" 注 -このユーティリティはサポートされておらず、JDKの将来のバージョンでは使用できない可能性があります。dbgent.dllが存在しないWindowsシステムでは、これらのツールを動作させるために「Debugging Tools for Windows」をインストールする必要があります。また、 PATH環境変数には、ターゲットプロセスで使用されるjvm.dllの場所、またはクラッシュダンプファイルの作成元の場所が含まれている必要があります。
JNAを使用している場合は、com.sun.jna.Native.POINTER_SIZE == 4
(32ビット)かcom.sun.jna.Native.POINTER_SIZE == 8
(64ビット)かを確認できます。
「で、Windows 7の下にコントロールパネル」の「|プログラムと機能プログラム」64ビットJRE&JDKの変異体「と記載されています64ビット括弧(例えば、「中」のJava SE Development Kitの7アップデート65(64ビット) ")、32ビットバリアントの場合、バリアントは括弧内に記載されていません(たとえば、単に「Java SE Development Kit 8 Update 60」)。
について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
ので、プラットフォームに依存しないことはとにかく不可能です。
現在プログラムを実行しているJVMのバージョンを取得するには
System.out.println(Runtime.class.getPackage().getImplementationVersion());
1.8.0_172
か、null
上をJava 10
とにかく質問に答えていません。