Java性能调优调查结果(第三部分)

这是该系列文章的第三篇,我们将分析2014年10月进行的调查的结果。如果您尚未这样做,我建议从该系列的前两篇文章开始: 问题严重性分析和监视域分析 。 这篇文章着重于故障排除/根本原因检测。

本调查部分的背景:意识到性能问题并了解其对最终用户的影响足以采取行动后,请执行以下过程:

  • 重现问题。 您很少从足够的信息开始,因此第一步通常涉及重现问题以开始收集更多证据。
  • 收集证据。 要了解实际情况,您需要收集更多信息(例如,通过日志记录,线程/堆转储等)来了解情况。
  • 解释证据。 在收集了证据之后,对其进行任何理解可能仍然很棘手。 查看您的第一个堆转储并尝试找出导致内存泄漏的实际原因是一个很好的示例,其中解释部分可能会花费很多时间。
  • 将证据与实际根本原因联系起来。 在最终弄清证据之后,您可以开始查找导致实际问题的实际代码或配置项的链接。

上述过程通常是完全非正式的,但是在大多数情况下还是存在的。 为了了解情况,我们通过询问受访者以下问题来分析当前状况:

  • 您能够重现该问题吗?
  • 您如何收集证据以找到根本原因?
  • 您使用了哪些工具来收集证据?
  • 真正的根本原因是什么?

重现问题。

因此,正如我们所见,为了获得证据,您首先需要重现问题(最好随意)。 当我们问这个问题时,受访者说:

复制问题的能力

我们可以看到9%的受访者甚至不需要重现该问题,这可能是因为已经有足够的证据。 但是,有27%的听众无法重现该问题 ,这为解决问题的道路设置了一个非常讨厌的障碍–无法重现该问题,大多数故障排除工具会让您空手而归。 在这种情况下,整个过程常常成为痛苦的反复试验的噩梦。

用于收集证据的工具和技术

当您能够重现问题时,下一步的目标是收集更多证据。 为此,存在各种各样的工具和技术。 在我们的调查中,我们要求受访者列出其武器库。 284位受访者列出了以下1,101个选项:

用于找到根本原因的工具

最常见的证据来源显然是申请日志-71%的受访者确认这是使用的来源之一。 这不会让任何人感到惊讶,尤其是当您回想起大多数受访者具有工程背景时。 毕竟,应用程序日志是由开发人员自己编写的,因此这是一个相当熟悉的领域,可以开始解决任何问题。

证据收集的第二种最常用的技术是使用JVM内置工具 (例如jconsole,jmc,jstat,jmap等)。 60%的受访者正在使用这些工具来寻找实际的根本原因。 如果我们再次回忆起大多数受访者是工程师,那么这又再次变得有意义-JVM嵌入式工具对于工程师来说是众所周知的,因此比OS内置工具可能更喜欢使用。

分析器声称在领奖台上排名第三-答案中有46%列出了诸如Yourkit和JProfiler之类的工具。 的确,如果您能忍受它们构成的开销,则分析器在许多情况下都是适合该工作的工具,因此该职位应有充分的理由。

接下来,是时候分析堆转储和线程转储了。 分别有39%和36%的响应列出了转储分析作为使用的技术之一。 考虑到该领域中的底层工具,多少使这些工具最终被使用是令人惊讶的。

查找根本原因所涉及的下一组工具和技术包括GC日志,调试器,数据库日志和OS级工具。 在25%至32%的案例中提到了这些工具。 特别是OS工具出人意料地不受欢迎–考虑到您可以通过sar,top,iostat等获得的信息,它一定程度上与响应调查的人员数量少有关。

在另一端,我们有七位受访者诚实地说他们转向了外部帮助。 在使用APM工具设法找到根本原因的受访者中,有 31位,即11% 。 这与我们的经验相符–当前的APM工具擅长于评估性能事件的影响,尤其是根据用户体验来衡量时。 大多数APM提供程序还擅长在基础架构中定位故障节点。 但是,在此级别上,APM提供的见解通常会停止,而其他各种工具也将接管。

