mainメソッドを呼び出します。仮想マシンは、次の2つのうちのいずれかが発生した場合にすべてのアクティビティを終了し、仮想マシン自身を終了します。
RuntimeまたはクラスSystemのexitメソッドを呼び出し、セキュリティ・マネージャによってexit動作が許可された場合。
これは、アプリケーション自身がスレッドを開始しない場合、JVMはmainが終了するとただちに終了することを意味します。ただし、java.awt.Frameを作成して表示する単純なアプリケーションの場合にはこれは当てはまりません。
        public static void main(String[] args) {
            Frame frame = new Frame();
            frame.setVisible(true);
         }
その理由は、AWTが、AWTまたはSwingコンポーネントがトリガーできるイベントを処理するために、非同期イベント・ディスパッチ機構をカプセル化するからです。この機構の正確な動作は実装によって異なります。具体的には、内部的な目的で非デーモンのヘルパー・スレッドを開始できます。実際に、上記の例ではこれらのスレッドが終了を妨げています。この機構の動作に適用される制限は、次のもののみです。
EventQueue.isDispatchThreadは、呼出し元スレッドがこの機構によって開始されたイベント・ディスパッチ・スレッドである場合にかぎりtrueを返します。
  EventQueue (EventQueueに送られたイベントは合体できる)に実際に入れられたAWTEventsは次のようにディスパッチされます。
       AWTEvent AがAWTEvent Bよりも前にEventQueueに入れられた場合、イベントBをイベントAよりも前にディスパッチすることはできません。Component.isDisplayable参照)。
RuntimeまたはクラスSystemのexitメソッドを起動した場合、JVMは表示可能なコンポーネントが存在するかどうかにかかわらず終了します。
  1.4から、4030718の修正の結果、この動作は変更されました。現在の実装では、次の3つの条件が満たされた場合、AWTはそのすべてのヘルパー・スレッドを終了し、アプリケーションが正常に終了できるようにします。
System.exitを呼び出さずに正常に終了したいスタンドアロンAWTアプリケーションは、次を確認する必要があります。
WindowsでWindow.disposeを呼び出すことにより実行できます。Frame.getFramesを参照してください。
  EventQueueに送信することがあります。問題は、AWTイベント・リスナーのメソッドは通常ヘルパー・スレッドで実行されることです。
        <...>
        Runnable r = new Runnable() {
            public void run() {
                Object o = new Object();
                try {
                    synchronized (o) {
                        o.wait();
                    }
                } catch (InterruptedException ie) {
                }
            }
        };
        Thread t = new Thread(r);
        t.setDaemon(false);
        t.start();
        <...>
「Java(tm)仮想マシン仕様」では、このスレッドが終了するまでJVMが終了しないことが保証されています。