JVM不会释放程序员在程序退出时未明确关闭的所有资源吗



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

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

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

当进程退出时,JVM 退出。然后发生的情况是,操作系统将释放 JVM 以前使用的任何资源。这包括内存、文件句柄等内容。

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

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

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

最新更新