此阶段使用的大量工具肯定超出了我们的期望。 一个普通用户在设法收集足够的证据之前使用了不少于四种不同的工具

实际根本原因

我们要问的最后一个问题是找出触发性能事件的真正根本原因。 我们收到的778个回复分为以下几类:

绩效问题根源

在本节中,我们必须承认,由以内存泄漏检测功能闻名的公司发起的调查肯定会使结果歪曲。 根据我们的结果,内存泄漏是迄今为止最常见的性能瓶颈,我们实际上拒绝相信自己。

接下来的两个根本原因是一致的-创建太多数据库查询或效率低下的数据库查询实际上符合许多人的期望。 36%的受访者将这些问题之一列为当前性能问题的根本原因。

同步问题非常普遍,其中有24%的受访者认为同步不良是造成性能瓶颈的根本原因。 正如我们最近在该领域发布的解决方案一样,它很好地证明了我们自己的测量结果。 除此之外,考虑到大多数Java EE开发人员应该与并发算法完全隔离,这仍然是一个令人惊讶的结果。

接下来列出了缓存不良和GC效率低下的问题,分别有22%和21%的受访者将这些问题视为根本原因。 确实可以将这两者一起看待,因为前者经常触发第二个-构建不良的缓存往往会浪费大量时间,从而引发恶性循环,使GC难以应对。

解释其余的根本原因将使职位的长度超出合理的长度。 还有一件值得注意的事情是,可观的数量(10%)的受访者诚实地说他们不知道是什么原因导致了绩效错误。 这再次证实了以下事实:根本原因检测是一个复杂的领域,迫切需要改进工具。

翻译自: https://www.javacodegeeks.com/2014/11/java-performance-tuning-survey-results-part-iii.html

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

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

相关文章

划分树

昨天的杭电多校联合训练热身赛的一道题,求区间的中位数,快排会超时,划分树的模版题。。 划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值 。划分树和归并树都是用线段树作为辅助的…

Canvas事件绑定

canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等。那我们想给canvas里的某一张图片添加一个点击事件该怎么做到。而js只能监听到canvas的事件,很明显这个图片是不存在与dom里面…

使用Maven配置JBoss / Wildfly数据源

大多数Java EE应用程序在其业务逻辑中使用数据库访问,因此开发人员经常面临在应用程序服务器中配置驱动程序和数据库连接属性的需求。 在本文中,我们将使用Maven为JBoss / Wildfly和Postgre数据库自动化该任务。 这项工作是根据我从以前的魔兽拍卖批量应…

控件注册 - 利用资源文件将dll、ocx打包进exe文件(转)

很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个exe,点击直接运行呢?就像很多安全控件,如支付宝的aliedit.exe那样。 现在介绍一种使用资源文件,将…

Canvas-图片旋转

Canvas-图片旋转 众所周知canvas是位图,你可以在里面渲染你要的东西,不过你只能操作canvas的属性来进行编辑。就是说你并不能操作画进canvas的东西,例如我在canvas里添加一幅画,我现在想将那幅画移动10px,我们并不能直…

在嵌入式Neo4j中使用Neo4j浏览器

有时候,您有一个应用程序以嵌入式模式使用Neo4j,但还需要使用Neo4j Web浏览器来处理图形。 由于一次最多只能从一个进程访问数据库,因此在嵌入式Neo4j应用程序运行时尝试启动Neo4j服务器将无法工作。 WrappingNeoServerBootstrapper尽管已被…

CSS3实现多页签图片缩放切换效果

多页签切换效果,图片缩放,鼠标移动到图片上后显示文字内容等等,效果很集中呐 截图如下: 下载地址:http://www.lanrenzhijia.com/js/css3/2012/0718/602.html 预览地址:http://www.lanrenzhijia.com/yulan/2…

正则表达式学习笔记

