Java 为什么要避免System.exit()?
我在Anthony Rizk的《BlackBerry开发入门》一书中读到,虽然Java 为什么要避免System.exit()?,java,blackberry,java-me,Java,Blackberry,Java Me,我在Anthony Rizk的《BlackBerry开发入门》一书中读到,虽然System.exit()方法将退出应用程序,但建议避免这种情况,并在退出时关闭所有屏幕以正确清理应用程序。我的问题是,为什么要避免System.exit()?根据我对BB开发的记忆,System.exit()只是关闭应用程序,而不会破坏您创建的对象,将它们留给垃圾收集器。因此,应用程序将无法有效地从内存中删除。一个接一个地关闭屏幕实际上会释放它们 我可能对细节有点不太了解,但网上有足够的关于最佳实践的信息:)据我所知
System.exit()
方法将退出应用程序,但建议避免这种情况,并在退出时关闭所有屏幕以正确清理应用程序。我的问题是,为什么要避免System.exit()
?根据我对BB开发的记忆,System.exit()只是关闭应用程序,而不会破坏您创建的对象,将它们留给垃圾收集器。因此,应用程序将无法有效地从内存中删除。一个接一个地关闭屏幕实际上会释放它们
我可能对细节有点不太了解,但网上有足够的关于最佳实践的信息:)据我所知,通过调用System.exit()杀死容器是不正确的。正确的方法是创建某种destroy()方法,该方法允许清理线程并关闭已打开的任何资源
用外行的话来说,System.exit()可能会留下挥之不去的数据/会话信息。这是因为它可能会短路您自己的有序退出方法,例如刷新缓冲输出流/写入程序、注销会话、删除文件、提交DBMS事务,这是一个非常有趣的问题 Java SE API和BB Java API的
System.exit()行为有所不同:
- 在Java SE API中:终止当前运行的Java虚拟机
- 在BB Java API中:终止当前运行的Java应用程序
另外,请查看Carol Hamer和Andrew Davison在“学习黑莓游戏开发”中对此的描述:
警告:BlackBerry平台不会在单独的虚拟环境中启动您的应用程序
机器,这意味着你必须非常小心清理。遗骸
早期运行(如静态变量和内存中的其他数据)可能会影响应用程序的后续运行。这还意味着存在一个全局名称空间,因此如果两个类具有相同的名称,则可能会出现错误
因此,是的,每个BB设备只有一个JVM。是的,在BB应用程序中,System.exit()
调用只会停止应用程序,将所有静态数据留在RAM中,除非您进行初步清理
因此,您不应避免使用System.exit()
-关闭BB应用程序是合法/正确的方法,但只需在调用之前进行清理即可
更新:
哎呀。我创建了一个测试应用程序(使用JDE 4.7.0+Storm 9530 4.7.0模拟器)来测试调用System.exit()
后静态内容是否真的留在RAM中。结果证明它不会再留在那里了。下次我进入应用程序时,静态变量是null(正如我们在JavaSE中所期望的那样)。因此,我不清楚Carol Hamer和Andrew Davison所说的“早期运行的剩余部分(如静态变量和内存中的其他数据)可能会影响应用程序的后续运行”是什么意思。应用程序将从内存中删除。当进程退出时,所有内存将释放到操作系统。所有系统资源也会释放到操作系统,包括fds、windows、套接字等。。。我上一次使用的操作系统不是这样的是在1994年。当你谈论操作系统时,你是对的,当你谈论JVM时,你是不对的。@favoretti讨论的主题是一个JVM,它已通过system.exit()
退出。这就是我的评论。您的答案仍然不正确。在BB应用程序系统中,exit()
不会终止JVM,只会终止应用程序。每个BB设备只有一个JVM。所有应用程序都在唯一的JVM中运行。这也是我的想法。虽然我已经有一段时间没有做BB编程了,EJP也非常自信,但我还是闭嘴了:)把它作为清理后的最后一条指令,这样做是正确的吗?(我通常是这样做的,这样可以避免在堆栈中逐个迭代屏幕)。