7

私はここに本当のヘッドスクラッチャーを持っています。私はすべてを試し、どこでも検索しました。それは私がそのテストJARを継承したアプリケーションから来ています。

(これは、GUIフロントと実際のチェックを行うコマンドラインアプリケーションで構成されています。GUIは、それ自体で新しいJVMを起動することによってコマンドラインアプリを実行します[java -cp"itself.jar"com.different.mainClass]。それは悪いデザインです、私は知っていますが、関連があるかもしれません。)

とにかく、このプログラムには、2つのforループ内にネストされたいくつかのリフレクション呼び出しが含まれています。問題は、アプリケーションがJARアップされると、最初のリフレクション呼び出しが反復ごとに正確に1秒かかることです。ただし、クラスから実行する場合は、数ミリ秒かかります。

実際には、これは次のコマンドを意味します。

java -jar myjar.jar

数時間かかります。

このコマンド:

java -cp "...[bunch of jars];myjar.jar" com.myclasses.main

数分かかります。

テストされるJARは常にjarです。違いはテストアプリケーションのみです。

追求するアイデアや手段は大歓迎です。ありがとうございました!

4

3 に答える 3

1

Eclipse TPTPYourKitなどのプロファイラーの下でプログラムを実行することを検討し、時間を費やしている場所をより正確に特定することができます。これにより、コードのエラーを指摘する可能性が非常に高くなるか、ライブラリのバグを指摘する可能性がやや低くなります。それでもわからない場合は、ここに関連するコードを投稿してください。サポートさせていただきます。

于 2013-01-29T07:00:46.023 に答える
0

他の人が述べているように、コードがどこで時間を費やしているかを確認するには、コードのプロファイルを作成する必要があります。

推測しなければならないのであれば、リフレクションの作業により、クラスローダーへのルックアップが繰り返され、jarファイルからクラスを抽出するときにクラスのロードが遅くなるのではないかと思います。

しかし、繰り返しになりますが、それは単なる予感です。確実にプロファイルする必要があります。

于 2013-01-29T13:28:22.010 に答える
0

これがあなたの問題に関連しているかどうかはわかりませんが、このコマンドの「-cp」引数は無視されます。

$ java -cp "...[bunch of jars]" -jar myjar.jar

「-cp」および「-jar」コマンドオプションを一緒に使用することはできません。実行可能JARファイルは、JARマニフェストからクラスパスを取得します。

これがあなたが見ている症状をどのように説明するのかわかりません...しかし、それはあなたが実行可能JARでやろうとしていることがうまくいかないことを意味し、それはおそらくあなたの質問を無意味にします。


ファローアップ

それが質問の単なるバグであったことを考えると...本当の問題ではありません...

私の提案は、Javaコマンドの2番目の形式を使用してテストを実行することです。つまり、-cpオプションとクラスパスを使用します。それがあなたのテスト体制の有効性にどのように影響を与えるかを理解するのは難しいです。

パフォーマンスの問題の根本的な原因を特定するには、テスターアプリケーションが実行していることを詳細に調べる必要があると思います。

于 2013-01-29T03:06:42.853 に答える