内存泄漏–测量频率和严重性

这篇文章是我们开放文化的一部分-我们继续分享日常工作中的见解。 这次,我们窥视了我们价值主张的核心,即–寻找以下问题的答案:

  • Java应用程序中多长时间发生一次内存泄漏?
  • 内存泄漏有多大?
  • 内存泄漏增长多快?

如果您接下来的几分钟与我在一起,我将根据过去六个月内Plumbr内存泄漏检测器代理收集的数据,一个一个地打开答案。

首先,该分析基于与Plumbr代理一起运行的2,180种不同应用程序 。 “不同应用程序”的定义有些棘手,我为您省去了世俗的细节,但是我们尽力根据可用数据来标识唯一的JVM。

在这2180个应用程序中, Plumbr发现了754种不同的堆内存泄漏 。 由于某些应用程序包含多个内存泄漏,因此检测到泄漏的唯一应用程序的数量要少一些-准确地说是682。 根据这些数据,我们可以得出结论: 31%的Java应用程序包含堆内存泄漏 。 对此一针见血–我们确实承认,Plumbr最终监视的应用程序比我们不监视的应用程序更可能包含内存泄漏。

现在,知道您的应用程序中有大约三分之一的机会发生堆内存泄漏,让我们看看是否应该担心泄漏。 为此,让我们看一下这754个堆内存泄漏的两个不同特征。

内存泄漏大小

当Plumbr发现内存泄漏时,它将运行复杂的计算以确定泄漏的保留大小。 或者,以更简单的方式– Plumbr计算特定泄漏的大小(以兆字节为单位)。 下表显示了该数据:

内存泄漏大小

从数据中我们可以看到,Plumbr在婴儿期就发现了许多泄漏-例如,它发现了187个泄漏(占总泄漏的25%),而在发现时泄漏仍小于1MB 。 在另一种极端情况下,检测到一些泄漏需要更长的时间,因此在31种情况下,只有在泄漏到1GB之后才检测到泄漏。 在发现之前,最大的泄漏已设法升级到3GB。

从上面得出的另一个有趣的结论是,大多数泄漏是在应用程序的最终用户感受到任何影响之前被Plumbr捕获的–在Plumbr报告泄漏为事件时,泄漏的70%仍小于100MB。

内存泄漏速度

现在,应用程序包含的泄漏不足100MB的事实已成为不可采取的措施。 将泄漏的大小与泄漏的速度耦合起来,事件的严重性变得更加清楚:

记忆泄漏速度

上图的信息可以这样解释:对于6%(37次出现)的情况,发现时的泄漏速度在100到500 MB /小时之间。

在极端情况下,我们的泄漏速度非常慢或非常快。 在398次(发现泄漏的53%)中,泄漏以每小时1MB或更少的速度递增。 在频谱的另一端,我们以31GB /小时或更快的速度增加31个泄漏 。 在这方面,“记录保存者”每小时的泄漏量超过3GB。

结合速度信息与应用程序当前的泄漏大小和最大堆可用信息,您可以估计特定应用程序在崩溃前所剩下的时间,并导致OutOfMemoryError

上周五的一个特定示例:Plumbr报告了一次泄漏大小为120MB的事件。 泄漏速度为每天160MB。 将这些信息与当前的堆使用情况和可用的最大堆链接在一起,我们可以预测到特定的JVM将在星期二下午2点之前消失。 我们错了六个小时,如果考虑到应用程序使用模式会随着时间的推移而发生变化,这是预测游戏的一部分,那么预测就足够接近了。

翻译自: https://www.javacodegeeks.com/2014/09/memory-leaks-measuring-frequency-and-severity.html

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

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

相关文章

域名发散和收敛

什么是域名发散? 域名发散就将静态资源分布在不同的子域名下,这是PC时代网页常用的静态资源加载技术 为什么要使用域名发散? 现代浏览器对每个域名的并发请求数大约在6个,IE 稍显傲娇,总体而言并发数不高。通过将静态资源放在…

从JDBC ResultSet创建对象流

Java 8中引入了Stream API和Lambda功能 ,使我们能够从JDBC ResultSet优雅地转换为仅提供映射功能的对象流。 这种功能当然可以是lambda。 基本上,这个想法是使用ResultSet作为Supplier来生成Stream: public class ResultSetSupplier impleme…

bootstrap-select控件全选,全不选,查询功能实现

先引入先在你的页面引入 bootstrap-select.css 和 bootstrap-select.js <link href"~/Content/plugins/bootstrap-select/bootstrap-select.min.css" rel"stylesheet" /> <script src"~/Content/plugins/bootstrap-select/bootstrap-select.…

Java开发常识资料

一、Java基础JSE 核心基础&#xff08;程序设计语言&#xff09;&#xff1a;《Think in java》 (参考阅读&#xff1a;《Core Java》JAVA2核心技术第1卷.基础知识) 阅读《Effective java第二版》集合容器主题&#xff1a;util包各种数据结构和算法多线程主题&#xff1a;concu…

Eclipse扩展点评估变得容易

对Eclipse扩展点进行编码的评估有些冗长&#xff0c;而且很少能自我解释。 最近&#xff0c;我开始忙于处理这个主题&#xff0c;我写了一个小助手&#xff0c;目的是减少通用编程步骤的样板代码&#xff0c;同时增加开发指导和可读性。 它原来是不容易找到一个表现的解决方案…

