7

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

4

4 回答 4

6

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

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

于 2013-09-06T09:37:25.053 回答
3

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

于 2013-09-06T09:37:43.263 回答
3

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

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

于 2013-09-06T10:46:40.873 回答
2

不是 JVM 而是 OS 在 JVM 进程退出后释放分配给它的资源。

于 2013-09-06T09:39:14.503 回答