该笔记内容通过《Learn regular expressions in about 55 minutes》整理得到。 文章链接:https://qntm.org/files/re/re.html 其中文翻译很多,中文名叫:55分钟学会正则表达式。 实际上我也算过了,55分钟实在不太可能,也…

清洁单元测试图案–演示幻灯片

我有机会在2014年GDG DevFestKarlsruhe会议上谈论“清洁单元测试模式”。 感谢组织者邀请我,也感谢所有听我讲话的人。 如所承诺的,我为那些想看一下我在演讲中没有讲到的其他幻灯片的人分享了演示文稿: 清洁单元测试图案 JUnit测试并不像看…

“取反”运算符

“取反”运算符转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/24/3845558.html

Angular使用总结 --- 如何正确的操作DOM

无奈接手了一个旧项目,上一个老哥在Angular项目中大量使用了JQuery来操作DOM,真的是太不讲究了。那么如何优雅的使用Angular的方式来操作DOM呢? 获取元素 1、ElementRef --- A wrapper around a native element inside of a View. 在组件…

Hibernate Collection乐观锁定

介绍 Hibernate提供了一种乐观的锁定机制 ,即使长时间通话也可以防止丢失更新 。 结合实体存储,跨越多个用户请求(扩展的持久性上下文或分离的实体),Hibernate可以保证应用程序级的可重复读取 。 脏检查机制检测实体状…

非首屏图片延时加载

目标 减少资源加载可以明显的优化页面加载的速度,所以可以减少页面载入时立即下载的图片的数量,以提高页面加载速度,其他的图片在需要的时候再进行加载。 思路 想要实现以上的目标,有几个地方需要思考。 1、如何判断哪些图片需要…

具有链接资源的Spring RestTemplate

Spring Data REST是一个了不起的项目,它提供了一些机制来将基于Spring Data的存储库中的资源公开为REST资源。 使用链接资源公开服务 考虑两个简单的基于JPA的实体,课程和教师: Entity Table(name "teachers") public class Tea…

POJ 1521 Entropy

求哈夫曼树的平均码长,用优先队列来写,先记录某个字符在字符串里出现的次数,然后放入 队列。依次取出第一小和第二小的数,将两个数相加,构成新的虚拟结点,放入队列中。 /*Accepted 196K 0MS C …

事件处理详解

前言 本文大概整理下绑定事件的几种方式,兼容IE8- 的方式(如果需要的话),事件委托,阻止传播,取消默认行为,event对象等。 之前做的多是手机端页面,监听事件也一直是 addEventListene…

用户会话,数据控件和AM池

最近,有人问我有关应用程序模块池的有趣问题。 众所周知,AM池包含用户会话引用的应用程序模块实例,这允许会话在后续请求时从池中获取完全相同的AM实例。 如果应用程序中有多个根应用程序模块,那么每个模块都将拥有自己的AM池&am…

对Group_concaT函数利用剖析 (转)

作者:晓华 开篇介绍 在FLYH4T大哥的“Mysql5注射技巧总结”一文中介绍了通过使用“information_schema”库实现遍历猜解库名表名以及字段名的技术,解决了一些以前使用工具无法猜解到的库名表名以及字段名的问题,提高了注射的效率。关于此文的…

用 CSS 实现元素垂直居中,有哪些好的方案?

DIV居中的经典方法 1. 实现DIV水平居中 设置DIV的宽高,使用margin设置边距0 auto,CSS自动算出左右边距,使得DIV居中。 1 div{ 2 width: 100px; 3 height: 100px; 4 margin: 0 auto; 5 } 缺点:需要设置div的宽度 2.…

使用wss和HTTPS / TLS保护WebSocket的安全

是这个博客的第50条提示,是的! 技术提示#49说明了如何使用用户名/密码和Servlet安全机制保护WebSocket的安全。 本技术提示将说明如何在WildFly上使用HTTPS / TLS保护WebSocket。 让我们开始吧! 创建一个新的密钥库&#xff1a…