32ビットJDKに対してビルドおよびコンパイルされて32ビットバイトコードに変換されたJavaコードは、64ビットJVMで機能しますか?または、64ビットJVMには64ビットバイトコードが必要ですか?
もう少し詳しく説明すると、32ビットJVMを実行しているSolaris環境で動作していたコードがありますが、JDKとWeblogicServerを64ビットにアップグレードした後に問題が発生します。
32ビットJDKに対してビルドおよびコンパイルされて32ビットバイトコードに変換されたJavaコードは、64ビットJVMで機能しますか?または、64ビットJVMには64ビットバイトコードが必要ですか?
もう少し詳しく説明すると、32ビットJVMを実行しているSolaris環境で動作していたコードがありますが、JDKとWeblogicServerを64ビットにアップグレードした後に問題が発生します。
はい。プラットフォームに依存しないライブラリを使用している場合、Javaバイトコード(およびソースコード)はプラットフォームに依存しません。32ビットと64ビットは関係ありません。
私は誤って(大きな)アプリケーションを32ビットVMではなく64ビットVMで実行し、一部の外部ライブラリ(JNIによって呼び出される)が失敗し始めるまで気づきませんでした。
32ビットプラットフォームでシリアル化されたデータは、64ビットプラットフォームでまったく問題なく読み込まれました。
どのような問題が発生していますか?うまくいくものとうまくいかないものがありますか?JConsoleなどを取り付けてみて、ピークがありますか?
非常に大きなVMを使用している場合は、64ビットのGCの問題が影響を与える可能性があります。
最初の質問には「はい」、2番目の質問には「いいえ」。それは仮想マシンです。問題は、バージョン間のライブラリ実装の不特定の変更に関連している可能性があります。たとえば、競合状態である可能性があります。
VMが通過しなければならないいくつかのフープがあります。int
特に、参照は、スタック上のsと同じスペースをとるようにクラスファイルで扱われます。2つの参照スロットを使用しますdouble
。long
たとえば、フィールドの場合、VMが通常とにかく通過するいくつかの再配置があります。これはすべて(比較的)透過的に行われます。
また、一部の64ビットJVMは「圧縮されたoops」を使用します。データは約8バイトまたは16バイトごとに整列されるため、アドレスの3ビットまたは4ビットは役に立ちません(ただし、一部のアルゴリズムでは「マーク」ビットが盗まれる可能性があります)。これにより、32ビットアドレスデータ(したがって、半分の帯域幅を使用するため、より高速になります)は、64ビットプラットフォームで35ビットまたは36ビットのヒープサイズを使用できます。
すべてのバイトコードは8ビットベースです。(そのため、BYTEコードと呼ばれます)すべての命令は8ビットの倍数です。32ビットマシンで開発し、64ビットJVMでサーバーを実行します。
あなたが直面している問題の詳細を教えてください。その後、私たちはあなたを助けるチャンスがあるかもしれません。そうでなければ、私たちはあなたが抱えている問題が何であるかを推測しているだけです。
ネイティブコード(特定のアーキテクチャ用にコンパイルされたマシンコード)がない限り、コードは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。」