tomcat老是报“java.net.SocketException: 打开的文件过多”,这种问题怎么定位

KnowKjava 发布于 2015/06/02 20:24
阅读 3K+
收藏 0

tomcat老是报“java.net.SocketException: 打开的文件过多”,

改了ulimits.conf也照样报。

这种问题该怎么定位?

项目里有巨多连数据库的session、巨多out流、巨多ftp,难道我要一行一行一个一个去核实关了没?

加载中
0
loyal
loyal
写代码的时候就应该注意,用完了io就要去关闭.ulimits.conf可以给个最大的.
0
z_jordon
z_jordon
这个没太多办法了,只能支检察代码看是哪边打开了文件没关闭或打开了数据库连接没关闭,即使把允许打开文件最大值的参数设到很大也是没用的,迟早还是要出问题,我之前有接手过以前同事的一个java项目,基本是一条记录启一个线程然后创建一个数据库连接进行保存,当数据量大时启几百个线程,创建几百个数据库连接。
0
谭恒杰
谭恒杰
获取数据库连接的代码是自己封装的还是用的连接池?可以展示下获取连接那块代码,建议改用数据库连接池,但是从巨多out流、巨多ftp来看应该不是数据库连接问题,能讲清楚具体的代码逻辑或者功能吗?
0
Adairs
Adairs
建议先把ulimit设个小的,做好测试之后,在增大,否则,超限只是时间问题! 关联要查一下io流用完之后是否正确关闭
0
GwMyna
GwMyna
YourKit Java Profiler 这个软件
0
KnowKjava
KnowKjava

引用来自“GwMyna”的评论

YourKit Java Profiler 这个软件
你说的YourKit、Profiler,这些是性能分析工具啊。跟我问的问题有什么关系?
0
KnowKjava
KnowKjava

引用来自“z_jordon”的评论

这个没太多办法了,只能支检察代码看是哪边打开了文件没关闭或打开了数据库连接没关闭,即使把允许打开文件最大值的参数设到很大也是没用的,迟早还是要出问题,我之前有接手过以前同事的一个java项目,基本是一条记录启一个线程然后创建一个数据库连接进行保存,当数据量大时启几百个线程,创建几百个数据库连接。

同命相怜啊。我也是接来的一个系统,那个人刚走。

跟你同样,基本一条记录启一个线程,然后创建一个数据库连接。。就没有用线程池。。

比较惨的是,,生产上以前没有这个“打开过多文件”的问题,我接过来以后,在原有基础上修改了一些功能,然后就有了!

0
GwMyna
GwMyna

这个是不是可以监控下

KnowKjava
KnowKjava
你这个是profile还是yourkit? 可以看到socket的数量吗?还有每一个打开的socket所在类名、方法名、第几行代码?
返回顶部
顶部