【问题标题】:Why Avoid System.exit()?为什么要避免 System.exit()?
【发布时间】:2011-11-29 01:03:09
【问题描述】:

我在 Anthony Rizk 的《开始 BlackBerry 开发》一书中读到,虽然 System.exit() 方法会退出应用程序,但建议避免这种情况,并在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免System.exit()

【问题讨论】:

    标签: java blackberry java-me


    【解决方案1】:

    这是一个非常有趣的问题!

    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 中。事实证明,它不再留在那里了。下次我进入应用程序时,静态变量为空(正如我们期望它们在 Java SE 中一样)。所以我不清楚 Carol Hamer 和 Andrew Davison 的意思是说“早期运行的剩余部分(例如静态变量和其他仍在内存中的数据)可能会影响应用程序的后续运行”

    【讨论】:

      【解决方案2】:

      这是因为它可能会使您自己的有序退出方法短路,例如刷新缓冲的输出流/写入器,注销会话,删除文件,提交 DBMS 事务,...

      【讨论】:

      • 并在清理后将其称为最后一条指令,是否正确? (我通常这样做,它使我不必逐个遍历堆栈中的屏幕)。
      【解决方案3】:

      据我了解,通过调用 System.exit() 来终止容器是不正确的。这样做的正确方法是创建某种类型的 destroy() 方法,该方法允许清理您的线程并关闭您打开的任何资源。

      通俗地说,System.exit() 可能会留下挥之不去的数据/会话信息。

      【讨论】:

        【解决方案4】:

        根据我对 BB 开发的记忆,System.exit() 只是关闭应用程序而不破坏您创建的对象,将它们留给垃圾收集器。因此,该应用程序不会有效地从内存中删除。一个一个地关闭屏幕实际上会释放它们。

        我可能不太了解细节,但网上已经有足够多的关于最佳实践的信息了 :)

        【讨论】:

        • 不真实。应用程序从内存中删除。当进程退出时,所有内存都会释放给操作系统。所有系统资源也都被释放到操作系统,包括 fds、windows、sockets……我上次使用的操作系统不是这样的大约是 1994 年。
        • 嗯,当你谈论操作系统时你是对的,当你谈论 JVM 时你是不对的。
        • @favoretti 讨论的主题是一个通过System.exit() 退出的JVM。这就是我的评论所针对的。你的答案仍然不正确。
        • 在 BB 应用程序中 System.exit() 不会终止 JVM,只会终止应用程序。每个 BB 设备只有一个 JVM。所有应用都在唯一的 JVM 中运行。
        • 这也是我的想法。虽然我已经有一段时间没有做 BB 编程了,而且 EJP 如此积极地放心,但我还是闭嘴了 :)
        猜你喜欢
        • 2021-06-25
        • 2018-11-13
        • 2011-11-15
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 2019-03-23
        • 2011-05-09
        相关资源
        最近更新 更多