- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果有替代方案,在 C 中使用 exit(0)
不是一个好习惯,因为它不会释放资源。但是要在 Java 中使用 System.exit(0)
- 这里是怎么回事?在这种情况下,可以信任垃圾收集器吗?
C语言:
exit(0);
Java:
System.exit(0)
最佳答案
But to use System.exit(0) in java - how is it here? Could one trust the garbage-collector in this context?
当您在 Java 中调用 System.exit
时,垃圾收集器未正常运行1。但是,在我听说过的任何 JVM 中,还有其他东西可以回收所有已分配的对象。 (通常它是在操作系统级别处理的。)
GC 不运行这一事实仅在您依赖对象终结器来处理 JVM 终止之前的重要事情时才有意义。
假设,如果您的 Java 应用程序使用 JNI(等)调用 native 方法,那么这些方法可能会访问可能有问题的系统资源。然而:
作为一般规则,操作系统会处理这些事情。至少它适用于现代版本的 Linux 和 UNIX,AFAIK。
垃圾收集器无论如何都不知道这些资源。如果操作系统无法回收它们,那么 Java 垃圾收集器将无济于事。
如果您确实需要清理 Java 程序获取的此类资源(通过 native 代码),那么最好的方法是在 native 代码方法中实现清理,并使用“关闭 Hook ”来运行它们。如果您调用 System.exit
,关闭 Hook 将运行。
1 - 如果您之前调用了 runFinalizersOnExit(true)
,将在 JVM 退出时执行垃圾回收。但是,这是一种已弃用的方法。 Oracle 网站是这样解释的:
Q: Why is Runtime.runFinalizersOnExit deprecated?
A: Because it is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock. While this problem could be prevented if the class whose objects are being finalized were coded to "defend against" this call, most programmers do not defend against it. They assume that an object is dead at the time that its finalizer is called.
Further, the call is not "thread-safe" in the sense that it sets a VM-global flag. This forces every class with a finalizer to defend against the finalization of live objects!
简而言之,这是一种危险的方法,它不会直接处理 OP 担心的那种资源。
关于java - C中exit(0)和Java中System.exit(0)的实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181860/
我相信所有这些(甚至是 die() 或 die(0))都是相同的。如果它们不相同,那么哪个更适合成功退出脚本?如果它们相同,是否有任何首选标准表明脚本成功完成?我倾向于使用 exit;. 编辑:所有答
我想知道Java中以下之间的区别 System.exit(0);System.exit(-1);System.exit(1); 我什么时候必须适本地使用上面的代码?
我注意到 Powershell 中有一个奇怪的行为。有两个 .ps1 文件: main.ps1: echo "running exit.ps1" $myexitcode = & ".\exit.p
Anylogic Process Modeling Library 中很少有像“Source”这样的 block 具有“On exit”和“On at exit”这样的操作。两者有什么区别? 我试图创
所以我有这个 Bash 脚本: #!/bin/bash PID=`ps -u ...` if [ "$PID" = "" ]; then echo $(date) Server off: no
(gdb) info symbol exit exit in section .text of /lib64/libc.so.6 (gdb) info symbol _exit _exit in se
如果我想启动一个简单的应用程序,几周前我使用它没有出现错误,我会收到错误消息。那是他的错误描述: Launching lib\main.dart on SM J530F in debug mode..
这个问题已经有答案了: Using Platform.exit() and System.exit(int) together (3 个回答) 已关闭 5 年前。 这里有人建议使用后者。我是java新
我的理解是,在 bash 中,一个普通的 exit 将完成一个具有最后一个命令的退出状态的脚本。但我也看到有人使用 exit $? 并且当我建议它具有相同的行为时被质疑。 这两个脚本之间有什么有意义的
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
exit和exit有什么区别!在 ruby 中? 最佳答案 一些事情: 退出处理程序以“退出”形式而非“退出!”形式运行。这意味着分配给“清理”的任何代码都不会使用“退出!”运行 “退出状态”在“退出
我们有一堆 .bat构建脚本由基于 PowerShell 的 GitLab 运行程序调用,这些脚本最近从以下内容重构: program args if !errorlevel! neq 0 exit
我想关闭具有指定返回码的 javafx 应用程序。浏览 SO 上的答案,我发现了以下成语: Platform.exit(); System.exit(0); 例如这里: Stop threads be
exit 和 C++ 中的 std::exit 有什么区别?我已经对其进行了研究,但我找不到任何东西。 这两个代码有什么区别: 1: if(SDL_Init(SDL_INIT_EVERYTHING)
我需要一个替代方法来在线程函数内终止 python 脚本。我的意图是在客户端输入 0 时终止服务器...这是否不起作用,因为线程尚未终止?这是我的代码: socket = socket.socket(
我想在崩溃后重新启动应用程序。我正在使用下面的代码来执行该任务。 Intent mStartActivity = new Intent(HomeActivity.this, SplashScreen
在Delphi中,你可以退出一个函数并给它一个返回值,这与C/C++/Java/C#等中的return关键字非常相似 Exit(1); 但是,我通常会写这样的内容: Result := 1; Exit
我想知道是否有任何方法可以处理浏览器退出事件。 例如,我想在用户单击交叉退出或关闭浏览器时发送查询。 最佳答案 我想我已经找到了解决办法。我没有在 IE 上测试过它,但它似乎在 Firefox 上运行
我在 Archlinux 的 mkinitcpio 脚本中找到了以下代码片段。 cleanup() { if [[ $workdir ]]; then # when PRESE
我使用以下代码计算数据帧所有行之间的余弦相似度: from pyspark.ml.feature import Normalizer from pyspark.mllib.linalg.distrib
我是一名优秀的程序员,十分优秀!