26581


eclipse上で、スレッドを立てるJavaのプログラムをデバッグ実行したところ、DestroyJavaVMという、自分で立てたわけではないスレッドの存在を確認しました。

このDestroyJavaVMスレッドについて2点質問があります。

  * このスレッドの役割は何か？
  * このスレッドが実行しているソースコードを確認するにはどこを参照すればよいか？

以下にDestroyJavaVMスレッドの存在を確認した際のスクリーンショットを記載します。プログラムは、Windows 64bit向けのeclipse
Lunaで実行しています。

[![DestroyJavaVMスレッドが立ち上がるプログラム](https://i.stack.imgur.com/Foect.png)](https://i.stack.imgur.com/Foect.png)


CC BY-SA 3.0
2016-06-08T13:59:13.687
26566
2016-06-09T07:23:37.897
15485
question
java
DestroyJavaVMスレッドについて


### このスレッドの役割は何か？

[DestroyJavaVM - 呼び出しAPI (Java Native
Interface仕様)](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/jni/spec/invocation.html#DestroyJavaVM)

> Java VMをアンロードし、そのリソースを回復します。
>
>
> どのスレッドでも、接続されているかどうかにかかわらず、この関数を呼び出すことができます。現在のスレッドが接続されている場合、VMは、現在のスレッドがデーモンでない唯一のユーザー・レベルJavaスレッドになるまで待機します。現在のスレッドが接続されていない場合は、VMが現在のスレッドを接続し、現在のスレッドがデーモンでない唯一のユーザー・レベルのスレッドになるまで待機します。

とのことなので、`JVM`内で動いているユーザースレッドが無くなるまで待機し、それが無くなると、`JVM`を破棄してリソースの回復を行うスレッドのようです。

### このスレッドが実行しているソースコードを確認するにはどこを参照すればよいか？

多分、
<http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/bin/java.c>
です。

[code]

    /*
     * Always detach the main thread so that it appears to have ended when
     * the application's main method exits.  This will invoke the
     * uncaught exception handler machinery if main threw an
     * exception.  An uncaught exception handler cannot change the
     * launcher's return code except by calling System.exit.
     *
     * Wait for all non-daemon threads to end, then destroy the VM.
     * This will actually create a trivial new Java waiter thread
     * named "DestroyJavaVM", but this will be seen as a different
     * thread from the one that executed main, even though they are
     * the same C thread.  This allows mainThread.join() and
     * mainThread.isAlive() to work as expected.
     */
    #define LEAVE() \
        do { \
            if ((*vm)->DetachCurrentThread(vm) != JNI_OK) { \
                JLI_ReportErrorMessage(JVM_ERROR2); \
                ret = 1; \
            } \
            if (JNI_TRUE) { \
                (*vm)->DestroyJavaVM(vm); \
                return ret; \
            } \
        } while (JNI_FALSE)
    
[/code]


CC BY-SA 3.0
2016-06-09T07:23:37.897
26581
2016-06-09T07:23:37.897
46
26566
answer