32ビットJDKに対してビルドおよびコンパイルされて32ビットバイトコードにコンパイルされたJavaコードは、64ビットJVMで動作しますか?または、64ビットJVMには64ビットバイトコードが必要ですか?
もう少し詳しく説明すると、32ビットのJVMを実行しているSolaris環境で動作していたコードがありますが、JDKとWeblogic Serverを64ビットにアップグレードすると問題が発生します。
32ビットJDKに対してビルドおよびコンパイルされて32ビットバイトコードにコンパイルされたJavaコードは、64ビットJVMで動作しますか?または、64ビットJVMには64ビットバイトコードが必要ですか?
もう少し詳しく説明すると、32ビットのJVMを実行しているSolaris環境で動作していたコードがありますが、JDKとWeblogic Serverを64ビットにアップグレードすると問題が発生します。
回答:
はい。Javaバイトコード(およびソースコード)は、プラットフォームに依存しないライブラリを使用している場合、プラットフォームに依存しません。32ビットと64ビットは関係ありません。
javac
が64ビットで利用可能なメモリを利用することを意味しますjava
か?
(大規模な)アプリケーションを32ビットVMではなく64ビットVMで誤って実行しましたが、(JNIによって呼び出される)外部ライブラリの一部が失敗するまで気付きませんでした。
32ビットプラットフォームでシリアル化されたデータは64ビットプラットフォームで読み込まれ、問題はまったくありませんでした。
どのような問題が発生していますか?機能するものとそうでないものがありますか?JConsoleなどを取り付けてみて、ピークが発生しましたか?
非常に大きなVMを使用している場合、64ビットのGCの問題が影響を与える可能性があります。
最初の質問にははい、2番目の質問にはいいえ。それは仮想マシンです。あなたの問題はおそらく、バージョン間のライブラリ実装の不特定の変更に関連しています。たとえば、競合状態である可能性もあります。
VMが通過しなければならないいくつかのフープがあります。特に、参照はint
、スタック上のs と同じスペースを取るかのようにクラスファイルで処理されます。double
そしてlong
二つの基準スロットを取り上げます。インスタンスフィールドの場合、VMが通常とにかく通過するいくつかの再配置があります。これはすべて(比較的)透過的に行われます。
また、一部の64ビットJVMは「圧縮oop」を使用します。データは約8または16バイトごとに整列されるため、アドレスの3または4ビットは役に立ちません(ただし、「マーク」ビットは一部のアルゴリズムで盗まれる可能性があります)。これにより、64ビットプラットフォームで32ビットアドレスデータ(したがって、半分の帯域幅を使用するため、より高速)が35ビットまたは36ビットのヒープサイズを使用できるようになります。
ネイティブコード(特定のアーキテクチャ用にコンパイルされたマシンコード)がない限り、コードは32ビットと64ビットのJVMで同じように実行されます。
ただし、アドレスが大きいため(32ビットは4バイト、64ビットは8バイト)、64ビットJVMは同じタスクで32ビットJVMより多くのメモリを必要とします。
32ビットと64ビットの違いは、ネイティブライブラリとやり取りする場合にはさらに重要になります。64ビットJavaは、32ビットの非Java DLLと(JNIを介して)インターフェースできません。
exeの作成中に、構成に以下のようにパラメーターを追加します
お役に立てば幸いです。
ありがとう...
/ jav
Java JNIには、JVMと同じ「ビットネス」のOSライブラリが必要です。たとえばIESHIMS.DLL(%ProgramFiles%\ Internet Explorerにある)に依存するものをビルドしようとする場合、JVMが32ビットの場合は32ビットバージョン、JVMが64ビットの場合は64ビットバージョンを使用する必要があります。他のプラットフォームについても同様です。
それを除いて、あなたはすべて準備ができているはずです。生成されたJavaバイトコードは同じです。
より大きなメモリをアドレス指定できるため、大規模なプロジェクトには64ビットJavaコンパイラを使用する必要があることに注意してください。
どこが間違っている!このテーマに私はオラクルに質問を書きました。答えはだった。
「32ビットマシンでコードをコンパイルする場合、コードは32ビットプロセッサでのみ実行する必要があります。64ビットJVMでコードを実行する場合は、64を使用して64ビットマシンでクラスファイルをコンパイルする必要があります。 -ビットJDK。」