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

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等获得的信息,它一定程度上与响应调查的人员数量少有关。

在另一端,我们有7位受访者诚实地说他们转向了外部帮助。 在使用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

java 性能调优

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

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

相关文章

不懂指针类型,7个例子给你讲明白

1. int va;这是一个整型变量,32位CPU的话,占有32个bite2. int *va;这是一个整型指针变量,用于存放一个整型变量的地址,3. int **va;这是一个整型的二级指针,用于存放一个内存的地址,该地址对应的内存中存放…

Tomcat与Netty比较

Tomcat介绍Tomcat支持的协议Tomcat的优缺点Netty介绍Netty支持的协议Netty的优点和缺点Tomcat和Netty的区别Tomcat和Netty的应用场Tomcat和Netty来处理大规模并发连接的优化Tomcat与Netty的网络模型的区别Tomcat与Netty架构设计拓展 Tomcat介绍 Tomcat是一个免费的、开放源代码…

C或C 如何通过程序执行shell命令并获取命令执行结果?

1 应用场景最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容。但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出。2 扩展性由于应用场景本就广泛,因此扩展性较好。此函数可以执行任意命令&…

linux centos7安装ngix,centos7 环境下安装nginx--Linux

本文将要为您介绍的是centos7 环境下安装nginx--Linux,具体完成步骤:一、安装前需要的编译环境准备1、安装makeyum install -y gcc automake autoconf libtool make2、安装gcc、gcc-cyum install -y gcc gcc-c3、关闭防火墙iptables -F4、关闭selinux#临时关闭:sete…

primefaces_使用PrimeFaces开发数据导出实用程序

primefaces我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容,因为我们依赖于企业级的数据管理。 有时,具有将数据提取为简单格式(例如电子表格)的功能很有用,以便我们可以按需进行操作。 这篇文章概述…

如何优雅地实现判断一个值是否在一个集合中?

如何判断某变量是否在某个集合中&#xff1f;注意&#xff0c;这里的集合可能并不是指确定的常量&#xff0c;也可能是变量。版本0#include int main(){int a 5;if(a 1 || a 2 || a 3 || a 4 || a 5){std::cout<<"find it"<<std::endl;}return 0;…

骚操作:利用强弱符号制作插件库

当有强符号和弱符号时&#xff0c;选择使用强符号那么我们正可以利用这个原则做以下事情&#xff1a;定义为弱符号&#xff0c;如果是弱符号&#xff0c;使用默认行为如果链接了库&#xff0c;是强符号&#xff0c;则使用外部定义行为以此来实现一个类似插件的功能。通俗一点说…

c语言里 t是什么作用,c语言里的\t是什么意思

c语言里的&#xff3c;t是什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;c语言里的&#xff3c;t是什么意思正宗叫法是“水平制表符”&#xff0c;就是在输出媒体上水平跳过多个空格…

函数或全局变量重复定义时会怎样?

可能有些朋友第一反应是&#xff0c;那肯定是编译不过喽&#xff1a;// fun.c #include void func() {printf("编程珠玑\n"); }// main.c #include void func() {printf("公众号\n"); } int main(void) {func();return 0; }编译&#xff1a;$ gcc -o main …

当C语言函数执行成功时,返回1和返回0究竟哪个好?

基本上&#xff0c;没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高&#xff0c;耦合性低的原则&#xff0c;尽可能的将代码拆分不同的功能模块&#xff0c;并封装成函数。C语言代码的组合千变万化&#xff0c;因此函数的功能可能会比较复杂&#xf…

ubuntu自定义安装里怎么选_超市里的五香粉怎么选?看懂配料表,两个小技巧,不怕选不好。...

点击右上角【关注】&#xff0c;可获得本头条号推荐的更多美食干货五香粉是家庭常用的一种调味料&#xff0c;焖、炖、烧、煮、卤都常备使用&#xff0c;如今市场上的五香粉品牌也是相当繁多&#xff0c;质量也是参差不齐&#xff0c;有时买到的五香粉烧制的菜肴根本就不好吃&a…

原来C语言还可以这样实现“泛型编程”!

在回答标题问题之前&#xff0c;先了解下什么是泛型编程。泛型编程&#xff08;generic programming&#xff09;是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型&#xff0c;在实例化时作为参数指明这些类型。C支持…

javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote

javadoc 标签如果您已经在使用Java 8&#xff0c;则可能会看到一些新的Javadoc标签&#xff1a; apiNote &#xff0c; implSpec和implNote 。 他们怎么了&#xff1f; 如果要使用它们&#xff0c;该怎么办&#xff1f; 总览 该帖子将快速查看标签的来源和当前状态。 然后&…

C语言入门基础之输入和输出

标准输入函数在stdio.h中scanf声明如下&#xff1a;/* Read formatted input from stdin.This function is a possible cancellation point and therefore notmarked with __THROW. */ extern int scanf (const char *__restrict __format, ...) __wur;使用Mac或Linux的同学&am…

camel java_与Java EE和Camel的轻量级集成

camel javaEnterprise Java具有不同的风格和观点。 从简单的平台技术&#xff08;众所周知的Java EE&#xff09;开始&#xff0c;到不同的框架和集成方面&#xff0c;最后是涉及以数据为中心的用户界面或特定可视化效果的用例。 Java EE本身无法解决的最突出的问题是“集成”。…

c语言 伪随机数程序,C语言的伪随机数

一直想好好的系统的学习一下C语言的伪随机数&#xff0c;今天终于逮到机会了伪随机数C语言中有可以产生随机数据的函数&#xff0c;需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。先来介绍一下srand头文件&#xff1a;定义函数&#xff…

最大隶属度原则_模糊数学笔记:六、模糊模型识别-I(最大隶属度原则)

1、模型识别的问题提出模型识别&#xff0c;通俗地理解即是对一个类别未知的对象进行归类&#xff08;或者叫分类&#xff09;。这里与聚类不同的是&#xff0c;聚类实际上是要区分出已有的样本哪些属于同一类&#xff0c;但并没有参考标准。而识别则事先有参考的标准&#xff…

C语言经典题

C 库函数 - tanh()描述C 库函数 double tanh(double x) 返回 x 的双曲正切。声明下面是 tanh() 函数的声明。double tanh(double x)参数x -- 浮点值。返回值该函数返回 x 的双曲正切。实例下面的实例演示了 tanh() 函数的用法。#include#include int main (){ double x, ret;…

C++11的模板改进

C11关于模板有一些细节的改进&#xff1a;模板的右尖括号模板的别名函数模板的默认模板参数模板的右尖括号C11之前是不允许两个右尖括号出现的&#xff0c;会被认为是右移操作符&#xff0c;所以需要中间加个空格进行分割&#xff0c;避免发生编译错误。int main() {std::vecto…

android 第三方圆弧进度条,android 可配置的圆弧进度条

Arc ProgressBar Configurable 圆弧环形进度条DEMOAttributesnameformatdescriptionborderWidthinteger圆弧边框的宽度progressStyletick/arc进度条类型&#xff0c;tick 为带刻度的radiusinteger半径arcbgColorcolor圆弧的边框背景degreeinteger弧度&#xff0c;设置为 0 即为…