处理缓慢的资源泄漏

使用Java监视器查找资源泄漏

查找缓慢的资源泄漏是使应用程序服务器长时间保持正常运行的关键。 在这里,我解释了如何使用Java监视器来发现缓慢的资源泄漏,以及如何验证它们是实际的泄漏,而不仅仅是额外的预分配到某些HTTP连接器或数据库池中。 如果执行这些步骤,则可以摆脱定期重新启动,并真正开始依赖服务器。

缓慢的资源泄漏是一个问题,因为它们迫使您定期重新启动应用程序服务器。 反过来,这意味着您始终必须密切注意服务器,因为它们随时可能崩溃。 最终,您不能依赖遭受缓慢资源泄漏的服务器。 跟踪和解决缓慢的资源泄漏需要时间和耐心。 一旦完成几次,这并不是很难做到的。

您还需要一个监视工具,该工具可以显示过去几周甚至几个月内来自服务器的统计信息。 如果在服务器上启用了更长的数据存储,则可以使用Java监视器来执行此操作。 要在Java监视器中启用此功能,请首先开始对服务器使用Java监视器 。 在带有服务器图形的页面上,可以通过切换到“ 1周”或“ 1个月”视图来启用更长的数据,如下所示。

开关

第一步是查看过去一周中服务器的数据。 为了发现资源泄漏,我发现绘制一周的数据比查看Java监视器标准的两天的数据要好。 峰平滑了,这些图让我看看例如内存使用随时间如何发展。

为了预测即将发生的中断和缓慢的资源泄漏,我寻找两种模式。 首先要检查的模式是,资源使用量不会随时间增加,而会随着每日流量的增加和减少而增加和减少。 当一天的流量减少后,我预计资源使用量将回落到名义水平。 我检查资源使用率是否每次都回落到同一水平。

请注意,我故意使用模糊的术语,例如“资源”。 在实践中,我查看所有内存,文件描述符以及HTTP连接器和数据库连接池的图形。 所有这些都是缓慢的资源泄漏的候选者。

当我看到资源似乎在增长的时候,我切换到数据的每月视图,甚至年度视图。 这将压缩图中的数据,并使缓慢的资源泄漏更容易发现。

这是资源使用情况可疑更改的示例。 在这种情况下,系统上的垃圾收集器突然变得更加活跃。 此时,系统或系统负载没有变化。

慢1

我要注意的第二种模式是服务器重启重启后资源分配急剧下降。 重新启动应用程序服务器时,如果资源使用量显着下降,则可能表明资源泄漏缓慢。 重新启动之后,通常会像重新启动之前那样降低资源使用量,因为所有池和缓存都开始为空。

这是一个与重启相关的资源使用变化的示例,该变化并不表示有问题。 重新启动后一段时间(甚至几天),资源使用情况已更改,但随后又恢复到正常水平并停留在该水平。

慢3

这是另一个。 甚至更加可疑,因为重新启动后资源使用率并未恢复。 它只是掉下来并停留下来。 这几乎肯定是一个问题。

慢5

一旦确定资源使用模式可疑,就必须确认这实际上是一个缓慢的泄漏。 很有可能是缓存或池中填充了更多缓存,从而随着时间的推移提高了资源使用率,而没有实际的泄漏。 在这一步中,我将遍历线程和数据库池的图以及HTTP会话的图。 我试图从那里的图表来解释提高的资源使用情况。

例如,在这里我们看到JVM中活动的线程,但线程数量有些奇怪的下降。 这些下降表明系统重新启动。

慢2

但是,如果将该图与同一台服务器上的HTTP连接器池图进行比较,我会发现HTTP连接器池中预分配的线程数同样会上下波动。

慢4

这可能意味着没有缓慢的资源泄漏。 最有可能的是,池中的额外线程保持状态,从而导致其他资源也增加。 我可能会记下具体注意此服务器的信息,但我还没有开始深入研究资源泄漏。

只有当我无法解释池中分配的额外资源和活动HTTP会话的数量时,我才真正开始挖掘。 如下所述: 如何找到资源泄漏缓慢的根本原因 。

解决缓慢的资源泄漏

我们研究了如何较早发现缓慢的内存泄漏。 在那里,我们看到了如何找到缓慢的资源泄漏,以及如何将其与预期的池增长行为区分开。

在这里,我想解释一下如何确定缓慢的资源泄漏的根本原因,以及最终如何解决它们。 修复缓慢的资源泄漏几乎总是需要更改代码,因此,如果您无法更改代码,则无法修复缓慢的资源泄漏。 在这种情况下,您将必须找到可以的人。

确定缓慢的资源泄漏的根本原因的过程类似于发现快速泄漏的过程。 主要的区别是时间对您不利。 对于快速泄漏,您可以轻松地进行几次迭代,而缓慢的泄漏则可能需要数周或数月的时间才能显现出来。 迭代可能是一年的四分之一。 为了加快泄漏速度,您可以快速更改代码并“实时查看其运行状况”。 对于较慢的泄漏,这仅意味着您将永远找不到真正的问题。

