(プログラム内から)64ビットJVMと32ビットJVMのどちらで実行しているかを確認するにはどうすればよいですか?


563

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


3
好奇心から、システムの自然なサイズを知る必要があるのはなぜですか?このような詳細はJavaで抽象化されているため、(少なくとも理論的には)それらを知る必要はありません。
Patrick Niedzielski、2010年

3
ポインタによるオブジェクトのメモリ要件を概算できます。好奇心も-方法があるはずのように見えたが、私はそれについて聞いたことがない。
BobMcGee

85
この「詳細」は、Java Native Interfaceと対話するときに抽象化されません。32ビットDLLを64ビットJVMでロードすることはできません(逆も同様です)。したがって、これはJNIを使​​用するすべての人にとって非常に重要な情報です。この情報を取得するためのポータブルな方法がないように思われるのは残念です。1つの方法は、最初に32ビットバージョンのDLLをロードしてみて、失敗した場合は64ビットバージョンを試すなどです。
Joonas Pulakka、2010

12
32ビットまたは64ビットのJVMを区別することが重要なもう1つの状況は、マップされたファイルの場合です。32ビットシステムではマップできるのは2GBのみなので、この制限を超えないようにファイルセグメントを適宜マップおよびマップ解除することが重要です。一方、64ビットjvmでは、制限がはるかに高くなります。
Simone Gianni

2
問題のマシンで最速になる数値アルゴリズムを選択できるのは本当に素晴らしいことです。
dfeuer 2014

回答:


317

このJVMのビット数をマークするシステムプロパティを取得するには、次のようにします。

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

可能な結果は次のとおりです。

  • "32" – 32ビットJVM
  • "64" – 64ビットJVM
  • "unknown" –不明なJVM

HotSpot FAQで説明されているように:

Javaコードを記述する場合、32ビットと64ビットの操作をどのように区別しますか?

32ビット操作と64ビット操作を区別できるパブリックAPIはありません。64ビットは、一度の書き込みで別のプラットフォームと考えて、どこでも伝統を実行してください。ただし、プラットフォーム固有(恥)のコードを記述したい場合、システムプロパティsun.arch.data.modelの値は「32」、「64」、または「不明」です。

これが必要になる例としては、Javaコードがネイティブライブラリに依存しており、起動時に32ビットバージョンと64ビットバージョンのどちらのライブラリをロードするかを決定する必要がある場合があります。


22
sun.*IBM JVMでシステムプロパティが見つかるとは思いません。つまり、移植性はありません。
Pascal Thivent、2014年

8
コマンドラインからどのように見分けることができますか?32ビットまたは64ビットを実行している場合 ちょっと興味があるんだけど。
Xonatron、2012

17
受け入れられた回答がSunに依存するのはなぜですか?"os.arch"は、独自のsunパッケージを使用せずに同じことを実行します。
b1nary.atr0phy 2012年

7
@ b1naryatr0phy、os.archはオペレーティングシステムまたはJVMについて報告しますか?開発目的で、64ビットワークステーションで32ビットJVMを実行することがよくあります。
skiphoppy

7
このプロパティはIBM JVMではサポートされていますが、GCJではサポートされていません。stackoverflow.com/questions/807263/…を
Emmanuel Bourg

707

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の最新バージョンでは使用できなくなりました。


3
これは知っておくと便利ですが、プログラムの外部から実行したり、javaオプションを使用して新しいプロセスを開始したりする必要があるため、役に立ちません。
BobMcGee 2010年

13
まさに私が探していたもの。また、java -d32 -version32ビットを実行していないことを確認するために実行できます。どちらもに取り組んでほしいWin7
Xonatron、2012

31
私はWindows 7を使用しています。java -d32 -version また、 から「認識できないオプション」エラーが発生しますjava -d64 -version
エリー

40
「-D64」は使用しないでください。これは、まったく異なる動作をするためです。「64」というシステムプロパティを定義します。これは間違いなくここで求められていることではありません。
ジョナサンヘッドランド2014

9
-d32または-d64フラグは、Java 7以降でのみ機能します。
darrenmc 2014

188

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そこに入力します。


しかし、hp nonstop oss envでは64ビットまたは32ビットを取得できません
vels4j

28
OP はプログラム内で具体的に述べています
トマーシュZato -復活モニカ

34

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


7
これにより、オペレーティングシステムのアーキテクチャ情報が提供されます。私が間違っていなければ、これはJVMのビット数と同じである必要はありません。
codaddict

2
@codaddict、本当にJVMのビットネスのようです。
bryantsai 2010年

20
@codaddictそれは完全に誤りです(そして、なぜ6人の人々がそのコメントに賛成票を投じたのか私にはわかりません。) "os.arch"は、JVMバージョンを返すように設計されています。これを自分でテストしてください。実際にOSの検出にこれを使用している場合は、神様がお手伝いします。
b1nary.atr0phy 2012年

6
os.arch多くの可能な値を持っているため、32ビットか64ビットかを判別するのは困難です。lopica.sourceforge.net/os.htmlを
Emmanuel Bourg

2
これは人間の目を対象とした文字列であり、有効な値の厳密な定義がないため、これに依存することはお勧めできません。実際の機能をチェックするコードを記述してください。
–ThorbjørnRavn Andersen 2013

15

補足情報:

上で実行中のプロセス、あなたは(少なくともいくつかの最近の日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の場所、またはクラッシュダンプファイルの作成元の場所が含まれている必要があります。


7

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:クラス:ELF 64


6

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


これは賢い方法ですが、ポインタサイズへのアクセスは、ここでの他のソリューションよりもかなり遅くなります(初期化には時間が必要です)。
BullyWiiPlaza 2018

1

「で、Windows 7の下にコントロールパネル」の「|プログラムと機能プログラム」64ビットJRE&JDKの変異体「と記載されています64ビット括弧(例えば、「中」のJava SE Development Kitの7アップデート65(64ビット) ")、32ビットバリアントの場合、バリアントは括弧内に記載されていません(たとえば、単に「Java SE Development Kit 8 Update 60」)。


1

JNAを使用している場合は、これを行うことができますPlatform.is64Bit()


-1

について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ので、プラットフォームに依存しないことはとにかく不可能です。


-2

現在プログラムを実行しているJVMのバージョンを取得するには

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

JVMまたはオペレーティングシステムのレポートはありますか?64ビットオペレーティングシステムで32ビットJVMを実行できます。
するThorbjörnRavnアンデルセン

JMXを使用していませんか?
するThorbjörnRavnアンデルセン

2
これは何かを返す1.8.0_172か、null上をJava 10とにかく質問に答えていません。
BullyWiiPlaza 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.