異なるJavaアプリケーションのエクスポートオプションでの奇妙な動作

Suvitruf-Andrei Apanasik

多くのライブラリ(netty、guavaなど)を使用するJavaサーバーアプリケーションがあります。私は常にこのアプリケーションを単一の.jarとしてエクスポートします。Eclipseでアプリケーションを実行したとき、問題はありませんでした。しかし、コンソール(WindowsまたはUbuntuは関係ありません)でアプリを起動すると、奇妙な問題が発生します。ソケットを介したすべての接続プロセスが長すぎます。たとえば、HttpAsyncまたはその他を介した単純なhttp接続(rabbitmq接続など)は1〜2分続きます。ただし、接続が完了すると、データの送受信は高速になります。何が問題なのかわかりません。前述のように、私は開発にEclipseを使用しています。

ご存知のように、プロジェクトを3つの異なる方法でエクスポートできます(Eclipseで)。

  1. 必要なライブラリをJARに抽出します。
  2. 必要なライブラリをJARにパッケージ化します。
  3. 必要なライブラリをJARの隣のサブフォルダにコピーします。

そのため、2つのオプションを使用すると、問題が発生しました。3Dオプション(メインの.jarの近くのフォルダー内のすべての.jar)に切り替えると、問題は解決しました。

通常、2オプションと3オプションの間に大きな違いはありません(2つのすべての.jarが1つのjarのすぐ内側にあります)。実行時にjarから新しいクラスをロードするのに余分な時間が必要だったのだと思いました。ただし、問題は開始時だけでなく、すべての新しい接続で発生します。

誰かがこの振る舞いを説明できますか?

UPD:EclipseLuna使用しているOS(WindowsまたはUbuntu)は関係ありません。また、どのjvmも関係ありません(別のOracle jdkで試したり、open jdkを試したりしました)。

hagrawal

これはすべて、JARにパッケージ化するときのパフォーマンスの違いとJARに抽出するときのパフォーマンスの違い、およびコンソールから実行するEclipse v / sから実行するときのパフォーマンスの違いについて説明しています。

JARにパッケージ化するときとJARに抽出するときのパフォーマンスの違い:

必要なライブラリをJARに抽出します。

機能:
このオプションでは、Eclipseは参照されたJARからすべてのクラスを抽出し、生成されたJARにパッケージ化します。

JARを開くと、参照されたJARはパッケージ化されていませんが、参照されたJARのすべてのクラスはパッケージ構造に従って配置され、ルートレベルでJAR内にパッケージ化されています。これにより、実行時の解析とメモリへのJARのロードなどの追加コストが発生する「必要なライブラリをjarファイルにパッケージ化すると比較して、パフォーマンスに大きな違いが生じます。

Eclipseを介してJARとしてエクスポートする場合、パフォーマンスが懸念される場合は最適なオプションです。また、このJARを出荷できるため、これはスケーラブルなオプションです。

MANIFEST.MFこのファイルで注意すべき主なことは、メインクラスです。JARを実行すると、必要なクラスが直接実行されます。

Main-Class: com.my.jar.TestSSL


必要なライブラリをJARにパッケージ化します。

機能:
このオプションでは、Eclipseは次のことを行います。

  • 参照されているすべてのJARを生成されたJARにパッケージ化します。
  • 通じEclipseのJARローディング機構を採用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の隣のサブフォルダーにコピーする」については、ファイルシステムに依存するため、検討するのはあまりスケーラブルなソリューションではないと思います。そうしないでください。

コンソールから実行しているEclipsev / sから実行した場合のパフォーマンスの違い:

Eclipseからアプリケーションを実行すると、Eclipseが実行時にJARを解析してロードする必要がない、最初のエクスポートオプションと同様に静かです。
ただし、これは非常に些細な点です。重要なのは、EclipseJARエクスポートオプション1とオプション2を検討することです。


最後の言葉:

  • JARをエクスポートするには、「必要なライブラリをJARに抽出する」を使用すると、パフォーマンスが大幅に向上します。
    • JVMはコードを実行するため、コンソールから実行するときにソケット接続が長く続く可能性はほとんどありません。Eclipseとコンソールから実行する場合は同じまたは非常に同等のパフォーマンスになります(どちらの場合も同じJavaバージョンを考慮)。パッケージ化されたJARパフォーマンスのおかげで感じているかもしれません。抽出されたJARを試してみてください。問題はないはずです。
  • また、実行しているロギングの量も考慮してください。実行中、構成によっては、Eclipseが多くのロギングをマスクするため、I / O時間を節約できます。
  • JARクラスパスからクラスにアクセスする方法を理解してください。これは、JARからクラスを参照する場合の追加の計算コストのようなものです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Ubuntu16.04スタートアップアプリケーションでの奇妙な動作

分類Dev

Eclipseでアプリケーションをエクスポートした後の異なる文字

分類Dev

WebアプリケーションでのRandomStringUtils.randomの奇妙な動作

分類Dev

Webアプリケーションのコンテキストスコープの奇妙な動作

分類Dev

