web-dev-qa-db-ja.com

DestroyJavaVMスレッドは常に実行されています

アプリケーションをプロファイリングするときに、奇妙な動作に遭遇しました-DestroyJavaVMスレッドは常に実行されています-時間の100%。

enter image description here オンラインで貴重な情報がほとんどないというテーマについて少し調査した後、私が理解したことは、このスレッドが JVMをアンロードすることになっていることですexit

その場合、アプリケーションを起動した最初の瞬間からこのスレッドが100%の時間、実行状態にあるのはなぜですか?貴重なリソースを消費するので、OutOfMemoryErrorを引き起こす可能性はありませんか(私がときどき得る)。

このスレッドが実際に行うこと、およびその初期化をトリガーするものへの公式の参照はありますか?

ありがとう

16
KidCrippler

これは、ほとんどのアプリケーションがスレッドで実行されるために発生します。

すべて [〜#〜] pojo [〜#〜] アプリはmainメソッドを呼び出すことから始まります。最も単純なケースでは、このメソッドはすべての作業、オブジェクトの作成、メソッドの呼び出しなどを実行します。mainが完了すると、JVMはすべてを待機するDestroyJavaVMスレッドを使用してシャットダウンするように指示されます作業を行う前に完了するデーモン以外のスレッド。これは、JVMが破棄される前に、作成したデーモン以外のスレッドが完了するまで実行されるようにするためです。

ただし、GUIを備えたアプリは通常、いくつかのスレッドとして実行されます。キーボードやマウスのイベントなどのシステムイベントを監視するためのもの。ウィンドウやディスプレイなどを維持するためのもの。この種のアプリのmainメソッドは、必要なすべてのスレッドを起動して終了するだけです。それでもDestroyJavaVMスレッドが作成されますが、今やるのは、作成されたすべてのスレッドが完了するのを待ってからVMを破棄することです。

その結果、スレッドを作成し、その機能のみに依存するすべてのアプリは、終了するまで常にDestroyJavaVMスレッドを待機します。他のすべての実行中のスレッドをjoiningしているだけなので、リソースを消費しません。

57
OldCurmudgeon