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

java自动gc

这篇文章简要概述了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}
}
现在,上面的代码看起来很ated肿,并且在不同层次结构中有多种检查异常,我们需要更多的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自动gc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET 程序优化

一、SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直到数据读完才可close掉于数据库的连接 (SqlDataReader 读数据…

python pandas excel数据处理_Python处理Excel数据-pandas篇

Python处理Excel数据-pandas篇非常适用于大量数据的拼接、清洗、筛选及分析在计算机编程中,pandas是Python编程语言的用于数据操纵和分析的软件库。特别是,它提供操纵数值表格和时间序列的数据结构和运算操作。它的名字衍生自术语“面板数据”(panel dat…

Proe Top-Down设计演示

前段时间有网友问我,proe 里面有没有装配设计中当某一零件尺寸需要修改时, 与其相关的零件尺寸都需要随之做相应改变的法子。我认为top-down是很好的选择。 下面介绍一下top-down的理论: 就按照产品的功能要求先定义产品架构并考虑组件与零件…

spring和maven_具有Spring和Maven教程的JAX–WS

spring和mavenSpring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的Web服务(适用于Java EE 5环境) 导…

python映射实体类_【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)...

紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok;OK,准备工作:首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包&#xff0c…

Union-SQL Server学习笔记

1、简单笔记 数据库查询语句中,通过UNION组合查询语句,可以将两个或更多查询的结果组合为单个结果集,该结果集包含组合查询中的所有查询的全部行。 利用UNION语句可以实现将不同数据表中符合条件,不同列种的数据信息,显…

从Java集成Active Directory

首先,您将需要设置Active Directory,以便可以运行和测试代码。 如果(像我一样)没有一台装有Windows Server的计算机,那么即使在Mac OSX上,也可以通过这种方法设置Active Directory。 您要做的第一件事是在…

编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装

mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到cmake来进行编译了,编译的过程没有本质mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到c…

云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题

在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发到一个新的高度。 根据我们的实测…

Cobertura和Sonar 5.1的问题

最近,我有些麻烦,试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西: Gmetrics,Codenarc和Cobertura 。 对于Sonar数据库,我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个&#xf…

centos6.4 卸载mysql_彻底删除MYSQL-CENTOS

yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysql软件:rpm -qa|grep mysql有的话继续删除RPM方式安装MySQL5.6a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除…

ARIMA模型建模步骤

ARIMA模型建模步骤一. 绘制时序图判断序列是否有明显的趋势或周期二. 单位根检验检验方法ADFDFGLSPPKPSSERSNP前三种有有关常数与趋势项假设,应用不方便,建议少用。后三种是去除原序列趋势后进行检验,应用方便。原假设6种方法除KPPS外&#x…

WT2605C音频蓝牙语音芯片:单芯片实现蓝牙+MP3+BLE+电话本多功能应用

在当今的电子产品领域,多功能、高集成度成为了一种趋势。各种产品都需要具备多种功能,以满足用户多样化的需求。针对这一市场趋势,唯创知音推出了一款集成了蓝牙、MP3播放、BLE和电话本功能的音频蓝牙语音芯片——WT2605C,实现了单…

rabbitmq订单模块_RabbitMQ播放模块! 构架

rabbitmq订单模块RabbitMQ提供了具有可预测且一致的吞吐量和延迟的高可用性,可伸缩和便携式消息传递系统。 RabbitMQ是AMQP (业务消息传递的开放标准)的领先实现 ,并且通过适配器支持XMPP,SMTP,STOMP和HTTP…

mysql as join_mysql as 别名与 join 多表连接语法

在MySQL中,使用AS关键字为字段、表、视图取别名,或者不用as,用空格隔开:SELECT (SELECT id a,title b FROM blog c limit 1)d;使用字段别名,可以帮助我们有效的组织查询的输出结果。---------------------------------…

'固定' table宽度,走起!

为了让表格能够填充屏幕(剩余空白区域),常将其宽度属性定义为:100%,单元格也是用百分数来定义。 但这样就会出现问题: 如果单元格中的文本超过宽度限制,就会自动换行,高度自动增高,导致整个表格…

python中view的用法_APIview使用

ModelVIewSet 是对 APIView 封装ModelSerializer 是对 Serializer1.1 在user/urls.py中添加路由urlpatterns [ path(apiview/, views.UserInfoViewSet.as_view()), ]1.2 创建user/serializers.py写序列化器serializers.ModelSerializer 和 serializers.Serializer field参数…

HDU 1597 find the nth digit (二分查找)

二分查找 1 #include<stdio.h>2 __int64 a[65555];3 void init()4 {5 a[0]0;6 for(int i1;i<65537;i)7 {8 a[i]a[i-1]i;9 } 10 } 11 int search(int n,int low,int high) 12 { 13 int temp(lowhigh)/2; 14 if(na[temp]) return temp-…

java 注解应用技巧_改善Java应用程序性能的快速技巧

java 注解应用技巧曾经遇到过性能问题吗&#xff1f; 我也是。 如果我的经理再喊一次“ faaaaster”&#xff0c;我一生都会有听力障碍。 顺便说一句&#xff0c;我能听到所有噪音中的德语发音吗&#xff1f; ;-) 您可以相信仍然有人无知地在谈论垃圾收集器&#xff08;得到它吗…

字符串系列函数(不断跟新)

1.sprintf,sprintf_s sprintf(char* buffer, const char* format, [argument]); vs下需要加上_CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main() {char name[1];int input 9099;sprintf(name,"%d", input);system("pause&qu…