Webアプリケーションのコンテキストスコープの奇妙な動作

分類Dev

奇妙な動作を処理するMFCアプリケーションの例外

分類Dev

Net CoreWebアプリケーションの異なるポートでのヘルスチェック

分類Dev

アプリケーションをクラッシュさせるqDebug()の奇妙な動作

分類Dev

マルチスレッドJavaアプリケーションでの奇妙な動作(ロックなしのデッドロック?)

分類Dev

SQLServerとの接続がない場合にオフラインで動作できるデスクトップアプリケーション

分類Dev

JavaアプリケーションとAndroidアプリケーションで同じJavaクラスを使用する場合の2つの異なる形式

分類Dev

DockerコンテナーでのKafka Streamsアプリケーションの奇妙な動作

分類Dev

LibGDXスクリーンショットの奇妙な動作

分類Dev

LibGDXスクリーンショットの奇妙な動作

分類Dev

基本的なreactアプリケーションをロードする際のエクスポートエラー

分類Dev

レビュー後のアプリケーションの動作は奇妙な理由ですか?

分類Dev

プロダクションモードでの角度のある奇妙な動作

分類Dev

スクリプトとコマンドのカラーオプションを使用したエコーコマンドの動作が異なります

分類Dev

スクリプトとコマンドのカラーオプションを使用したエコーコマンドの動作が異なります

分類Dev

Win16アプリケーションのレイアウトがWin1032ビットで奇妙に動作するのはなぜですか?

分類Dev

JavaFX-異なるクラスのオブジェクトパラメータを使用してアプリケーションを起動する

分類Dev

Adobe AIRアプリケーションをエクスポートするための最良のオプションは何ですか?

分類Dev

JavaFX2-GUIなしでアプリケーションを起動するためのオプション

分類Dev

異なるポートのJettyで個別のWebアプリケーション

分類Dev

管理者権限のない奇妙な動作のDelphiアプリケーション

分類Dev

異なる動作のセクションでforループを実行する

分類Dev

ソケットベースのアプリケーションの非決定的な動作

分類Dev

Nodejsでサポートされていないコンテンツタイプのアプリケーション/オクテットストリーム

分類Dev

同じテンプレートの2つのインスタンスがアプリケーションの複数の場所で使用されると、奇妙な動作が発生します

Related 関連記事

  1. 1

    Ubuntu16.04スタートアップアプリケーションでの奇妙な動作

  2. 2

    Eclipseでアプリケーションをエクスポートした後の異なる文字

  3. 3

    WebアプリケーションでのRandomStringUtils.randomの奇妙な動作

  4. 4

    Webアプリケーションのコンテキストスコープの奇妙な動作

  5. 5

    Webアプリケーションのコンテキストスコープの奇妙な動作

  6. 6

    奇妙な動作を処理するMFCアプリケーションの例外

  7. 7

    Net CoreWebアプリケーションの異なるポートでのヘルスチェック

  8. 8

    アプリケーションをクラッシュさせるqDebug()の奇妙な動作

  9. 9

    マルチスレッドJavaアプリケーションでの奇妙な動作(ロックなしのデッドロック?)

  10. 10

    SQLServerとの接続がない場合にオフラインで動作できるデスクトップアプリケーション

  11. 11

    JavaアプリケーションとAndroidアプリケーションで同じJavaクラスを使用する場合の2つの異なる形式

  12. 12

    DockerコンテナーでのKafka Streamsアプリケーションの奇妙な動作

  13. 13

    LibGDXスクリーンショットの奇妙な動作

  14. 14

    LibGDXスクリーンショットの奇妙な動作

  15. 15

    基本的なreactアプリケーションをロードする際のエクスポートエラー

  16. 16

    レビュー後のアプリケーションの動作は奇妙な理由ですか?

  17. 17

    プロダクションモードでの角度のある奇妙な動作

  18. 18

    スクリプトとコマンドのカラーオプションを使用したエコーコマンドの動作が異なります

  19. 19

    スクリプトとコマンドのカラーオプションを使用したエコーコマンドの動作が異なります

  20. 20

    Win16アプリケーションのレイアウトがWin1032ビットで奇妙に動作するのはなぜですか?

  21. 21

    JavaFX-異なるクラスのオブジェクトパラメータを使用してアプリケーションを起動する

  22. 22

    Adobe AIRアプリケーションをエクスポートするための最良のオプションは何ですか?

  23. 23

    JavaFX2-GUIなしでアプリケーションを起動するためのオプション

  24. 24

    異なるポートのJettyで個別のWebアプリケーション

  25. 25

    管理者権限のない奇妙な動作のDelphiアプリケーション

  26. 26

    異なる動作のセクションでforループを実行する

  27. 27

    ソケットベースのアプリケーションの非決定的な動作

  28. 28

    Nodejsでサポートされていないコンテンツタイプのアプリケーション/オクテットストリーム

  29. 29

    同じテンプレートの2つのインスタンスがアプリケーションの複数の場所で使用されると、奇妙な動作が発生します

ホットタグ

アーカイブ