判断js中数据类型 的最短代码

判断字符串类型的&#xff1a;function isString(obj) {return obj "" obj;}判断bool类型的&#xff1a;function isBool(obj){return obj !!obj;}判断数字类型的&#xff1a;function isNumber(obj){return obj -obj;} 更多专业前端知识&#xff0c;请上 【猿2048…

python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记

python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记 此篇为上一篇pyqt5图像压缩小工具改良版。因为比较简单&#xff0c;下面直接贴上代码。 效果图&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file hellopyqt5.ui # # Crea…

c++面试题(1)

1. 构造函数与析构函数是否可以被重载&#xff0c;为什么&#xff1f; 2. 指针和引用的区别。 3. malloc和new的区别。 4. 字符串反转。用两种方法&#xff0c;第二种方法只用一个数串&#xff0c;直接互换。 5. 一个time类&#xff0c;包含minu…

开发人员需要了解的有关xPaaS的一切

最近&#xff0c;我一直在阅读有关Red Hat产品的很多文章&#xff0c;并且对云等也很感兴趣&#xff0c;对于我来说&#xff0c;更详细地研究Red Hat的云产品是很明显的。 Arun在今年4月对JBoss xPaaS进行了很好的概述&#xff0c;我认为可能不但应该给您一个概述&#xff0c;而…

Mybatis与Spring整合

Mybatis与Spring整合 既然我们已经学了Mybatis的基本开发了&#xff0c;接下来就是Mybatis与Spring的整合了&#xff01; 以下使用的是Oracle数据库来进行测试 导入jar包 aopalliance.jarasm-3.3.1.jaraspectjweaver.jarc3p0-0.9.1.2.jarcglib-2.2.2.jarcommons-logging.ja…

算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

堆基础 堆(Heap)是具有这样性质的数据结构&#xff1a;1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值&#xff1a; 图片来源&#xff1a;这里 堆可以用数组存储&#xff0c;插入、删除会触发节点shift_down、shift_up操作&#xff0c;时间复杂度O(logn)&#xff…

C++静态数据成员和静态成员函数

在C面向对象编程过程当中&#xff0c;对象与对象之间的数据不是共享&#xff0c;在设计类的时候&#xff0c;有时候需要一些对象之间共享的数据&#xff0c;除了把所要共享的数据设置为全局数据或者函数之外&#xff0c;还可以利用C的静态机制。 1、静态数据成员 class 类名 {…

带有AOP和注释的Java方法记录

有时&#xff0c;我想记录&#xff08;通过slf4j和log4j &#xff09;方法的每次执行&#xff0c;查看其接收的参数&#xff0c;返回的内容以及每次执行需要多少时间。 这是我在AspectJ &#xff0c; jcabi-aspects和Java 6注释的帮助下进行的操作&#xff1a; public class F…

JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】

什么是JDBC JDBC全称为&#xff1a;Java Data Base Connectivity,它是可以执行SQL语句的Java API 为什么我们要用JDBC 市面上有非常多的数据库&#xff0c;本来我们是需要根据不同的数据库学习不同的API&#xff0c;sun公司为了简化这个操作&#xff0c;定义了JDBC API【接口…

mysql binlog空间维护

默认情况下&#xff0c;mysql主从同步的binlog日志&#xff0c;会一直保存。 对于如果已同步好的数据&#xff0c;这显然比较浪费资源。 且如果生产环境磁盘太小&#xff0c;随时还会爆掉&#xff0c;所以很有必要作好binlog的空间维护。 以下操作&#xff0c;直接在master上操…

UVA 10604 Chemical Reaction

UVA_10604 一开始看错题了&#xff0c;以为化学物质最多会有10个&#xff0c;所以定义不了10维的去跑&#xff0c;便用了类似状态压缩的方式&#xff0c;把化学物质的状态压缩成一个整数&#xff0c;然后用哈希表建立一个索引&#xff0c;再用记忆化搜素去处理就可以了。 之所以…

一键发布到Maven Central的方法

当我向Maven Central发布Java开源库jcabi-aspects的新版本时&#xff0c;我花费了30秒钟的时间。 甚至更少。 最近&#xff0c;我发布了0.17.2版本。 您可以在Github第80期中看到所有情况&#xff1a; 如您所见&#xff0c;我向Rultor发出了命令&#xff0c;它向Maven Central…

vue组件详解(一)——组件与复用

一、什么是组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 二、组件用法 组件需要注册后才可以使用&#xff0c;注册有全局注册和局部注册两种方式。 2.1 全局注册后&#xff0c;任何V ue 实例都可以使用。如&am…

fatal error LNK1120: 1 unresolved externals

出现这个错误可能原因很多&#xff0c;我的问题是来自于把template写在了cpp文件中template 有弊端 就是 他的实现部分必须和声明部分在一起 你声明在一个头文件 定义在另一个头文件 编译器好笨!!!!!!!!!,它根本就找不到 ///只要你把实现部分拷贝到你声明的头文件,就没有错…

sed命令学习

sed编辑器&#xff0c;处理文本过程如下&#xff1a; sed把当前处理的行保存在一个临时缓冲区中&#xff0c;然后处理缓冲区中的行&#xff0c;完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除&#xff0c;然后下一行读入&#xff0c;处理和显示。处理完输入…