7楼的朋友质疑得很有道理,笔者虽然不能完全解释清楚,但官方文档有这么一句原话:“The Java virtual machine exits when all nondaemon threads have terminated ……”按照这句话的意思只要所有的非daemon线程终止虚拟机就会exit,那么daemon仍然可以做自己的事情,至于你说的Main memory的话,其实释放资源全都由GC这个daemon Thread来作,它从头到位管理着JVM的Heap区,所以JVM实例退出,但Heap区仍然被GC线程所操作着,很正常的概念
try { FileInputStream fin = new FileInputStream(TestClass.class.getResource("TestClass.class").getFile()); DataInputStream din = new DataInputStream(fin); System.out.println(Integer.toHexString(din.readInt())); } catch (Exception e) { e.printStackTrace(); }
其实那些个框架啥的有什么好讲
jvm、jmm、classloader、languagespecific才是正道
但是线程变为守护线程仅仅是改了个属性,所以守护线程就是线程,而任何线程都有其父线程就是启动它的那个程序所在线程。jvm启动后应该是个进程,所有java线程都属于这个进程,当只剩守护线程的时候我觉得jvm应该是逐个结束这些守护线程,都结束以后才退出。
否则,jvm先退出了还剩几个守护线程在那自己结束好像不太可能吧?因为其main memory已经没了、其他资源也都没了、也不属于任何进程。
FileInputStream fin = new FileInputStream(TestClass.class.getResource("TestClass.class").getFile());
DataInputStream din = new DataInputStream(fin);
System.out.println(Integer.toHexString(din.readInt()));
} catch (Exception e) {
e.printStackTrace();
}