要遵循的步骤是:

  1. 识别泄漏的资源(完成,是的!)
  2. 收集有关该资源的证据
  3. 撰写有关问题所在的论文,看看证据是否支持您
  4. 向您认识的人展示您的分析结果,从而将您的证据撕成碎片
  5. 设计并实施修复

请注意,我们通常通常只快速地执行步骤3,然后将所有精力花在步骤5上,却发现真正的问题是其他问题。 我应该知道,因为我犯错的次数比我愿意承认的还要多。

一旦知道泄漏了哪些资源(例如内存,文件描述符,CPU周期,线程),便开始收集有关泄漏的证据。 该证据来自多个来源。 如果泄漏的资源仅在您的代码中很少使用,则应用程序源代码是开始收集的好地方。 如果这是在各处(例如内存)使用的东西,那么查看源代码通常很耗时,并且效率不高。 因此,这是我要寻找证据的备忘单:

  • 记忆
    --->堆转储
  • 文件描述符
    ---> Java监视器的线程池图以及lsof或sockstat
  • 中央处理器
    --->线程转储
  • 线程数
    ---> Java监视器的线程池图和线程转储
  • 数据库连接
    --->在JDBC驱动程序上启用资源泄漏检测

收集证据时,保持开放的态度非常重要。 得出关于正在发生的事情的结论是非常诱人的。 相反,只需查看很酷的证据并消除可能的问题。

至关重要的一步是向不惧怕挑战您的人提供您的证据和思路。 此步骤是为了防止您在分析中犯错误,并且必须等待几周才能发现自己是错误的。 在这个阶段,只是点头和鼓掌的人可能弊大于利,不管这个人的意图多么好。 找到合适的人,并告诉该人您需要严格的审查。

一旦分析克服了这一挑战,您就可以最终开始考虑解决方案。 该解决方案需要包括两个部分:1)它需要以使系统为您提供有关刚刚发现的问题的证据的方式来改进日志记录和监视,以及2)它需要实际解决该问题。

如果您的解决方案不正确,改进的日志记录将为您提供新的新证据,以供您进行第二次(可能是最终的!)迭代。

参考:在Java-Monitor博客上,我们的JCG合作伙伴 Kees Jan Koster处理缓慢的资源泄漏。

翻译自: https://www.javacodegeeks.com/2013/09/dealing-with-slow-resource-leaks.html

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

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

相关文章

jquery简单实现点击弹出层效果实例

先看效果图&#xff1a;完整例子&#xff1a; <!-- 渐变弹出层 --><div id"race"><a href"#">点击</a></div><div id"racePop" class"raceShow">这里是弹出层效果</div> <script type&q…

Openfire源码阅读(一)

本篇先分析openfire源码的主要流程&#xff0c;模块细节后续再继续分析&#xff1b; 一、简介&#xff1a; Openfire是开源的实时协作服务器&#xff08;RTC&#xff09;&#xff0c;它是基于公开协议XMPP&#xff08;RFC-3920&#xff09;&#xff0c;并在此基础上实现了XMPP-…

php 查询方法all,获取多条:all静态方法

查询多条数据&#xff1a;all( )方法all方法与前节课学习的get方法都是静态方法&#xff0c;可用模型类直接访问2. 源码&#xff1a;/*** 查找所有记录* access public* param mixed $data 主键列表或者查询条件(闭包)* param array|string $with 关联预查询* param b…

[译文]过犹不及,别再在编程中高射炮打蚊子

原文链接&#xff1a;Anyway,stop recommending bazookas to kill flies in programming. 众成翻译地址&#xff1a;过犹不及&#xff0c;别再在编程中高射炮打蚊子 译者注&#xff1a;翻译这篇吐槽的文章&#xff0c;主要是为了自省~日常工作中确实会犯类似的错误&#xff0…

Java中的for循环

上一章呢我们学习了一下java中的while循环和do while循环 现在我们来了解一下另外一种循环 for循环 for循环是编程语言中一种开界的循环语句&#xff0c;而循环语句 由循环体及循环的终止条件两部分组成&#xff0c;for循环其在各种编程语言中的实现与表达有所出入&#xff0…

SpringFox swagger2 and SpringFox swagger2 UI 接口文档生成与查看

依赖&#xff1a; <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> <…

matlab期末复习资料,MATLAB期末复习习题及答案

MATLAB期末复习习题及答案13&#xff0c; ysin(x)&#xff0c;x从0到2 &#xff0c; x0.02 &#xff0c;求y的最大值、最小值、均值和标准差。(应用max,min,mean,std) 14&#xff0c; 参照课件中例题的方法&#xff0c;计算表达式z 10x3 y5e xcontour, hold on, quiver)15&…

多核可扩展计数器

