这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能。
文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码。
Java编程语言中编程的最甜蜜之处之一是对象取消分配的自动处理。
在Java世界中,这通常被称为垃圾收集。
基本上,这意味着开发人员不必担心取消分配其代码分配的对象。
开发人员使用完该对象后,他便可以使对该对象的所有引用无效,然后该对象就有资格进行垃圾回收。
但是,垃圾收集有其另一面。
与C / C ++中的编码器完全控制内存分配和取消分配(malloc,free,new,delete等)不同,在Java中,开发人员对对象的取消分配过程没有明显的控制。
JVM管理未使用对象的垃圾回收过程,而运行一个垃圾回收周期实际上取决于JVM的想法。
确实,有诸如System.gc()或Runtime.getRuntime()。gc()之类的方法调用,它们指示将运行垃圾回收,但是这些方法仅用于提醒JVM:“也许您需要运行垃圾现在收集,只是一个建议,没有压力!”。
JVM被完全授权忽略这些请求,并且被编码为仅在真正合适时运行垃圾回收。
因此,在实践中,始终建议开发人员不要相信System.gc()或Runtime.getRuntime()。gc()将触发完整的垃圾回收,从而不要构建其程序逻辑。
无可否认,自动垃圾收集为提高开发人员的生产力做了多少工作。
但是,在某些极端情况下,垃圾回收不足以保持“干净”堆,其中没有未使用的对象。
尤其是当对象处理由底层操作系统提供服务的某种形式的本机资源时。
这些对象包括但不限于IO流,数据库连接等。对于此类对象,开发人员必须明确释放资源。
通常,这些是通过try-catch块完成的。
让我们看一个小示例,该示例在完成流处理之后关闭InputStream:
InputStream in = null;
try
{
in = new FileInputStream(new File("test.txt");
//do stuff with in
}
catch(IOException ie)
{
//SOPs
}
finally
{
//do cleanup
}
以上看起来不错,干净;
但是,一旦我们尝试通过finally块中的in.close()关闭输入流,就需要用try-catch块将其包围,该块捕获已检查的异常IOException。
因此,代码示例将转换为:
InputStream in = null;
try
{
in = new FileInputStream(new File("test.txt"));
//do stuff with in
}
catch(IOException ie)
{
//SOPs
}
finally
{
try
{
in.close();
}
catch(IOException ioe)
{
//can't do anything about it
}
}
现在,上面的代码看起来很肿,并且在不同层次结构中有多种检查异常,我们需要更多的catch子句。
很快,代码变得冗长且难以维护,更不用说代码失去了其最初的简洁外观,甚至吸引了人们的目光。
但是有个好消息。
Java 7通过新的try-catch块使此操作更容易。
使用此功能,我们可以避免finally块本身。
这是我们的做法:
try(InputStream in = new FileInputStream(new File("test.txt"))
{
//do stuff with in
}
catch(IOException ie)
{
//SOPs
}
上面的代码块将自己进行清理。
通过引入新接口java.lang.AutoCloseable使其成为可能,该接口定义了单个方法void close()throws Exception 。
使用上述语法,可以自动关闭()d此接口子类型的对象。
以上功能适用于实现AutoCloseable接口的任何类的对象。
最好的部分是,即使我们在try()块中初始化了多个AutoCloseable实例,它也会为所有对象调用close()方法,即使某个对象上的某些close()方法抛出任何异常。
在处理异常时,如果在try块以及隐式finally块(实际上已关闭AutoCloseable的块)中存在任何IOException,则抛出的异常将是在try块中抛出的异常而不是隐式的finally块中的那个。
但是,我们仍然可以从Throwable.getSuppressed()方法中获取隐式finally块异常的详细信息,该方法作为Java 7中的新方法添加。
我认为自动资源管理功能或ARM是Java 7的重要补充。
编码愉快!
参考: Java HotSpot博客上的JCG合作伙伴 Swaranga提供了Java 7中具有自动资源管理功能的垃圾收集 。
相关文章 :
翻译自: https://www.javacodegeeks.com/2011/08/gc-with-automatic-resource-management.html