前言:此处描述的两个问题是在一年前发现并修复的。 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南。

在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效负载处理。 一段时间以前,我们在共享的SaaS AS2网关上遇到了一个问题,该缓存随着时间的推移泄漏了文件描述符。 最终,在击中系统ulimit时,导致too many open files错误too many open files


有弹性的城堡军团:流支持的MIME部分中的剩余部分?

我们发现罪魁祸首是Bouncy Castle ,这是著名的安全服务提供商,自Ultra ESB Legacy时代起就一直是我们的挚爱。


通过一些简单的工具,我们发现BC习惯了对MIME部分调用getContent()以确定它们的类型(例如, instanceof检查)。 没错,这本身并不是犯罪。 但是我们的大多数MIME部分都是文件支持的 ,另一端带有文件缓存文件-这意味着每个getContent()都会为该文件打开一个新流。 因此,现在有指向我们的文件缓存的杂散流(以及文件描述符)。

这些已经足够了,我们将用尽分配给Ultra ESB(Java)进程的文件描述符配额。

让他们变得懒惰!

我们不想弄乱BC代码库。 因此,我们找到了一个简单的解决方案:使用“惰性”流创建所有文件支持的MIME部分。 我们(以前)同事Rajind写了LazyFileInputStream -灵感LazyInputStreamjboss-vfs -打开只有当实际文件read尝试。


BC很高兴,文件缓存也很高兴。 但是我们是最快乐的

Hibernate JPA:晚饭后清理,也就是关闭消耗的流

我们发现的另一个错误是某些数据库操作留下了未关闭的文件句柄。 显然,只有当我们将流支持的Blob馈送到Hibernate时,流才通常来自文件缓存项。


经过一番挖掘之后,我们提出了一个理论,即Hibernate不会关闭这些Blob条目的基础流。 (这是有道理的,因为java.sql.Blob接口没有公开Hibernate可以用来操作基础数据源的任何方法。)但是,这是一个问题,因为丢弃的流(以及关联的文件句柄)不会得到发布直到下一个GC。

对于一个短期应用程序来说,这本来可以,但是像我们这样长期运行的应用程序很容易用完文件描述符。 例如突然而持续的峰值。

让他们自动关闭!

我们不想失去流媒体的好处,但是我们也无法控制流媒体。 您可能会说我们应该将流放在可自动关闭的结构中(例如try-with-resources )。 不错的尝试; 但是可悲的是,Hibernate在我们的执行范围之外(特别是在@Transactional流中)读取它们。 一旦我们开始在代码范围内关闭流,我们的数据库操作就开始惨败-尖叫“流已关闭!”。

他们说, 在罗马时,就像罗马人一样

因此,我们决定不打扰Hibernate,而是决定自己处理流。

Rajind(是的,还是他)再次入侵了SelfClosingInputStream包装器 。 这将跟踪从底层流读取的数据量,并在读取最后一个字节后立即将其关闭。


(我们确实考虑过使用现有选项,例如来自Apache commons-io AutoCloseInputStream ;但是发生了,我们到处都需要一些自定义设置,例如详细的跟踪日志记录。)

底线

当涉及到Java中的资源管理时,很容易过度关注内存和CPU(处理),而忽略其余部分。 但是虚拟资源(例如临时端口和每个进程的文件描述符 )可能同样重要,甚至更多。

尤其是在长时间运行的流程(例如我们的AS2 Gateway SaaS应用程序)上,它们实际上可以成为沉默的杀手。

您可以通过两种主要方式检测这种“泄漏”:

  • “单周期”资源分析 :运行一个完整的处理周期,比较前后的资源使用情况
  • 长期监控 :持续记录和分析资源指标以识别趋势和异常

在任何情况下,修复泄漏都不是一件容易的事。 一旦您清楚地了解要处理的内容。

祝您好运,寻找您的资源消耗d(a)守护程序!

翻译自: https://www.javacodegeeks.com/2019/10/is-your-jvm-leaking-file-descriptors-like-mine.html

