2016-04-13 2 views
2

私はNetbeansでJava 8 SEアプリケーションを開発しています。私は最近、アプリケーションに追加した新しい機能が遅すぎる(計算が止まるまで約1分)。そこで私はプロファイラを起動して、主要なボトルネックが何かを確認しました。驚いたことに、計算は約7秒で完了しました。プロファイラを添付してJavaアプリケーションを高速化するのはなぜですか?

最初は信じられませんでしたが、結果は正しいものでした。 もう一度試してみましたが、プロファイラを接続してアプリが常に10倍速く実行されました。コンパイル済みの.jarファイルをWindowsのコマンドラインから直接実行しようとしましたが、計算に何分かかかりました。

添付されたプロファイラは、パフォーマンスに非常に大きな力を発揮します。 JVMやアプリケーションにはどのような変更が加えられますか?

私は提供されたJavaラッパーを使ってこれらの計算にネイティブOpenCVを使用しています。

//編集 - 追加情報:基本的にVisualVMと思われる組み込みのNetbeans 8.1プロファイラを使用しています。プロファイリング方法については、「メソッド」とその実行時間と呼び出し回数を監視することを選択しました。パフォーマンスのバンプは、計測されたプロファイリングとサンプリングされたプロファイリングの両方で発生します。

+0

あなたの質問は、 「プロファイラ環境がより速くなる」から「なぜ非プロファイラ環境が遅くなるのか」を選択します。 – brycem

+0

どのプロファイラを使用しますか? 'JVMやアプリケーションにどのような変更を加えますか? 'というのは、異なるプロファイリング手法(サンプリング、計測、...)があるので、その情報を与えるだけで答えることができます; –

+0

@ Markus Weninger – Leprechaun

答えて

0

残念ながら、なぜこれが当てはまるのかを説明する1つの答えはないでしょう。もちろん、それはプログラムが何をしているのか、プログラムがどのように立ち上げられているのかによって異なります。たとえば、アプリケーションを起動するためにプロファイラを使用している場合(後で接続するのではなく)、プロファイラが異なる設定(ヒープサイズ、ガベージコレクタなど)で起動している可能性があります。その違いが原因です。

jcmdを実行すると、プロセスの一覧が表示されます。 jcmd <id> VM.flagsを実行して、JVMの設定内容を確認し、プロファイラーの下でアプリケーションが実行されていることを確認します。

また、プログラムが過剰にロックされていることが原因で、プロファイラが接続されていないときにこの過剰なロックが原因でアプリケーションにスラッシングが発生している可能性があります。それが接続されると、ロックが遅くなり、アプリケーションスレッドが協調して最終的にはより早く進行することになります。

しかし、これはあなたがさらに調査する方法の単なる提案です。あなたが全く違うものを見ているという未だ発見されていない問題が他にもある可能性が非常に高いです(例えば、違うレベルのログにデフォルト設定されています...)

関連する問題