日期:2014-05-20  浏览次数:20593 次

Java程序是如何结束的?
本帖最后由 qinglo_ 于 2012-11-27 21:52:19 编辑
面试时被问及这个问题 ,如遭一棒啊
比如说main方法是入口 当对象调用完所有的方法执行完后是如何结束的
就拿下面的代码来举例吧:
public class kk{
public void function(){
System.out.print("xxxxx");

public static void main(String []args){
kk k=new kk();
k.function();
}

当function()执行完后这个程序是如何结束的?
------解决方案--------------------
我很好奇 lz 面试的什么职位 
如果不是比较偏门的开发方向的话,我觉得面试官在装13

现实的情况是,不少人对 java collection 集合或者容器类族的 sorted / ordered / thread-safe 都犯含糊 ,相较之下,面试官的问题完全木有意义,属于没事儿抽人或者找抽型。。。
------解决方案--------------------
代码被编译成class文件,其实是一个个的命令符

执行的时候各个命令根据不同的条件顺序的进栈出栈,

命令执行完,栈空了,也就结束了。
------解决方案--------------------
有可能在考父子进程相关知识,典型的一个虚拟机进程由"java xxx"命令启动,所以它的父进程是shell进程,shell会fork一个子进程出来,通过JNI的JNI_CreateJavaVM函数创建一个java虚拟机并加载主类,调用主类的main方法从一个java程序就跑起来了。

虚拟机所有非守护线程退出,这个进程也就结束了,但是进程所占用的资源还在,如果没有父进程去回收它,它就成为了一个僵尸进程,父进程回收了它以后,它才真正的结束,被操作系统回收资源。

考这个可以看你对操作系统的理解程度吧
------解决方案--------------------
在Unix系统上,有5种方式可以使一个进程正常终止:
(1)从main函数返回,相当于等效的调用exit函数
(2)调用exit
(3)调用_exit或者_Exit
(4)最后一个线程从其启动例程返回
(5)最后一个线程调用pthread_exit

进程终止成为僵尸进程了。

jvm运行离不开这些系统调用以及底层库函数,所以原理是相同的,有关内容也可以参考java虚拟机规范
------解决方案--------------------
你该反问的。你把自己的理解说了,他不满意,你可以反问他,我想请教一下您对这个问题的理解,有助于我开阔视野之类的。看他能说出 个所以然不。这样也能体现你跟面试官的交流,反应你的好学意识。
------解决方案--------------------
可以借助理解c语言中最简单的顺序结构,调用完成方法后就退出程序,道理是一样的,实现是有区别的。具体的深入原理,还是需要了解java虚拟机的原理。实际上,所有的语言原理都遵循顺序,循环,选择这三中模式。