这篇文章简要概述了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中具有自动资源管理功能的垃圾收集 。

相关文章 :
  • Java 7:尝试资源
  • 速览Java 7 MethodHandle及其用法
  • Java Fork / Join进行并行编程
  • JDK中的设计模式
  • Java最佳实践

翻译自: https://www.javacodegeeks.com/2011/08/gc-with-automatic-resource-management.html

具有Java 7中自动资源管理功能的GC相关推荐

  1. java自动gc_具有Java 7中自动资源管理功能的GC

    java自动gc 这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能. 文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码. Java编程语言中编程的最 ...

  2. JAVA 实现FTP功能_在Java程序中实现FTP功能

    本文来演示在JAVA编程中实现FTP功能的三个重要部分内容的源程序: FtpList部分是用来显示FTP上的文件; GetButton部分为从FTP下传一个文件; PutButton部分为向FTP服务 ...

  3. Java 11中的新功能和API详解系列1

    Java 11中的新功能和API详解系列1 2018.9.27 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. JDK 11在语言语法方面有一个小改动,增加了相当数量的新API,以及 ...

  4. java jdk12_JDK 12:Java 12中的新功能

    java jdk12 基于Java SE(标准版)12的Java开发套件12的生产版本现已发布. Oracle可以为Linux,Windows和MacOS提供JDK 12构建. [ Java JDK ...

  5. 垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)

    4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性. 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,特别是因为在该 ...

  6. java/js中语音提醒功能的实现

    我们在java开发中,经常遇到实现语音提示的功能.目前市场上有许多成熟的语音提示的产品,并提供接口供用户使用.所以我们没有必要费心去书写功能代码,只需要调用接口即可.需要注意的是,很多接口的每天都会有 ...

  7. 用java写个自动下单功能

    自动下单功能需要和具体的电商平台进行交互,而每个平台的接口都可能不同,因此实现起来比较复杂.这里提供一种基于Java实现自动下单的思路: 首先需要选择要操作的电商平台,并查找该平台的API文档或使用第 ...

  8. 围棋打谱软件中自动提子功能的实现,C/C++源码

    本文首发地址:http://blog.csdn.net/liigo/archive/2009/09/22/4582018.aspx 转载请注明出处:http://blog.csdn.net/liigo ...

  9. java上传一段语音_在java程序中加入语音功能,例如给段字符串“A101”,就能发出声音,请大家帮帮忙,谢谢...

    展开全部 为应62616964757a686964616fe59b9ee7ad9431333335303530用程序加上语音能力有什么好处呢?粗略地讲,是为了趣味,它适合所有注重趣味的应用,比如游戏. ...

最新文章

  1. python机器学习之分类器
  2. YunYang1994/tensorflow-yolov3 ValueError: cannot reshape array of size 43095 into shape (6) 解决办法
  3. python基础题面试_python常见面试题
  4. 分类素材(part5)--大话Python机器学习(中)
  5. sequence——强行推式子+组合意义
  6. 学习动态性能表(19)--v$undostat
  7. C++_类和对象_对象特性_构造函数和析构函数---C++语言工作笔记040
  8. Unity3D之UGUI基础4:Button按钮
  9. 人工智能是一个骗局?
  10. 大数据平台以及一些核心组件介绍
  11. postgresql 日期相减
  12. 借助 Lucene.Net 构建站内搜索引擎(下)
  13. 黑客入侵16进制密码_密码与密码黑客如何诱骗您入侵您的详细信息
  14. oracle部门总工资的函数,Oracle分析函数
  15. 简单谈谈ActiveMQ的两种消费方式
  16. 怎样设置excel中自动调整行高、列宽?
  17. Mac电脑技巧:如何将Sublime Text设置成中文版
  18. BZOJ 3875 Ahoi2014 骑士游戏
  19. 什么是国网综能服务集团虚拟电厂?——安科瑞 严新亚
  20. IntelliJ IDEA插件开发指南(二)

热门文章

  1. selenium自动化测试_49自动化测试中最常见的Selenium异常
  2. throwable_您想了解的所有Throwable
  3. 第三方工具监控java进程_前9个免费的Java进程监视工具以及如何选择一种
  4. javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示
  5. prima evb_用Priam设置Cassandra
  6. jax-rs jax-ws_在JAX-RS中处理异步请求中的超时
  7. 使用JDK的密码流的加密怪癖(以及如何做)
  8. 使用测微计收集应用程序指标
  9. c++返回指针时候注意提防_编写干净的测试–提防魔术
  10. 具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置