到处都需要计数器&#xff0c;例如&#xff0c;查找应用程序的关键KPI&#xff0c;应用程序的负载&#xff0c;服务的请求总数&#xff0c;用于查找应用程序吞吐量的一些KPI等。 由于所有这些需求&#xff0c;并发复杂性也增加了&#xff0c;这使这个问题变得有趣。 如何实现…

三年前端,面试思考(二)

为什么还有&#xff08;二&#xff09; 没有想到上一篇 《三年前端&#xff0c;面试思考》 有这么多前端同学看到。 在评论区也有很多鼓励和质疑的声音&#xff0c;而且群里面交流的同学两天就达到了700人。 群里有同学问了很多问题&#xff0c;同时希望我再分享一些面试技巧…

51单片机auxr寄存器_MCS-51单片机有几个工作寄存器

工作寄存器有4组&#xff0c;每组都是8个工作寄存器R0~R7&#xff0c;通过PSW中的RS1、RS0两位来选择使用哪一组&#xff0c;如果不选&#xff0c;默认是选择第0组。RS1RS0组合为00时&#xff0c;选中第0组工作寄存器&#xff0c;R0~R7地址为00H~07H;RS1RS0组合为01时&#xff…

matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc

RPY_Euler_Quaternion_AngleAxis角度转化&#xff1a;Matlab、Python、HalcRPY_Euler_Quaternion_AngleAxis角度转化&#xff1a;Matlab、Python、Halcon版本UR协作机器人和Franka机器人导出的位姿为angleVector&#xff0c;三个量表示&#xff0c;在Matlab中angleVector是四个…

基本注射/资格赛,范围

这是上周解决的DI / CDI基础知识的延续-在本文中&#xff0c;我将讨论基础注入&#xff0c;限定词和范围。 在上一个主题中&#xff0c;我们提供了有关DI / CDI概念的大量信息&#xff0c;我们还讨论了如何使用注释加载这些bean或类-这构成了对象的组成并创建了关于如何进行采…

100*100的 canvas 占多少内存?

题目 100*100的 canvas 占多少内存&#xff1f; 在 三年前端&#xff0c;面试思考 中提到了一个题目&#xff0c;非常有新意&#xff0c;这里分享一下当时面试的思考过程。 解题思路 其实真正的答案是多少我并不清楚&#xff0c;面试过程中面试官也不期待一个准确的答案&am…

1t硬盘怎么分区最好_这下尴尬了,电脑硬盘分区常见误区,移动硬盘分区方法...

大家买了新电脑硬盘要不要分区呢&#xff1f;像以往咱们买了新电脑一般会分4个区&#xff0c;C、D、E、F&#xff0c;方便更合理的分类使用&#xff0c;比如把工作放为D盘&#xff0c;娱乐影音放为E盘&#xff0c;游戏放为F盘&#xff0c;C盘为系统盘。不过渐渐地发现&#xff…

用Spring长轮询Tomcat

就像喜剧演员弗兰基 豪威尔 &#xff08; Frankie Howerd&#xff09;所说的“哦&#xff0c;小姐小姐” &#xff0c;但足够多的英国影射和双重诱惑&#xff0c;因为长轮询雄猫对隔壁的闷气不是某种性偏见&#xff0c;这是一种技术&#xff08;或更像是一种骇客&#xff09;由…

exchange 删除邮件

一 批量删除特定主题的邮件1.1 批量删除所有数据库中特定主题的邮件1) 群发了几封主题为“backup”的邮件&#xff1b; 2) 当前操作账号需要满足如下需求&#xff1a; a)该账号需属于Exchange Server 管理员角色以及源服务器和目标服务器的本地 Administrator组&#xff1b; b)…

js点击取消按钮关闭当前弹框_UI设计中“取消按钮”的分析详解

按钮&#xff0c;无论是在 Web 还是 App 上都被广泛地使用&#xff0c;而很少有设计师会注意到按钮当中的细节&#xff0c;导致在设计过程中出现一些低级的错误&#xff0c;使得用户在完成任务的过程中产生阻碍&#xff0c;无法顺利达成目的。在许多优秀的产品中&#xff0c;关…

MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...

windows程序设计——飞机大战笔记(单文档文件登陆界面)//2015/07/21/by xbw////环境 VS 2013飞机大战做的差不多了&#xff0c;闲来无事加点高大上的东西&#xff0c;关于单文档的登陆界面&#xff1b;&#xff1b;&#xff1b;界面有点丑&#xff0c;但是足够账号登陆了&#…

吸收Mockito的流利度

我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统&#xff0c;而另一个虽然不是用Java编写的&#xff0c;却提供了Java API。 我将这些系统分别称为Foo和Bar。 在编写一行代码之前就很明显了&#xff0c;但是&#xff0c;测试最终的适配器将…

软件工程第三次作业

题目要求 最大连续子数组和&#xff08;最大子段和&#xff09; 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。 当所给的整数均为负数时定义子段和为0&#xff0c;依此定义&a…