我打算使用一个由我的main方法调用的对象来退出整个程序。该对象有一个方法只运行System.exit(0).
我的问题是,这是安全的事情吗? 如果我从另一个对象运行System.exit(0)
,垃圾收集是否仍会从内存中清除整个程序,或者我是否有从内存清除调用类的问题?我的想法是,因为JVM将被终止,调用类将被垃圾收集,或者我可能有问题从内存中清除调用类,因为对象的堆栈帧在主堆栈帧之上。这主要是我对Java还不太了解的问题......感谢您的帮助!
答案 0 :(得分:3)
System.exit()是一个静态函数,因此无论你在何处调用它都无关紧要。效果与终止Java虚拟机的效果相同。终止时JVM使用的任何资源都将返回给操作系统。
来源:http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
答案 1 :(得分:2)
System.exit(any int)
将终止该申请。本机和堆的内存将释放到操作系统。
这将终止“java”进程。在linux上,做
ps -eaf | grep java
在System.exit调用之后查看进程,你会发现它已经退出并且没有它的踪迹。这意味着此进程未运行且任何资源:分配给它的内存,cpu由OS声明。
在GC方面,澄清一下,GC也是任何java应用程序(进程)的组成部分,并且也会随之终止。 System.exit不会提供GC运行或进行任何清理。
如果你想要一个清理,允许一个关闭钩子,在这种情况下System.exit()将调用关闭钩子,允许清理,如关闭线程等。
答案 2 :(得分:1)
使用System.exit(0)将从堆栈和堆中刷新整个应用程序。运行程序时使用VisualVM进行确认。我无法实现它,但我有一个应用程序,可以提升几GB的内存利用率。我在其中一个对象中放了一个System.exit()语句,看到所有内存都被释放了。