将调用 System.exit(0);来自主要 运行 垃圾收集之外的对象?
Will calling System.exit(0); from an object outside of main run garbage collection?
我打算使用一个由我的主要方法调用的对象来退出整个程序。该对象有一个方法,它只是 运行 一个 System.exit(0).
我的问题是,这样做安全吗? 如果我从另一个对象 运行 System.exit(0)
,垃圾收集是否仍会从内存中清除整个程序,或者我是否会在从内存中清除调用 class 时遇到问题? 我的想法是,由于 JVM 将被终止,调用 class 将被垃圾收集,或者我可能在从对象的堆栈框架中清除内存中的调用 class 时遇到问题位于主堆栈框架之上。主要是我对Java还不够了解...感谢您的帮助!
使用System.exit(0) 将从堆栈和堆中刷新整个应用程序。使用 VisualVM 而 运行 您的程序来确认这一点。我做不到,但我有一个应用程序可以增加几 GB 的内存利用率。我在其中一个对象中放置了一个 System.exit() 语句,并看到所有内存都被释放了。
System.exit(any int)
将终止应用程序。本机和堆内存都将释放给操作系统。
这将终止 "java" 进程。在 linux 上,执行
ps -eaf | grep java
查看System.exit调用后的进程,你会发现它已经退出,没有任何痕迹。这意味着此进程不是 运行ning 并且分配给它的任何资源:内存,cpu 都由 OS 声明。
在 GC 方面,澄清一下,GC 也是任何 java 应用程序(进程)的组成部分,并且也会随之终止。 System.exit 不会为 运行 提供 GC 或进行任何清理。
如果您想要清理,允许关闭挂钩,在这种情况下 System.exit() 将调用关闭挂钩,允许清理,例如关闭线程等。
System.exit() 是一个静态函数,因此在何处调用它并不重要。效果与终止 Java 虚拟机相同。 JVM 在终止时使用的任何资源都返回给 OS.
来源:http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
我打算使用一个由我的主要方法调用的对象来退出整个程序。该对象有一个方法,它只是 运行 一个 System.exit(0).
我的问题是,这样做安全吗? 如果我从另一个对象 运行 System.exit(0)
,垃圾收集是否仍会从内存中清除整个程序,或者我是否会在从内存中清除调用 class 时遇到问题? 我的想法是,由于 JVM 将被终止,调用 class 将被垃圾收集,或者我可能在从对象的堆栈框架中清除内存中的调用 class 时遇到问题位于主堆栈框架之上。主要是我对Java还不够了解...感谢您的帮助!
使用System.exit(0) 将从堆栈和堆中刷新整个应用程序。使用 VisualVM 而 运行 您的程序来确认这一点。我做不到,但我有一个应用程序可以增加几 GB 的内存利用率。我在其中一个对象中放置了一个 System.exit() 语句,并看到所有内存都被释放了。
System.exit(any int)
将终止应用程序。本机和堆内存都将释放给操作系统。
这将终止 "java" 进程。在 linux 上,执行
ps -eaf | grep java
查看System.exit调用后的进程,你会发现它已经退出,没有任何痕迹。这意味着此进程不是 运行ning 并且分配给它的任何资源:内存,cpu 都由 OS 声明。
在 GC 方面,澄清一下,GC 也是任何 java 应用程序(进程)的组成部分,并且也会随之终止。 System.exit 不会为 运行 提供 GC 或进行任何清理。
如果您想要清理,允许关闭挂钩,在这种情况下 System.exit() 将调用关闭挂钩,允许清理,例如关闭线程等。
System.exit() 是一个静态函数,因此在何处调用它并不重要。效果与终止 Java 虚拟机相同。 JVM 在终止时使用的任何资源都返回给 OS.
来源:http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)