Java应用程序终止时是否释放了其使用的资源?

Java应用程序终止时是否释放了其使用的资源?,java,memory-management,connection,Java,Memory Management,Connection,Java应用程序可能会使用IO流、套接字或数据库连接,当不再需要这些连接时,应该关闭这些连接 但是,可以终止应用程序(例如,通过终止进程)。在这种情况下,是否会释放所有已使用的资源?谁将释放它们:OS还是JRE?JVM将在终止时释放所有活动资源;然而,这并不能确保另一端也会释放资源,因此显式关闭资源符合每个程序员的最佳利益 Java7中存在一种显式关闭流的替代方法,称为try-resource“语句”,它相当于在try块之后关闭finally块中的资源。有关这方面的更多信息,请参见。如果您的软件

Java应用程序可能会使用IO流、套接字或数据库连接,当不再需要这些连接时,应该关闭这些连接


但是,可以终止应用程序(例如,通过终止进程)。在这种情况下,是否会释放所有已使用的资源?谁将释放它们:OS还是JRE?

JVM将在终止时释放所有活动资源;然而,这并不能确保另一端也会释放资源,因此显式关闭资源符合每个程序员的最佳利益


Java7中存在一种显式关闭流的替代方法,称为try-resource“语句”,它相当于在try块之后关闭
finally
块中的资源。有关这方面的更多信息,请参见。

如果您的软件不能正确管理资源,将发生以下情况:

  • 在运行时:如果打开的流看起来未使用(在垃圾收集周期中),JVM将在程序运行期间尝试关闭这些流
  • 在程序的终止点:JVM应该关闭程序留下的各种打开的流
  • 在JVM的进程终止点:当JVM存在时,操作系统将负责释放JVM未正确释放的任何内容(希望如此,或者此操作系统有一些严重问题…)
正如瓦肯所提到的,显然,所有这些都不能确保他们在另一端得到妥善处理

请注意,第三个要点是一个相当通用的东西:大多数操作系统都会处理这个问题,它与Java平台的内部结构无关。它是关于操作系统自己管理其进程和资源的

更多信息 另见:

  • ,也在StackOverflow上
  • ,在IBM开发者系列上

我认为它们将被用于访问资源的库释放,如果这不发生,那么JRE将被释放。这是一个非常广泛的问题。当进程终止时,JVM初始化的任何内容都将被释放,但这并不保证连接的另一端(例如)将释放它们的资源。