一文让你读懂JAVA.IO、字符编码、URL和Spring.Resource( 五 )

//自动关闭的资源类使用示例try (YSOAPConnection soapConnection=YSOAPConnection.open(soapConnectionFactory)){SOAPMessage soapResponse = soapConnection.call(request, endpoint);...//数据操作} catch (Exception e) {log.error(e.getMessage(), e);...}

  • lombok注解@Cleanup,对象生命周期结束时会调用public void close();对象需实现AutoCloseable接口
import lombok.Cleanup;@Cleanup// @Cleanup的使用YSOAPConnection soapConnection=YSOAPConnection.open(soapConnectionFactory)12 资源不关闭,会导致什么最坏的结果
  • JDK的原生资源类不关闭,它也不会永远存在 。JVM会借助finalize自动关闭它,例如FileInputStream
//FileInputStream.java - JDK8//jdk8的FileInputStream重写了finalize,保证对象回收前开启的资源被关闭protected void finalize () throws IOException {if (guard != null) {guard.warnIfOpen();}if ((fd != null) && (fd != FileDescriptor.in)) {close();}}
  • 在JDK9后,用Cleaner机制代替了finalize机制;Cleaner机制自动回收的对象同样需要实现AutoCloseable接口;Cleaner是基于PhantomReference实现的;对实现细节感兴趣的同学,可自行查阅下相关文档
  • 但是使用JDK的提供的资源关闭机制的,那么资源的关闭比手动关闭时要延后很长时间的 。据测试,使用try-with-resources关闭资源,并让垃圾回收器回收它的时间在12纳秒 。而使用finalizer机制,时间增加到550纳秒
  • 不及时关闭资源,就会占用资源,影响其他线程的执行;比如linux的文件资源,linux进程默认能打开的最大文件数是1024(有的是2048,此数值是可配置的);如果一个线程持有十几个文件资源,还要等550纳秒用finalizer机制释放资源,同进程的其他线程都等到花谢了

作者:clswcl
链接:https://juejin.im/post/6856266775022174222
来源:掘金

【一文让你读懂JAVA.IO、字符编码、URL和Spring.Resource】


推荐阅读