您的JVM是否泄漏文件描述符-像我的一样?相关推荐

  1. jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?

    jvm 助记符 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅用作历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快 ...

  2. linux文件描述符泄漏,文件描述符(fd)泄漏排查一篇就够了

    生产多次遇到文件描述符(fd)泄露相关的问题, 文件描述符泄漏一般引起 的现象是文件句柄数(封面图)/tcp alloc(上图)增长.文章分为两部分介绍文件描述符相关内容,第一部分介绍文件描述基础知识 ...

  3. Linux服务器文件描述符最大值修改

    文件描述符的有效范围是 0 到 OPEN_MAX.Linux 2.4.22 强制规定最多不能超过 1,048,576 . 文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件.文件描述符与包 ...

  4. 一文帮你搞懂 Android 文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统 ...

  5. jvm优化_您的JVM是否泄漏了文件描述符-像我的一样?

    jvm优化 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅作为历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且 ...

  6. AHC(AsyncHttpClient)文件描述符泄漏

    使用AsyncHttpClient的时候如果每次使用完不调用close方法,会导致文件描述符泄漏. 但是如果每次都关闭,似乎达不到connection pooling已经thread pool的复用的 ...

  7. 网络与IO知识扫盲(一):Linux虚拟文件系统,文件描述符,IO重定向

    系统IO原理 在 Linux 中: VFS(Virtual Filesystem Switch):虚拟文件系统,是一个目录树.树上不同的节点可以映射到物理的文件地址,可以挂载. 相当于一个解耦层,在具 ...

  8. /etc/security/limits.conf 控制文件描述符,进程数,栈大小等

    linux下安装Oracle 一般都会修改/etc/security/limits.conf这个文件,但是这里面的具体含义未必每个人都会,刚开始我也不是很清除,只知道要修改,每次安装按照文档配置就可以 ...

  9. java套接字创建失败_Linux的文件描述符个数限制导致创建文件(或socket)失败的问题...

    众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd.当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的.本文着着重讲述socket有关的内容.当我们 ...

最新文章

  1. 编码 data:text/html;c,关于 Data URI Scheme -- data:image/jpg;base64
  2. 重磅!《2021中国开源发展蓝皮书》发布
  3. MyEclipse的Add Libraries对话框
  4. CentOS7安装xfce桌面环境
  5. Qt中定时器使用的两种方法
  6. 河北外国语学院计算机宿舍,河北外国语学院宿舍怎么样 住宿条件好不好
  7. JAVA高性能内存队列-disruptor
  8. JavaScript之调用函数的方式
  9. OpenCV c接口与c++接口
  10. Python-数据类型-4 第七次全国人口普查数据分析
  11. 【Audio】WAV音频文件格式结构解析
  12. 网站服务器 南阳,河南南阳DNS服务器地址
  13. 用python输出世界你好_Hello World! (你好,世界!)
  14. html文本框的文字间距,word文本框中2行文字的间距为什么那么大
  15. qq邮箱smtp服务器imap,如何配置电子邮件客户端使用IMAP(QQ邮箱账户) 你需要学习了...
  16. CES 2022:四大芯片巨头正面厮杀,抢滩自动驾驶、元宇宙
  17. 语音合成第一篇-入门
  18. java进度条_Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)...
  19. 完爆90%的性能毛病,收好数据库优化八大通用绝招
  20. 双向可控硅在交流调压电路中的使用

热门文章

  1. C. Minimum Grid Path(思维)
  2. 2018-2019 ACM-ICPC, Asia Seoul Regional Contest——A - Circuits
  3. 纪中B组模拟赛总结(2020.2.22)
  4. Educational Codeforces Round 54 (Rated for Div.2)
  5. 「LibreOJ NOIP Round #1」旅游路线
  6. codeforces gym-101745 D-Stamp Stamp Stamp动态规划
  7. MySQL ifnull()函数
  8. Mysql中的行级锁、表级锁、页级锁
  9. javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——applicationContext.xml
  10. 2020蓝桥杯省赛---java---C---1(约数个数)