资源泄漏如何处理_处理缓慢的资源泄漏

资源泄漏如何处理

使用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/347693.shtml

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

相关文章

Integer包装类特殊之处

Integer内部定义了IntegerCache结构,IntegerCache中定义了 Integer[],保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在 -128~127范围内时,可以直接使用数组中的元素,不再去new了。目的…

php中间件怎么使用,laravel框架中间件简单使用方法示例

本文实例讲述了laravel框架中间件简单使用方法。分享给大家供大家参考,具体如下:laravel内置了一个中间件来验证用户是否经过认证,如果用户没有经过认证,中间件会将用户重定向到登录页面,否则如果用户经过认证&#xf…

在Spring WebFlux中创建多个RouterFunction

在这篇文章中,我们将研究在Spring WebFlux中为不同的逻辑域定义多个路由器功能。 如果您正在创建“微服务”,则可能不会出现问题,因为您很可能仅在每个服务的单个域中工作,但是如果不是这样,则可能需要在应用程序中包含…

cstart做int型转换运算Java,java 实验报告1.docx

甘肃政法学院本科生实验报告(一)姓名:俞晓学院:信息工程学院专业:信息管理与信息系统班级:13级信管班实验课程名称:JAVA SE课程实验指导教师:李瑞生 教师实验成绩:实验日期: 2015 年 3 月 24 日开课时间: 2014-2015 学年 第二 学期甘肃政法学…

Java面向对象(15)--static关键字静态理解与使用

类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用…

JSON补丁:JSON-P 1.1概述系列

Java EE 8包括对JSON处理API的更新,并使其与JSON的最新IEFT标准保持同步。 他们是: JSON指针 RFC 6901 JSON补丁 RFC 6902 JSON合并修补程序RFC 7396 我将在这个迷你系列中涵盖这些主题。 入门 要开始使用JSON-P,您将需要Maven中央存储库…

Java面向对象(16)--单例(Singleton)设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设…

mac php 超时,PHP---Mac上开启php错误提示

发现在使用mac 上 PHP开发项目的时候,程序代码错误的时候没有错误提示,只是提示白板。研究和查找资料才调整了一下; 步骤如下:1.找到php.ini文件如图所示:1)找到 display_errors Off ,把Off 改为 On . 最后为 display…

tomcat 轮询_用Spring长轮询Tomcat

tomcat 轮询就像喜剧演员弗兰基 豪威尔 ( Frankie Howerd)所说的“噢,小姐小姐” ,但足够多的英国影射和双重诱惑,因为长轮询Tomcat对隔壁的闷气不是某种性的偏见,这是一种技术(或更像是一种hac…

单例(Singleton)设计模式应用场景

网站的计数器,一般也是单例模式实现,否则难以同步。 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 数据库连接…

免费网络研讨会:Java应用程序中的吞咽异常

1月30日参加我们的网络研讨会,以发现Java应用程序中的“隐藏”异常。 如果一棵树落在森林中,但是没有写到原木上,它会发出声音吗? 答案是肯定的。 这些类型的错误可能会对用户体验造成严重影响,而没有根本原因的可见性…

php bloginfo templatedirectory,WordPress函数:bloginfo(显示博客信息)

描述显示你的博客信息&#xff0c;大部分都是显示WordPress管理界面的 用户资料 和 常规设置 中的信息。它可以在模板文件的任何地方使用。一般 bloginfo() 都是用来直接在浏览器中输出内容的。如果你需要在PHP中返回值的话&#xff0c;那么请用 get_bloginfo()。用法<?php…

Java面向对象(17)--类代码块

静态代码块&#xff1a;用static 修饰的代码块 ①可以有输出语句。 ②可以对类的属性、类的声明进行初始化操作。 ③不可以对非静态的属性初始化&#xff0c;即&#xff1a;不可以调用非静态的属性和方法。 ④ 静态代码块随着类的加载而加载并执行&#xff0c;类加载一次&…

js 和java有关系吗,javascript和JAVA有什么关系

2017-07-28Java调用javascriptpackage co。test;import java。io。FileReader;import java。io。LineNumberReader;import org。mozilla。 javascript。Context;import org。mozilla。javascript。Function;import org。mozilla。javascript。Scriptable;public class JSExplor…

gson 入门_Google GSON入门

gson 入门在Java世界中&#xff0c;JSON已成为事实上的XML数据交换格式标准&#xff0c;因为它的易用性和传输效率高。 如果您不了解JSON&#xff0c;那就是Javascript对象表示法&#xff0c;这是一种基于文本的数据交换格式&#xff0c;是名称-值的集合&#xff0c;其中名称严…

Java面向对象(18)--final关键字使用

在Java中声明类、变量和方法时&#xff0c;可使用关键字final来修饰,表示“最终的”。 final标记的类不能被继承&#xff0c;提高安全性&#xff0c;提高程序的可读性 如&#xff1a;String类、System类、StringBuffer类。 final标记的方法不能被子类重写 如&#xff1a;Objec…

php 高级搜索下拉框,高级搜索页面advancedsearch.php调用自定义字段

下面跟大家谈的是关于”如何在在高级搜索页面advancedsearch.php调用自定义字段“方法&#xff1a;步骤&#xff1a;找到advancedsearch.php页面。$query "select main.id as aid,main.*,main.description as description1, type.* from $maintable main left join dede2…

创新设计模式:抽象工厂模式

抽象工厂模式是一种创建模式&#xff0c;是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象&#xff0c;而不是直接使用构造函数创建对象。 抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。 采用该模式的目的是使对…

php算法台阶,php如何解决青蛙跳台阶的问题(代码)

本篇文章给大家带来的内容是关于php如何解决青蛙跳台阶的问题(代码)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后…

Java面向对象(19)--抽象类与抽象方法abstract

用abstract关键字来修饰一个类&#xff0c;这个类叫做抽象类。 用abstract来修饰一个方法&#xff0c;该方法叫做抽象方法。 抽象方法&#xff1a;只有方法的声明&#xff0c;没有方法的实现。以分号结束&#xff1a; 比如&#xff1a;public abstract void talk(); 含有抽象…