我一直听说在Java中使用的资源必须在使用后关闭,否则这些资源会被耗尽。对于使用极少资源(如1或2个文件读取器/缓冲读取器)的小程序来说,这是否真的值得关注呢?JVM不会跟踪程序使用的资源吗?程序退出后,JVM不会释放所有这些资源吗?如果不是,为什么JVM即使在程序退出后仍然保留这些资源阻塞呢?
这些资源确实在正常的JVM退出时关闭。然而,您可能不知道您的方法是如何被调用的,并且它可能被另一个程序员外部调用2000次,这些资源将开始堆积。
此外,某些非主流操作系统可能会遇到以下问题:如果JVM异常停止(通过Runtime.getRuntime().halt()
或JVM内部发生重要错误/不一致性),则资源可能仍然保持打开状态(由于清理代码未运行),直到重新启动或手动释放为止。即使在主流系统上,套接字也可能保持打开状态多达几分钟。
当进程退出时,JVM也会退出。此时操作系统将释放之前由JVM使用的所有资源,包括内存、文件句柄等。
在JVM进程退出后,释放分配给该进程的资源的不是JVM,而是操作系统。