原因:
操作系統(tǒng)的中打開文件的最大句柄數(shù)受限所致,常常發(fā)生在很多個(gè)并發(fā)用戶訪問服務(wù)器的時(shí)候.因?yàn)闉榱藞?zhí)行每個(gè)用戶的應(yīng)用服務(wù)器都要加載很多文件(new一個(gè)socket就需要一個(gè)文件句柄),這就會(huì)導(dǎo)致打開文件的句柄的缺乏.
解決:
- 盡量把類打成jar包,因?yàn)橐粋€(gè)jar包只消耗一個(gè)文件句柄,如果不打包,一個(gè)類就消耗一個(gè)文件句柄.
- java的垃圾回收不能關(guān)閉網(wǎng)絡(luò)連接打開的文件句柄,如果沒有執(zhí)行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關(guān)閉.你也可以考慮設(shè)置socket的最大打開數(shù)來控制這個(gè)問題.
- 對(duì)操作系統(tǒng)做相關(guān)的設(shè)置,增加最大文件句柄數(shù)量。
- Linux
在 Linux內(nèi)核2.4.x中需要修改源代碼,然后重新編譯內(nèi)核才生效。編輯Linux內(nèi)核源代碼中的 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ù)比較合理的設(shè)置為每4M物理內(nèi)存256,比如256M.可以用lsof -p <pid of process>看打開的文件句柄數(shù). - Windows
最大文件句柄是16,384,你在任務(wù)管理器的性能這一項(xiàng)中可以看到當(dāng)前打開的句柄數(shù).
- Linux