<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 1, 文章 - 0, 評(píng)論 - 10, 引用 - 0
    數(shù)據(jù)加載中……

    經(jīng)典的IO代碼為什么有資源泄漏?

    最近在開(kāi)發(fā)中,使用到IO操作進(jìn)行反序列化操作,使用了在各種資料中常見(jiàn)的關(guān)于IO操作的經(jīng)典代碼,在自測(cè)和測(cè)試人員的測(cè)試中都沒(méi)有發(fā)現(xiàn)任何問(wèn)題!
    代碼如下

    public ?Object?readObject(File?file)
    ????{
    ????????Object?o?
    = ? null ;
    ????????
    if ?(file.exists())
    ????????{
    ????????????ObjectInputStream?ois?
    = ? null ;
    ????????????
    try
    ????????????{
    ????????????????ois?
    = ? new ?ObjectInputStream( new ?FileInputStream(file));
    ????????????????o?
    = ?ois.readObject();
    ????????????}
    ????????????
    catch ?(Throwable?e)
    ????????????{
    ????????????????e.printStackTrace();
    ????????????}
    ????????????
    finally
    ????????????{
    ????????????????
    if ?(ois? != ? null )
    ????????????????{
    ????????????????????
    try
    ????????????????????{
    ????????????????????????ois.close();
    ????????????????????}
    ????????????????????
    catch ?(IOException?e)
    ????????????????????{
    ????????????????????????e.printStackTrace();
    ????????????????????}
    ????????????????}
    ????????????}????????????
    ????????}
    ????????
    return ?o;
    ????}

    忽然一天測(cè)試人員聯(lián)系我說(shuō)這部分代碼導(dǎo)致系統(tǒng)無(wú)法啟動(dòng),原因僅僅是因?yàn)樽屧摬糠执a不斷的處理一個(gè)為序列化文件!
    我仔細(xì)分析一下代碼,沒(méi)有問(wèn)題呀,反序列化失敗就直接關(guān)閉了ois對(duì)象,不可能造成資源泄漏,于是用單步跟蹤的方式
    查看處理非法文件的詳細(xì)情況:
    1、創(chuàng)建FileInputStream 沒(méi)有問(wèn)題
    2、創(chuàng)建ObjectInputStream失敗 沒(méi)有問(wèn)題
    3、進(jìn)入catch塊,打印堆棧 沒(méi)有問(wèn)題
    4、進(jìn)入finnaly塊,if (ois != null)為false,這時(shí)意識(shí)到出問(wèn)題了
    原來(lái)創(chuàng)建FileInputStream成功,此時(shí)已經(jīng)申請(qǐng)了資源,但在后續(xù)創(chuàng)建ObjectInputStream時(shí)失敗,但此時(shí)又沒(méi)有保存FileInputStream
    的引用,無(wú)法釋放資源,最終導(dǎo)致了資源泄漏??磥?lái)在以后的IO的編程中一定要保存基本流的引用,否則在類似上面的情況
    在轉(zhuǎn)換流失敗后,無(wú)法安全的釋放資源!
    下面為修改后的代碼:

    ?public?Object?readObject(File?file)
    ????{
    ????????Object?o?
    =?null;
    ????????
    if?(file.exists())
    ????????{
    ????????????FileInputStream?fis?
    =?null;
    ????????????ObjectInputStream?ois?
    =?null;
    ????????????
    try
    ????????????{
    ????????????????fis?
    =?new?FileInputStream(file);
    ????????????????ois?
    =?new?ObjectInputStream(fis);
    ????????????????o?
    =?ois.readObject();
    ????????????}
    ????????????
    catch?(Throwable?e)
    ????????????{
    ????????????????e.printStackTrace();
    ????????????}
    ????????????
    finally
    ????????????{
    ????????????????
    if?(fis?!=?null)
    ????????????????{
    ????????????????????
    try
    ????????????????????{
    ????????????????????????fis.close();
    ????????????????????}
    ????????????????????
    catch?(IOException?e)
    ????????????????????{
    ????????????????????????e.printStackTrace();
    ????????????????????}
    ????????????????}
    ????????????}????????????
    ????????}
    ????????
    return?o;
    ????}


    posted on 2006-03-24 21:47 mooninwell 閱讀(1385) 評(píng)論(10)  編輯  收藏 所屬分類: Java原創(chuàng)

    評(píng)論

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    有一點(diǎn)疑問(wèn):
    在文件存在的情況下,在什么情況下會(huì)出現(xiàn)fis創(chuàng)建成功而ois創(chuàng)建失敗?
    另:finally下還是要加上關(guān)閉ois的為好。
    2006-03-25 09:14 | 阿偉的技術(shù)小巢

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    收到,謝謝分享
    2006-03-25 10:30 | flyfoxs

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    頻繁調(diào)用這個(gè)方法OPEN/CLOSE STREAM也不是一個(gè)好的做法吧?如果一直使用一個(gè)ObjectInputStream/ObjectOutputStream就要小心內(nèi)存泄漏。
    2006-03-25 12:03 | 非魚(yú)

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    只要文件存在并且讀的權(quán)限就可以成功創(chuàng)建fis,但將fis轉(zhuǎn)換為ois則文件必需滿足序列化的文件格式。至于ois的關(guān)閉,從理論上關(guān)閉了基本流fis就不會(huì)存在泄漏,而且在實(shí)際測(cè)試中,window、solaris、aix系統(tǒng)下都沒(méi)有問(wèn)題@阿偉的技術(shù)小巢
    2006-03-25 20:37 | mooninwell

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    資源和io流是一一對(duì)應(yīng)的,而且良好的編程習(xí)慣應(yīng)該是對(duì)獨(dú)占資源應(yīng)該盡快的釋放,因此處理邏輯應(yīng)該和從資源中獲取信息相分離@非魚(yú)
    2006-03-25 20:40 | mooninwell

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    @mooninwell

    因OIS/OOS使用HANDLETABLE保存被序列化對(duì)象的引用,實(shí)踐中應(yīng)注意調(diào)用OOS.reset()方法,否則在大量對(duì)象序列化時(shí)會(huì)發(fā)生ML。
    2006-03-25 21:44 | 非魚(yú)

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    @非魚(yú)
    以前工作很少用到IO,特別是序列化部分!今天在你的提醒下,看了一下oos的實(shí)現(xiàn),發(fā)現(xiàn)一直使用一個(gè)oos/ois的確存在ML的可能性,但我認(rèn)為這中使用情況在實(shí)際應(yīng)用中很少發(fā)生。另:發(fā)現(xiàn)OOS的close方法內(nèi)也包含了reset方法的實(shí)現(xiàn),但ois沒(méi)有實(shí)現(xiàn)reset方法,會(huì)拋異常。
    2006-03-26 00:45 | mooninwell

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    用InputStream代替File作為參數(shù)豈不更好?
    2006-03-27 09:49 | hubeicaolei

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    同意樓上的
    2006-03-27 10:07 | nkoffee

    # re: 經(jīng)典的IO代碼為什么有資源泄漏?  回復(fù)  更多評(píng)論   

    @mooninwell

    OIS沒(méi)有實(shí)現(xiàn)reset()方法,是因?yàn)樗鼜腎NPUT流中讀取TC_RESET標(biāo)志來(lái)RESET HANDLE TABLE。這樣可以保證通過(guò)網(wǎng)絡(luò)SERIALIZATION時(shí)不出問(wèn)題。
    2006-03-28 00:01 | 非魚(yú)

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品一区二区三区四区乱码| 120秒男女动态视频免费| 亚洲乳大丰满中文字幕| 久久久久久毛片免费播放| 亚洲午夜理论片在线观看| avtt亚洲天堂| 91麻豆国产免费观看| 精品国产亚洲第一区二区三区| 亚洲va中文字幕无码久久 | 亚洲精品中文字幕| 亚洲人成人网站在线观看| 久久国产乱子伦免费精品| 爱爱帝国亚洲一区二区三区| 国产亚洲人成无码网在线观看| 成人免费无码视频在线网站| 国产免费人成视频在线播放播| 亚洲国产精品线观看不卡| 亚洲国产婷婷香蕉久久久久久| 1000部拍拍拍18免费网站| 亚美影视免费在线观看| 亚洲精品一二三区| 亚洲av日韩av天堂影片精品| 又大又黄又粗又爽的免费视频| 91大神免费观看| eeuss免费天堂影院| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 日本在线看片免费人成视频1000| 国产成人亚洲精品电影| 亚洲在成人网在线看| 亚洲一区二区三区影院| 四虎影视免费永久在线观看| 成年人网站免费视频| 久久国产精品成人免费| 五级黄18以上免费看| 国产亚洲精品一品区99热| 好爽好紧好大的免费视频国产| 亚洲美女视频免费| 久久国产乱子免费精品| 男女一边桶一边摸一边脱视频免费 | 亚洲欧洲日本精品| 亚洲国产精品无码av|