扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
忘记对资源进行分配和释放
说明:所谓资源是指CPU,内存,文件等系统资源。系统资源是有限的,并且会被多个过程所调用。因此,在调用资源之前,第一件事情是必须分配资源。而对已经分配的资源,如果使用之后不加以释放,势必造成资源泄漏,直接导致深度Bug,性能问题,所以必须加以充分的注意。
经常发生的一件事是,在进行文件操作时,打开的文件必须及时关闭。无论是二进制流还是字符流,一旦在生成流时被打开,直到Close方法被调用之前,流所使用的资源都处于被占用的状态。所以,当资源已经不需要时,一定不要忘记调用Close方法。对于打开的文件,在finally中调用close方法,可以确保在发生异常时被关闭。
另外,不仅仅是针对文件,应该保持这样的警惕,即对有效资源(可能被共用)不可以长期占用。比如说下页中举的例子,数据库资源(java.sql.Connection,java.sql.Statement等)是典型的必须避免占用的资源。因此而引起的问题是经常发生的。
例子 ① 可能发生DB资源泄露的典型代码
… Connection con = null; PreparedStatement ps = null; Try{ Class.forName(“指定DB驱动”); //Load DB DriverManager con = Drivermanager.getConnection(“DB URL”); ps = con.prepareStatement(运行用SQL“); // 某种处理 ps.close(); //ERROR: 处理到这里之前如果发生异常,将无法关闭 con.close(); // ERROR: 处理到这里之前如果发生异常,将无法关闭 }catch(ClassNotFoundException e1){ e1.printStackTrace(); }catch(SQLException e2){ e2.printStackTrace(); } 例子 ② 用finally确实关闭DB资源 同①背景相同的代码 //某种处理 }catch(ClassNotFoundException e1){ e1.printStackTrace(); }catch(SQLException e2){ e2.printStackTrace(); }finally{ if( ps != null ){ try{ ps.close(); //OK:即使在处理中发生异常也可以保证关闭。 }catch(SQLException e3){ e3.printStackTrace(); } if( con != null){ try{ con.close(); //OK:即使在处理中发生异常也可以保证关闭。 }catch(SQLException e4){ e4.printStackTrace(); } } } |
Java语言中有垃圾回收机制,在Java的Heap上分配的对象,一般来说是不需要显式
地释放的。但是,被释放的资源仅是垃圾回收处理中被判断为“程序已经不使用”的部分。
详细内容可以参考该文章的补充5。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者