posts - 16, comments - 6, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          java.io.IOException: Too many open files

          Posted on 2009-08-26 11:58 java-flying 閱讀(10118) 評論(0)  編輯  收藏
          今天后臺服務器(Linux) 在轉音源的時候 報java.io.IOException: Too many open files
          在網(wǎng)上查了一些資料 記錄如下:

          打開的文件過多,一般來說是由于應用程序對資源使用不當造成,比如沒有及時關閉Socket或數(shù)據(jù)庫連接等。但也可能應用確實需要打開比較多的文件句柄,而系統(tǒng)本身的設置限制了這一數(shù)量。

          異常 1 
          java.net.SocketException: Too many open files

              at java.net.PlainSocketImpl.accept(Compiled Code)
              at java.net.ServerSocket.implAccept(Compiled Code)
              at java.net.ServerSocket.accept(Compiled Code)
              at weblogic.t3.srvr.ListenThread.run(Compiled Code)
           

          異常 2
          java.io.IOException:打開的文件過多

              at java.lang.UNIXProcess.forkAndExec(Native Method)
              at java.lang.UNIXProcess.(UNIXProcess.java:54)
              at java.lang.UNIXProcess.forkAndExec(Native Method)
              at java.lang.UNIXProcess.(UNIXProcess.java:54)
              at java.lang.Runtime.execInternal(Native Method)
              at java.lang.Runtime.exec(Runtime.java:551)
              at java.lang.Runtime.exec(Runtime.java:477)
              at java.lang.Runtime.exec(Runtime.java:443)

          ...

          第一個異常在錯誤影響到基礎 TCP 協(xié)議時拋出,而第二個異常則在錯誤影響到 I/O 操作時拋出。

          文件打開數(shù)過多最壞的情況可以使系統(tǒng)崩潰,到時候只能是重起服務器了。

          原因:   

              操作系統(tǒng)的中打開文件的最大句柄數(shù)受限所致,常常發(fā)生在很多個并發(fā)用戶訪問服務器的時候.因為為了執(zhí)行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏.

          解決: 

          • 盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄.
          • java的垃圾回收不能關閉網(wǎng)絡連接打開的文件句柄,如果沒有執(zhí)行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關閉.你也可以考慮設置socket的最大打開數(shù)來控制這個問題.
          •  對操作系統(tǒng)做相關的設置,增加最大文件句柄數(shù)量。
            1. Linux
              在 Linux內核2.4.x中需要修改源代碼,然后重新編譯內核才生效。編輯Linux內核源代碼中的 include/linux/fs.h文件,將 NR_FILE 由8192改為65536,將NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 文件將MAX_INODE 由16384改為262144。或者編輯 /etc/sysctl.conf  文件增加兩行 fs.file-max = 65536 和 fs.inode-max = 262144 。一般情況下,系統(tǒng)最大打開文件數(shù)比較合理的設置為每4M物理內存256,比如256M.可以用lsof -p <pid of process>看打開的文件句柄數(shù).
            2. Windows
              最大文件句柄是16,384,你在任務管理器的性能這一項中可以看到當前打開的句柄數(shù).

          服務器端修改:

          查看系統(tǒng)允許打開的最大文件數(shù)

          #cat /proc/sys/fs/file-max


          查看每個用戶允許打開的最大文件數(shù)

          ulimit -a

          發(fā)現(xiàn)系統(tǒng)默認的是open files (-n) 1024,問題就出現(xiàn)在這里。

          在系統(tǒng)文件/etc/security/limits.conf中修改這個數(shù)量限制,

          在文件中加入內容:

          * soft nofile 65536
          * hard nofile 65536


          另外方法:
          1.使用ps -ef |grep java   (java代表你程序,查看你程序進程) 查看你的進程ID,記錄ID號,假設進程ID為12
          2.使用:lsof -p 12 | wc -l    查看當前進程id為12的 文件操作狀況
              執(zhí)行該命令出現(xiàn)文件使用情況為 1052
          3.使用命令:ulimit -a   查看每個用戶允許打開的最大文件數(shù)
              發(fā)現(xiàn)系統(tǒng)默認的是open files (-n) 1024,問題就出現(xiàn)在這里。
          4.然后執(zhí)行:ulimit -n 4096

               將open files (-n) 1024 設置成open files (-n) 4096

          這樣就增大了用戶允許打開的最大文件數(shù)



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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 普兰店市| 玉屏| 内江市| 海兴县| 穆棱市| 特克斯县| 鞍山市| 贡嘎县| 汝州市| 凌源市| 沾益县| 和林格尔县| 商都县| 枞阳县| 惠东县| 湘潭县| 中牟县| 咸宁市| 昭平县| 临颍县| 成武县| 陈巴尔虎旗| 清徐县| 西乡县| 义马市| 保定市| 和政县| 沙坪坝区| 安岳县| 九江县| 辛集市| 保山市| 肇源县| 伊吾县| 海阳市| 井研县| 浑源县| 涡阳县| 新龙县| 板桥市| 克什克腾旗|