(收藏)Java程序员也应该知道的too many open files的一些事

标签: 收藏 java 程序员 | 发表时间:2013-08-10 23:19 | 作者:
出处:http://jackyrong.iteye.com
Java应用也有很大的概率会碰到too many open files这样的异常,此异常的主要原因是进程打开了太多的文件(可通过lsof | grep [pid] | wc -l来查看),linux对每个用户/进程都会有打开的文件数的限制。

当前进程打开的文件数的限制可通过cat /proc/[pid]/limits来查看,看到的内容类似如下:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 387075 387075 processes
Max open files 131072 131072 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 387075 387075 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
其中的max open files即为进程可打开的文件数,所有的io都会涉及到文件的打开等,例如建立连接等。

那么进程的这些limits又是怎么被赋值的,一种是在启动脚本里通过ulimit来主动赋值,例如ulimit -n 10000,表示把要启动的进程的max open files限制为10000,另一种是在代码中通过setlimit的方式来设置,在不做主动赋值的情况下,那么会继承父进程的limits,如没有父进程,则继承当前启动的用户的。

用户的limits可通过/etc/security/limits.conf来控制,也可通过放入/etc/security/limits.d/*.conf来控制,limits.conf内容怎么写这个在文件本身有很详细的解释,就不在这里多说了。

跟随机器启动的进程会继承init的limits信息,init的max open files在2.6.18/2.6.32里默认都是1024,这个是在代码里写S的固定值:
/*
* boot-time rlimit defaults for the init task:
*/
#define INIT_RLIMITS
{

[RLIMIT_NOFILE] = { INR_OPEN, INR_OPEN },
….
}
#define INR_OPEN 1024 /* Initial setting for nfile rlimits */

至于如何查到对应的Java代码中为什么打开了这么多的文件,主要可通过btrace监控文件API和socket open的相关API的调用,从而确定原因。

顺带说下,max processes是用于限制进程本身最多派生的子进程数以及线程数个数,对于java而言,主要就是限制线程数,可通过ulimit -u来做设置。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [收藏 java 程序员] 推荐:

(收藏)Java程序员也应该知道的too many open files的一些事

- - jackyrong
Java应用也有很大的概率会碰到too many open files这样的异常,此异常的主要原因是进程打开了太多的文件(可通过lsof | grep [pid] | wc -l来查看),linux对每个用户/进程都会有打开的文件数的限制. 当前进程打开的文件数的限制可通过cat /proc/[pid]/limits来查看,看到的内容类似如下:.

Java程序员常用工具集

- - BlogJava-庄周梦蝶
    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了. 我想列下我能想到的一个Java程序员会用到的常用工具. 1.IDE: Eclipse或者 IDEA,熟悉尽可能多的快捷键,《 Eclipse常见快捷键列表》. (1) Findbugs,在release之前进行一次静态代码检查是必须的.

Java系统程序员修炼之道

- - 博客 - 伯乐在线
从2002开始接触Java学会HelloWorld这么经典的程序到如今不知不觉已经十年啦,十年中亲耳听到过不少大牛的演讲,见到过项目中的神人在键盘上运指如飞的编程速度,当时就被震撼了. 当编程越来越成体力活,我们还能有自己的思想,还能修炼为Java系统级别的 程序员嘛. 学习与修炼以下知识与技能,帮你早日达成愿望.

Java程序员的现代RPC指南

- - CSDN博客推荐文章
Java程序员的现代RPC指南. 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦. 于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大作业里凡是涉及到分布式通信的都用RMI,真是方便. 后来用上了Spring,发现Spring提供了好多Exporter,可以无侵入地将一个POJO暴露为RPC服务.

Java面试题:多线程,作为Java程序员你不得不懂

- sun - IT程序员面试网
线程:是指进程中的一个执行流程. 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源. 创建线程有两种方式,如下: 1、 扩展java.lang.Thread类 2、 实现Runnable接口 Thread类代表线程类,它的两个最主要的方法是: run()——包含线程运行时所执行的代码 Start()——用于启动线程.

Java程序员不该有的6种陋习

- - BlogJava-首页技术区
只有在学会处理异常之后,我们才能说自己是一个合格的java程序员. 只有在摆脱了以下六种异常处理的陋习之后,才能威慑一下刚毕业的小菜鸟.   现在就来测试一下大家对异常的掌握程度. 不用担心,事实上,这些不合理的设计很容易看出来. 那么,以下六种不合理的代码,大家能看出每一种的问题出在哪儿吗.   + ",姓名:" + rs.getString("name"));.

25个让Java程序员更高效的Eclipse插件

- - 博客 - 伯乐在线
Eclipse提供了一个可扩展插件的开发系统. 这就使得Eclipse在运行系统之上可以实现各种功能. 这些插件也不同于其他的应用(插件的功能是最难用代码实现的). 拥有合适的Eclipse插件是非常重要的,因为它们能让Java开发者们无缝的开发基于J2EE和服务的应用程序. Eclipse的插件也能帮助他们开发不同应用架构上的程序.

java程序员必知的8大排序

- - CSDN博客推荐文章
   (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排. 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数. 如此反复循环,直到全部排好顺序. //将大于temp的值整体后移一个单位. 2,           希尔排序(最小增量排序). (1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序.

【外刊IT评论网】Java程序员的堕落

- - 外刊IT评论网
我曾在多个场合撰文说过,现在培训出来的企业Java开发兵团只知道使用某种框架,但完全不知道这些框架的底层原理. 今天早上,在依次对三个职位的应聘者面试中,我又再次见到了这种情形. 我们的顾问公司收到了一个客户的招聘需求,要一个经验丰富并通晓SQL的Java开发人员. 我们公司在这个客户那里享有非常好的声誉,于是我们从招聘代理公司要来了一批简历,开始搜寻合适的目标.

推荐给初级Java程序员的七个免费教程

- - ImportNew
本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书. 这本书可以帮助你系统的学习Java,里面包含有很多好的代码示例. 第三版仍旧是免费的,直到第四版才开始收费,不过仍旧值得买一本收藏. 免费下载: Thinking in Java. 这个教程来自于Oracle/Sun. 我们可以根据我们觉得合适的节奏来进行学习.