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

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

静谧 发布于 2021-11-26 字数 233 浏览 773 回复 8

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

改了ulimits.conf也照样报。

这种问题该怎么定位?

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

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

小情绪 2021-12-01 8 楼

写代码的时候就应该注意,用完了io就要去关闭.
ulimits.conf可以给个最大的.

心舞飞扬 2021-12-01 7 楼

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

把回忆走一遍 2021-12-01 6 楼

引用来自“z_jordon”的评论

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

月牙弯弯 2021-12-01 5 楼

引用来自“GwMyna”的评论

YourKit Java Profiler 这个软件

小瓶盖 2021-12-01 4 楼

YourKit Java Profiler 这个软件

永不分离 2021-12-01 3 楼

建议先把ulimit设个小的,做好测试之后,在增大,否则,超限只是时间问题! 关联要查一下io流用完之后是否正确关闭

醉生梦死 2021-12-01 2 楼

获取数据库连接的代码是自己封装的还是用的连接池?可以展示下获取连接那块代码,建议改用数据库连接池,但是从
巨多out流、巨多ftp来看应该不是数据库连接问题,能讲清楚具体的代码逻辑或者功能吗?

沦落红尘 2021-12-01 1 楼

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