アプリケーションをプロファイリングするときに、奇妙な動作に遭遇しました-DestroyJavaVMスレッドは常に実行されています-時間の100%。
オンラインで貴重な情報がほとんどないというテーマについて少し調査した後、私が理解したことは、このスレッドが JVMをアンロードすることになっていることですexit 。
その場合、アプリケーションを起動した最初の瞬間からこのスレッドが100%の時間、実行状態にあるのはなぜですか?貴重なリソースを消費するので、OutOfMemoryError
を引き起こす可能性はありませんか(私がときどき得る)。
このスレッドが実際に行うこと、およびその初期化をトリガーするものへの公式の参照はありますか?
ありがとう
これは、ほとんどのアプリケーションがスレッドで実行されるために発生します。
すべて [〜#〜] pojo [〜#〜] アプリはmain
メソッドを呼び出すことから始まります。最も単純なケースでは、このメソッドはすべての作業、オブジェクトの作成、メソッドの呼び出しなどを実行します。main
が完了すると、JVMはすべてを待機するDestroyJavaVM
スレッドを使用してシャットダウンするように指示されます作業を行う前に完了するデーモン以外のスレッド。これは、JVMが破棄される前に、作成したデーモン以外のスレッドが完了するまで実行されるようにするためです。
ただし、GUIを備えたアプリは通常、いくつかのスレッドとして実行されます。キーボードやマウスのイベントなどのシステムイベントを監視するためのもの。ウィンドウやディスプレイなどを維持するためのもの。この種のアプリのmain
メソッドは、必要なすべてのスレッドを起動して終了するだけです。それでもDestroyJavaVM
スレッドが作成されますが、今やるのは、作成されたすべてのスレッドが完了するのを待ってからVMを破棄することです。
その結果、スレッドを作成し、その機能のみに依存するすべてのアプリは、終了するまで常にDestroyJavaVM
スレッドを待機します。他のすべての実行中のスレッドをjoin
ingしているだけなので、リソースを消費しません。