アプリケーションをプロファイリングしているときに、奇妙な動作に遭遇しました。DestroyJavaVM スレッドが常に (100% の時間) 実行されているのです。
この件について少し調べてみたところ、ネット上には有益な情報はほとんどなく、私が理解したのは、このスレッドは終了時にJVMをアンロードする。
もしそうなら、なぜこのスレッドはアプリケーションを起動した瞬間から常に 100% RUNNING 状態になっているのでしょうか? 貴重なリソースを消費し、そのためOutOfMemoryError
(私が時々経験するような) 問題を引き起こすのではないでしょうか?
このスレッドが実際に何を実行し、何がその初期化をトリガーするかについての公式リファレンスはありますか?
ありがとう
ベストアンサー1
これは、ほとんどのアプリケーションがスレッドで実行されるために発生します。
全てポジョアプリはメソッドを呼び出すことで開始しますmain
。最も単純なケースでは、このメソッドがオブジェクトの作成、メソッドの呼び出しなど、すべての作業を実行します。完了すると、すべての処理を待機するスレッドmain
を使用してJVMをシャットダウンするように指示されます。DestroyJavaVM
非デーモンスレッド作業を実行する前に完了する必要があります。これは、JVM が破棄される前に、作成した非デーモン スレッドが完了することを保証するためです。
ただし、GUI を備えたアプリは通常、複数のスレッドとして実行されます。1 つはキーボードやマウスのイベントなどのシステム イベントを監視するためのものです。もう 1 つはウィンドウやディスプレイを維持するためのものです。main
この種のアプリのメソッドは、おそらく必要なスレッドをすべて起動して終了するだけです。スレッドは作成されますDestroyJavaVM
が、VM を破棄する前に、作成したスレッドがすべて完了するのを待つだけです。
その結果、スレッドを作成し、その機能のみに依存するアプリでは、常にDestroyJavaVM
終了を待つスレッドが存在します。実行中のjoin
他のすべてのスレッドを実行するだけなので、リソースは消費されません。