0

私が開発者として取り組んでいる大規模な Java デスクトップ アプリケーションでは、プログラムを起動した直後に、ほとんどの GUI 機能と操作が最初にアクティブ化したときに少し遅れることに気付きました。同じ機能をもう一度クリックすると、すぐに有効になります。私の現在の仮説は、次のランタイム操作の 1 つ以上がこの効果を引き起こすというものです (私の知る限り、可能性が最も高いものから最も低いものへのおおよその順序で):

  • .class ファイルをディスクからロードする (または JAR から解凍する)
  • クラスのバイトコード検証
  • バイトコードの JIT コンパイル
  • クラスの静的初期化

プログラムが、少なくとも一度はクリックしたボタンだけでなく、すべてに素敵なきびきびした感触があれば、明らかに良いでしょう. だから、私が持っている質問は次のとおりです。

  1. これらの操作 (または、考えもしなかった他の操作) のどれが主な要因であるかをどのように判断できますか? CPU とヒープのプロファイリングに VisualVM を使用する方法は知っていますが、このような半分隠れた JVM 要因をプロファイリングする方法はわかりません。
  2. 上記の操作がこの遅延の原因であると仮定すると、それを減らす 1 つの方法は、優先度の低いバックグラウンド スレッドをプログラム内のすべてのクラスと最も頻繁に使用されるライブラリを介して実行し、反射的にそれらに触れてそれらを強制することです。クラスロードされ、初期化されます。理想的には、最初に頻繁に使用されるクラスに触れ、あまり使用されないクラスをプロセスの後半に追いやります。これは良い考えですか?
  3. もしそうなら、誰かがこれを行う何かをすでに書いていますか?
  4. そうでない場合、それを実装する最も簡単な方法は何ですか?
4

0 に答える 0