多くのライブラリ(netty、guavaなど)を使用するJavaサーバーアプリケーションがあります。私は常にこのアプリケーションを単一の.jarとしてエクスポートします。Eclipseでアプリケーションを実行したとき、問題はありませんでした。しかし、コンソール(WindowsまたはUbuntuは関係ありません)でアプリを起動すると、奇妙な問題が発生します。ソケットを介したすべての接続プロセスが長すぎます。たとえば、HttpAsyncまたはその他を介した単純なhttp接続(rabbitmq接続など)は1〜2分続きます。ただし、接続が完了すると、データの送受信は高速になります。何が問題なのかわかりません。前述のように、私は開発にEclipseを使用しています。
ご存知のように、プロジェクトを3つの異なる方法でエクスポートできます(Eclipseで)。
そのため、2つのオプションを使用すると、問題が発生しました。3Dオプション(メインの.jarの近くのフォルダー内のすべての.jar)に切り替えると、問題は解決しました。
通常、2オプションと3オプションの間に大きな違いはありません(2つのすべての.jarが1つのjarのすぐ内側にあります)。実行時にjarから新しいクラスをロードするのに余分な時間が必要だったのだと思いました。ただし、問題は開始時だけでなく、すべての新しい接続で発生します。
誰かがこの振る舞いを説明できますか?
UPD:EclipseLuna。使用しているOS(WindowsまたはUbuntu)は関係ありません。また、どのjvmも関係ありません(別のOracle jdkで試したり、open jdkを試したりしました)。
これはすべて、JARにパッケージ化するときのパフォーマンスの違いとJARに抽出するときのパフォーマンスの違い、およびコンソールから実行するEclipse v / sから実行するときのパフォーマンスの違いについて説明しています。
機能:
このオプションでは、Eclipseは参照されたJARからすべてのクラスを抽出し、生成されたJARにパッケージ化します。
JARを開くと、参照されたJARはパッケージ化されていませんが、参照されたJARのすべてのクラスはパッケージ構造に従って配置され、ルートレベルでJAR内にパッケージ化されています。これにより、実行時の解析とメモリへのJARのロードなどの追加コストが発生する「必要なライブラリをjarファイルにパッケージ化する」と比較して、パフォーマンスに大きな違いが生じます。
Eclipseを介してJARとしてエクスポートする場合、パフォーマンスが懸念される場合は最適なオプションです。また、このJARを出荷できるため、これはスケーラブルなオプションです。
MANIFEST.MFこのファイルで注意すべき主なことは、メインクラスです。JARを実行すると、必要なクラスが直接実行されます。
Main-Class: com.my.jar.TestSSL
機能:
このオプションでは、Eclipseは次のことを行います。
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
し、あなたも見ることができorg.eclipse.jdt.internal.jarinjarloader
、あなたの生成されたJARにパッケージをして、このパッケージだけで生成されたJARのルートディレクトリの下にあります。もちろん、これはこのオプションを選択したときに発生する追加コストです。JARを実行すると、実行されるのはメインクラスではなくJarRsrcLoader
、メインクラスと他のライブラリをロードする実行され、参照されるすべてのライブラリはパッケージ化されています。以下のMANIFEST.MFセクションを参照してください
MANIFEST.MFこのファイルで注意すべき主なことは、メインクラスです。JARJarRsrcLoader
を実行すると、が実行され、さらにジョブが実行されます。
Rsrc-Main-Class: com.cgi.tmi.TestSSL
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
最後のEclipseエクスポートオプションである「必要なライブラリをJARの隣のサブフォルダーにコピーする」については、ファイルシステムに依存するため、検討するのはあまりスケーラブルなソリューションではないと思います。そうしないでください。
Eclipseからアプリケーションを実行すると、Eclipseが実行時にJARを解析してロードする必要がない、最初のエクスポートオプションと同様に静かです。
ただし、これは非常に些細な点です。重要なのは、EclipseJARエクスポートオプション1とオプション2を検討することです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加