web-dev-qa-db-ja.com

Java 32ビットと64ビットの互換性

Java 32ビットJDKに対して32ビットバイトコードにビルドおよびコンパイルされたコードは64ビットJVMで動作しますか?または64ビットJVMには64ビットバイトコードが必要ですか?

もう少し詳しく説明すると、32ビットJVMを実行しているSolaris環境で動作していたコードがありますが、JDKとWebLogic Serverを64ビットにアップグレードすると問題が発生します。

96
mshafrir

はい、Javaバイトコード(およびソースコード)はプラットフォームに依存しません。プラットフォームに依存しないライブラリを使用すると仮定します。32ビットと64ビットは関係ありません。

92
Zifre

32ビットVMではなくVM64 ===で64ビットVMでアプリケーションを実行しました)失敗。

32ビットプラットフォームでシリアル化されたデータは、問題なく64ビットプラットフォームで読み込まれました。

どのような問題が発生していますか?いくつかのことは機能しますか? JConsoleなどを接続しようとして、ピークがありましたか?

非常に大きなVMがある場合は、64ビットのGCの問題が影響する可能性があります。

20
Fortyrunner

最初の質問にはい、2番目の質問にはいいえ。それは仮想マシンです。問題は、バージョン間のライブラリ実装の不特定の変更に関連している可能性があります。たとえば、競合状態である可能性があります。

VMが通過する必要があるいくつかのフープがあります。特に、参照は、スタック上のintsと同じスペースをとったかのようにクラスファイルで扱われます。doublelong 2つの参照スロットを使用します。たとえば、フィールドには、VMが通常通り抜ける再配置があります。これはすべて(比較的)透過的に行われます。

また、一部の64ビットJVMは「圧縮OOP」を使用します。データは8バイトまたは16バイトごとに調整されるため、アドレスの3ビットまたは4ビットは役に立ちません(ただし、一部のアルゴリズムでは「マーク」ビットが盗まれる可能性があります)。これにより、64ビットプラットフォームで35ビットまたは36ビットのヒープサイズを使用するために、32ビットのアドレスデータ(したがって、半分の帯域幅を使用するため、高速になります)が可能になります。

11

すべてのバイトコードは8ビットベースです。 (それがBYTEコードと呼ばれる理由です)すべての命令はサイズが8ビットの倍数です。 32ビットマシンで開発し、64ビットJVMでサーバーを実行します。

直面している問題の詳細を教えてください。その後、私たちはあなたを助けるチャンスがあるかもしれません。それ以外の場合は、あなたが抱えている問題を推測するだけです。

10
Peter Lawrey

ネイティブコード(特定のアーキテクチャ用にコンパイルされたマシンコード)がない限り、コードは32ビットと64ビットのJVMで同等に実行されます。

ただし、アドレスが大きいため(32ビットは4バイト、64ビットは8バイト)、64ビットJVMは同じタスクで32ビットJVMより多くのメモリを必要とすることに注意してください。

32ビットと64ビットの違いは、ネイティブライブラリとインターフェイスするときにさらに重要になります。 64ビットJavaは、JNIを介して32ビットの非Java dllとインターフェイスできません。

3
John Thomas

Exeの作成中に構成で以下のようにパラメーターを追加します

http://www.technimi.com/index.php?do=/group/Java/forum/building-an-exe-using-launch4j-for-32-bit-jvm/

役に立てば幸いです。

ありがとう...

/ jav

2
javangelo

Java JNIには、JVMと同じ「ビットネス」のOSライブラリが必要です。たとえばIESHIMS.DLLに依存する何かをビルドしようとすると(%ProgramFiles%\ Internet Explorerに存在します) )JVMが32ビットの場合は32ビットバージョンを、JVMが64ビットの場合は64ビットバージョンを使用する必要があります。

それとは別に、すべてを設定する必要があります。生成されたJavaバイトコードs/b同じ。

64ビットJavaコンパイラを使用すると、より多くのメモリに対応できるため、より大きなプロジェクトに使用する必要があります。

0
thecarpy