Java 不';JVM释放程序退出时程序员未显式关闭的所有资源

Java 不';JVM释放程序退出时程序员未显式关闭的所有资源,java,jvm,Java,Jvm,我一直听说java中的资源在使用后必须关闭,否则这些资源将耗尽。对于使用很少资源(如1或2个文件读取器/缓冲读取器等)的小程序来说,这真的是一个值得关注的问题吗?JVM不跟踪程序正在使用的资源吗?一旦程序退出,它不会释放所有这些资源吗?如果不是,为什么JVM即使在程序退出后也会阻止这些资源?在正常的JVM退出时,这些资源确实是关闭的。然而,您可能并不总是知道您的方法是如何被调用的,并且它可能会被另一个程序员在外部调用2000次,这些资源将开始堆积起来 此外,某些非主流OSs可能会遇到这样的问题:

我一直听说java中的资源在使用后必须关闭,否则这些资源将耗尽。对于使用很少资源(如1或2个文件读取器/缓冲读取器等)的小程序来说,这真的是一个值得关注的问题吗?JVM不跟踪程序正在使用的资源吗?一旦程序退出,它不会释放所有这些资源吗?如果不是,为什么JVM即使在程序退出后也会阻止这些资源?

在正常的JVM退出时,这些资源确实是关闭的。然而,您可能并不总是知道您的方法是如何被调用的,并且它可能会被另一个程序员在外部调用2000次,这些资源将开始堆积起来


此外,某些非主流OSs可能会遇到这样的问题:如果JVM异常停止(通过
Runtime.getRuntime().halt()
或JVM内的重大内部错误/不一致),那么资源可能会保持打开状态(由于清理代码未运行),在重新启动或手动释放之前可能无法使用。即使在主流系统上,套接字也可以保持打开状态几分钟。

当进程退出时,JVM退出。然后,操作系统将释放JVM以前使用的所有资源。这包括内存、文件句柄等。

不是JVM,而是操作系统在JVM进程退出后释放分配给它的资源。

小程序可能存在资源泄漏,因为操作系统可能在进程结束后处理资源泄漏。但这被认为是不可移植的


更大的问题是运行JVM的操作系统不知道如何释放远程机器上分配的资源,或者甚至不知道是否有分配的资源需要释放。

“操作系统将释放JVM以前使用的任何资源。这包括内存、文件句柄等。”在非主流/嵌入式操作系统上不保证。事实上,我花了大约一周的时间追踪了一次。一些资源,如开放式套接字,在JVM退出后可以保持打开状态长达几分钟。@BimaleshJha不是套接字,而是端口。当进程退出时,大多数操作系统都会关闭套接字。在套接字关闭后,TCP端口可以在TIME_WAIT状态下挂起几分钟。在非主流/嵌入式OSs上不保证。我知道有一个问题,java应用程序使用JNI将其链接到dll。dll以某种方式保存错误,System.exit(0)会停止并删除所有线程,但java.exe会继续运行并占用它在活动时使用的内存,没有cpu。。。有时jvm会崩溃。如果jvm异常崩溃(或停止),则某些清理代码(如close()流),即使存在,也可能无法执行,从而使资源悬而未决,任由主机操作系统摆布。@GerritCap是的,无论有没有JNI,这都是一门不精确的科学。教训:关闭你的单缓冲阅读器。