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

前言:此处描述的两个问题是在一年前发现并修复的。 本文仅用作历史证明,也是有关解决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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中degrees,Convert degrees-minutes-seconds to degrees

Angle in degrees-minutes-seconds representation, specified as ann-by-3 real-valued matrix. Each row specifies oneangle, with the format [D M S]:D contains the “degrees” elementand must be integer-valued.M contains the “minutes” elementand must be integ…

螺旋桨设计软件_欧洲斥巨资研发的A400M螺旋桨运输机,为啥就没人买啊?| 图说...

A400M是欧洲自行设计、研制和生产的新一代军用运输机,也是欧盟国家进行合作的最大的武器联合研制项目。A400M最大的特点,就是其标志性的8叶弯刀螺旋桨。A400M也是20世纪后服役的为数不多的几个使用涡轮旋桨发动机的军用运输机之一。A400M曾在系列电影《碟…

python5个功能_5个常用的定制Python功能代码

文章来源:淘论文网 发布者:毕业设计浏览量:一、随机数生成>>> import random #导入Python内置的随机模块>>> num random.randint(1,1000) #生成1-1000之间的伪随机数二、读文件>>> f open(c:\1.txt,r)>>> lin…

php链接远程socket,php使用socket获取远程图片

步骤:1,匹配URL中的主机名和文件部分2,创建socket并连接到目标服务器3,构造HTTP请求并发送4,读取HTTP响应并解析5,保存内容到文件并关闭socket连接代码实现如下:/** 使用socket获取远程资源(网页…

JAR文件句柄:烦恼后清理!

在Ultra ESB中,我们使用特殊的热交换类加载器 ,该加载器使我们可以按需重新加载Java类。 这使我们能够从字面上热交换我们的部署单元 -加载,卸载,使用更新的类重新加载,以及正常地逐步退出-无需重启JVM。 Windows&…

大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样

点击蓝字关注我哦1.基本信息(成像仪/重访周期/波段数/分辨率)哨兵2号是高分辨率多光谱成像卫星,携带一枚多光谱成像仪(MSI),用于陆地监测,可提供植被、土壤和水覆盖、内陆水路及海岸区域等图像,分为2A和2B两颗卫星,哨兵&#xff0…

hello python的代码,python基础教程之Hello World!

Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:代码如下:$python将直接进入python。然后在命令行提示符>>>后面输入:代码如下:>>>print(Hello World!)可以看到,随后在屏幕上输出:代码如下:Hello World!print是一个常用函数&#…

python3 线程隔离_Python的线程隔离实现方法

前段时间看了下flask的源码,对于这样一个轻量级的web框架是怎样支持多线程的感到非常好奇,于是深入了解了一番。flask是依赖werkeug来实现线程间的隔离的,而werkeug最后又使用到了python的内置模块locals来承载数据,看不如写&…

限定通配符和非限定通配符_为什么我不信任通配符以及为什么我们仍然需要通配符...

限定通配符和非限定通配符在将子类型多态性&#xff08;面向对象&#xff09;与参数多态性&#xff08;泛型&#xff09;相结合的任何编程语言中&#xff0c;都会出现方差问题。 假设我有一个字符串列表&#xff0c;键入List<String> 。 我可以将其传递给接受List<Obj…

php strtotime month bug,处理PHP strtotime的BUG

PHP strtotime的BUG处理最近使用了strtotime结合-1 month, 1 month, next month获取上个月或者下个月的日期&#xff0c;不过刚看到一篇文章&#xff0c;才知道原来使用strtotime直接获取日期还是有点小BUGBUG如日期&#xff1a;$today 2020-12-31;echo date("Y-m-d"…

JMetro版本11.5.11和8.5.11发布

你好 具有新JMetro样式的另一个版本&#xff08;深色和浅色版本&#xff09;&#xff1a; 分割菜单按钮 分割窗格 药丸按钮/分段按钮 调整现有样式和错误修复。 继续阅读以获取详细信息。 分割菜单按钮 以下是一个动画&#xff0c;显示了新的“拆分菜单按钮” JMetro浅色…

python远程连接mysql数据库_MySQL数据库之python mysql远程连接

本文主要向大家介绍了MySQL数据库之python mysql远程连接 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。第一步&#xff1a;vim /etc/MySQL/my.cnf找到bind-address 127.0.0.1注释掉这行&#xff0c;如&#xff1a;#bind-address 12…

php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法

在用自定义线程池的时候&#xff0c;遇到cpu100%&#xff0c;经过验证后&#xff0c;发现问题来源于我定义的子线程。子线程的主要功能是从任务队列(LinkedBlockingQueue)里面持续拿出任务&#xff0c;并且执行。以下为令CPU100的代码。private class WorkThread extends Threa…

excel离散度图表怎么算_一般人不知道的几个excel制图技巧

原标题&#xff1a;一般人不知道的几个excel制图技巧作者&#xff1a;杜雨 公众号&#xff1a;数据小魔方(datamofang)今天这篇&#xff0c;我专注于Excel的作图规则&#xff0c;深入的研究下Excel由数据源到可视化图表之间的关系是如何对应的&#xff0c;倘若你已经在工作中横…

listview控件在php的使用方法,Android_Android编程之控件ListView使用方法,本文实例讲述了Android编程之控 - phpStudy...

Android编程之控件ListView使用方法本文实例讲述了Android编程之控件ListView使用方法。分享给大家供大家参考。具体分析如下&#xff1a;控件ListView是一个重要的控件&#xff0c;可以被用作用户列表等显示&#xff0c;下面进行它的操作测试。下面代码实现了生成了一个ListVi…

使用ElasticSearch进行近实时索引

选择索引策略很困难。 Elasticsearch 文档的确有一些一般性建议 &#xff0c;并且有其他公司的 一些技巧 &#xff0c;但这也取决于特定的用例。 在典型情况下&#xff0c;您有一个数据库作为事实的来源&#xff0c;并且有一个使事物可搜索的索引。 您可以采用以下策略&#xf…

air什么意思中文_Air 的中文意思是什么?

展开全部air释义&#xff1a;(1)作为名词&#xff0c;空气&#xff1b;32313133353236313431303231363533e59b9ee7ad9431333431366261天空&#xff1b;(飞行的)空中。(2)作为动词&#xff0c;晾&#xff1b;晾干&#xff1b;(使)通风&#xff1b;公开发表。读音&#xff1a;英[…

python xlutils函数,python3:xlrd、xlwt、xlutils处理excel文件

1.xlrd读取excel请参考上篇博客https://www.cnblogs.com/shapeL/p/9075843.html2.xlwt生成excel安装下载&#xff1a;pip install xlwt导入&#xff1a;import xlwt参考&#xff1a;生成excel文件test1.xlsfile_name ../dataconfig/test1.xlswbk xlwt.Workbook() #初始化work…

前端实现炫酷动效_20个网页动效设计的炫酷神器

如今很多 UI 设计师不是正在做动效&#xff0c;就正在学着做动效。动效现在已经无处不在了。有的动效可能是一个微妙的悬停效果&#xff0c;使用 Bttn.css 或者是 Hover Buttons 的帮助下&#xff0c;添加到按钮上&#xff0c;有的则可能是使用引人瞩目的动态渐变背景抓住用户的…

php7设置最大连接数,sybase 15.7 修改 number of user connections 最大连接数

sp_configure number of user connectionssp_configure number of user connections,200修改Sybase最大连接数的方法有两种&#xff0c;如下&#xff1a;一、 进Sybase central, 鼠标右键选择数据库服务器(要处理的服务器)&#xff0c;然后选择右键菜单中的配置选项&#xff0c…