您的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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

php strtotime month bug,处理PHP strtotime的BUG

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

JMetro版本11.5.11和8.5.11发布

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

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

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

通过Apache Kafka集成流式传输大数据

从实时实时过滤和处理大量数据,到将日志数据和度量数据记录到不同来源的集中处理程序中,Apache Kafka日益集成到各种系统和解决方案中。 使用CData Sync ,可以轻松地将此类解决方案应用于任何CRM,ERP或Analytics软件。 配置Apach…

安卓php推送消息机制,深入剖析Android消息机制原理

在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统,避免一些低级的错误。在学习Android中消息机制之前,我们先了解与消息有关的…

oracle数据modeling分类,由浅入深 NoSQL的五种主流数据模型

【IT168 技术】本文内容是对《NoSQL Data Modeling Techniques》一文的简单概述,原文对NoSQL的几种数据模型进行了详细深入的讨论。是了解NoSQL数据模型不过错过的全面资料。NoSQL的一些非功能性的特性,比如扩展性、性能以及一致性的讨论,目前…

dederss.php美国与,Dede经验:全站rss/连载和分类首页模板替换

我用的是Dedecms55 utf-8建的站。首先感谢开源工作者们的劳动,其次要感谢使用者写的N多问题与解答。我一个PHP初用者,能在一个月内,一个人把酷猫网http://www.92kcuat.com 建成今天这样,相信很多朋友都可以。当遇到问题时&#xf…

物联网协议之COAP简介及Java实践

目录 前言 一、COAP简介 1、关于COAP 2、COAP特点 3、基于COAP的NB-IoT接入流程 二、CoAP协议JAVA实践 1、californium介绍 2、Java集成 3、Maven 资源引入 4、定义Server端 5、Client调用 6、运行测试 总结 前言 今天平安夜,祝大家圣诞快乐&#xff0c…

bp配置 sap_SAP转储订单之 STO without delivery

在《SAP转储订单STO小结》一文中,介绍了存转储订单(STO)的几种方式,在SAP Library中有相应的描述:1 Stock Transfer Between Plants in One Step2 Stock Transfer Between Plants in TwoSteps3 Stock Transport Order Without Delivery4 Stoc…

[MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)

通过超过62个小时的培训来掌握最流行的编程语言,从而树立良好的开发生涯 嘿,怪胎, 这一周,我们JCG促销专区 ,我们有另一个极端的报价 。我们正在提供一个巨大的96%off的完整2020 Python编程认证捆绑 。 立…

linux nc命令测试端口,Linux和Windows下的NC(Netcat)命令测试端口连通性

1、Linux OS 环境下(以Centos为例),使用nc命令分别测试TCP和UDP端口连通性:css安装方法:nginx在客户端和服务器端分别安装nc工具,安装命令以下:webyum install nc1. Linux OS下使用nc命令,实现TCP方式监听服…

javafx css颜色_JavaFX技巧7:使用CSS颜色常量/派生颜色

javafx css颜色在使用FlexCalendarFX时,我不得不定义一组颜色以可视化不同颜色的不同日历的控件。 每个日历不仅提供一种颜色,还提供几种:用于取消选择/选定/悬停状态的背景和文本颜色。 颜色曾在多个地方使用过,但为了简洁起见&…

linux 查看端口 程序,linux开发:Linux下查看端口占用

前段时间有学生问到,怎么查看linux系统中已经被占用的端口?下面就统一给大家解释一下。提到端口,那首先来回顾端口定义,为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别;我们…

十进制小数化为二进制小数的方法是什么_八进制转换成十进制,十进制转换成八进制...

先来看八进制如何转换成十进制。其方法与二进制转换成十进制差不多:按权相加法,即将八进制每位上的数乘以位权(如8,64,512….),然后将得出来的数再加在一起。如将72.45转换为十进制。如图1所示来看看十进制转八进制&am…

c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和

本篇的主题是将单元格内一串文本,找出所有数字并求和,如下图。难度较高,新手建议仅了解下,先学会数组运用,再研究此知识点。废话少说,步入正题。重点说明:本篇只针对文本内整数的数字进行提取并…

iphone已停用怎么解锁_两种无密码解锁iPhone锁屏密码的方法

现在很多手机都配备指纹解锁功能,大家平时用惯了指纹解锁,有时候在需要输入锁屏密码的时候反倒记不清密码是什么了。像是手机重启后就需要输入密码解锁,iPhone锁屏密码忘了怎么办?多次输入错误密码还可能导致手机被停用&#xff0…

linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

postgresql某一个进程占用大量CPU,问题排查,目前服务器cpu为4核,内存8G1.查下是不是我们的业务SQLSELECTprocpid,START,now() - START AS lap,current_queryFROM (SELECTbackendid,pg_stat_get_backend_pid(S.backendid) AS procp…