我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么进行Java EE性能测试与调优

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么进行Java EE性能测试与调优

这篇文章主要讲解了“怎么进行Java EE性能测试与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么进行Java EE性能测试与调优”吧!

性能测试的目标

性能测试不同于功能测试,不是对与错的检验,而是快与慢的衡量。在进行真正的性能测试之前要先搞清楚目标:

在确定的硬件条件下,可以支持的并发数越大越好,响应时间越快越好。具体需要达到的并发数是多大,要求的响应时间是多快,由产品经理来提出。

在确定的硬件条件下,测试得到***并发数和相应的响应时间之后。如果增加硬件投入,可以得到怎样的性能提升回报? (系统扩展性和伸缩性测试,Scalability)

这里的硬件条件包括:cpu,memery,I/O,network bandwidth。

性能测试中的基准测试 Benchmarking

与功能测试相似,性能测试也要设计测试用例,不同的是在正式开始你的业务测试用例之前你要先进行一下基准测试。为什么呢?其实就是先要量一下你的硬件的能力,不然,如果你的测试结果不好,你怎么知道是硬件慢还是你的软件的问题。这些硬件测试包括:

网络带宽测试, 你可以通过copy大文件的方式测试你的网络的***带宽是多少。

cpu,你可以利用比较复杂的算法来衡量cpu的快慢

memery,这个不用测试,你知道memery的大小

IO, 也可以通过copy大文件来测试

这些基准测试用例在后面的调优过程中,还可以用来衡量你修改之后真的变好了吗。

设计你的业务测试用例

比较理想的测试用例就是要尽可能模仿真实世界的情况,这往往做不到,尤其是对于新产品来说。你可以先录制一些用户最常用,最典型的case作为起点。

另外,对于并发的概念需要搞清楚。并发用户,通常是指同时在线的用户,这些用户可以能在用你的系统的不同的功能,注意并不是说大家都在做同一件事情。对某一个事务并发请求是指某一个request的并发调用。

对于后一种并发,你往往需要计算在用户量***的时候,大概大家都集中的在干哪一件事情,这个请求一定要够快才好。

设计好这两种测试用例以后,在后面的调优过程中,他们就成了衡量你的改进的成效的衡量的标尺。

性能调优

性能调优要从底层开始,基本上要从OS开始,到JVM,Cache,Buffer Pool, SQL,DB Schema, 算法。

一次不要改的太多,改一点,测一下,这可是个慢功夫,需要有耐心。

在执行测试的时候还要注意,要遵循相同的过程,系统需要在重启之后先热身再开始真正的测试,不然你会发现你的测试结果很不一样,琢磨不定。

还有,要注意你的客户端的能力,比如JMeter,很需要内存,别因为客户端不行,误以为是你的系统的问题,那就太乌龙了。

在测试调优的时候,需要借助一些监控工具比如JConsole,来监控系统的状况,找到系统的瓶颈,所谓瓶颈,就是最慢的那个部分,也常表现为100%被占满。比如你的内存或者cpu被用尽了。如果cpu和内存还没有用尽,说明他们在等某个资源。这时候需要用profile工具去寻找,比如JProfile,YourKit。

利用性能监控日志

因为性能的问题不是很容易重现,当product环境中遇到性能问题的时候,如果是数据的问题,也许当你把product 数据copy到你的测试环境中,就能重现比较慢点查询,加以改进。但是如果是并发用户或者网络等运行时环境的问题,你就很难重现。这时,如果你能通过日志看到那些关键的响应慢的方法,也许可以帮助你快点找到问题所在。下面的代码可以帮你做到这一点,仅供参考:

import org.slf4j.Logger;          public class TraceUtil {         final Logger logger;         final long threshold = 1000;         private long begin;         private long offtime = 0;         private String threadInfo;         private String targetId;              public TraceUtil(Logger logger, Thread thread, String targetId, long begin) {             this.logger = logger;             this.threadInfo = thread.getId() + "-" + thread.toString();             this.targetId = targetId;             this.begin = begin;         }              public void trace(String targetEvent) {             long duration = System.currentTimeMillis() - begin;             long increment = duration - offtime;             offtime = duration;             float percentage = (float) increment / (float) duration * 100;             if (duration > threshold && percentage > 20) {                 logger.error(                         "Response time is too large: [{}], {}/{} ({}), {}, {}",                         new String[] { threadInfo + "", increment + "",                                 duration + "", percentage + "%", targetEvent,                                 targetId });             }              }          }

利用JVM的MXBean找到blocked的点

当你发现JVM占用的cpu很高,而且响应时间比较慢,很可能是被IO或者网络等慢速设备拖住了。也有可能是你的方法中某个同步点(同步方法或者对象)成为性能的瓶颈。这时候你可以利用JVM提供的monitor API来监控:

<%@ page import="java.lang.management.*, java.util.*" %>       <%!           Map cpuTimes = new HashMap();           Map cpuTimeFetch = new HashMap();       %>              <%       out.println("Threads Monitoring");       long cpus = Runtime.getRuntime().availableProcessors();       ThreadMXBean threads = ManagementFactory.getThreadMXBean();       threads.setThreadContentionMonitoringEnabled(true);       long now = System.currentTimeMillis();       ThreadInfo[] t = threads.dumpAllThreads(false, false);       for (int i = 0; i < t.length; i++) {           long id = t[i].getThreadId();           Long idObj = new Long(id);           long current = 0;           if (cpuTimes.get(idObj) != null) {               long prev = ((Long) cpuTimes.get(idObj)).longValue();               current = threads.getThreadCpuTime(t[i].getThreadId());               long catchTime = ((Long) cpuTimeFetch.get(idObj)).longValue();               double percent = (double)(current - prev) / (double)((now - catchTime) * cpus * 1000);               if (percent > 0 && prev > 0) {      out.println("<li>" + t[i].getThreadName()+"#"+t[i].getThreadId() + " Time: " + percent + " (" + prev + ", " + current + ") ");      String locked = t[i].getLockInfo()==null?"":t[i].getLockInfo().getClassName();      out.println(" Blocked: (" + t[i].getBlockedTime() + ", " + t[i].getBlockedCount() + ", " + locked + ")</li>");      }          }           cpuTimes.put(idObj, new Long(current));             cpuTimeFetch.put(idObj, new Long(now));       }       %>

同步是性能的一大瓶颈

通过监控发现,大量线程block在一个同步方法上,这样cpu也使不上劲。当你发现性能上不去,IO和网络等慢速设备也不是问题的时候,你就得检查一下是否在某个关键点上使用了同步(synchronizae)。有时候也许是你应用的第三方的jar里面的某个方法是同步的,这种情况下,你就很难找到问题所在。只能在编写代码的时候看一下你引用的方法是否是同步的。

感谢各位的阅读,以上就是“怎么进行Java EE性能测试与调优”的内容了,经过本文的学习后,相信大家对怎么进行Java EE性能测试与调优这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么进行Java EE性能测试与调优

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么进行Java EE性能测试与调优

这篇文章主要讲解了“怎么进行Java EE性能测试与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么进行Java EE性能测试与调优”吧!性能测试的目标性能测试不同于功能测试,不是对与
2023-06-17

SQLite中怎么进行性能调优

在SQLite中进行性能调优可以采取以下几种方式:使用索引:创建合适的索引可以大大提高查询的性能。确保为经常被用于查询条件的列创建索引,并避免使用过多的索引,因为索引会增加写操作的开销。优化查询语句:尽量避免使用复杂的查询语句和不必要的联合
SQLite中怎么进行性能调优
2024-03-11

怎么进行Spark的性能调优

怎么进行Spark的性能调优,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0、背景集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机
2023-06-19

PHP Session 跨域的性能测试与调优

引言:在使用PHP开发网站时,我们经常会用到Session来存储用户的信息和状态。然而,当网站存在跨域请求时,会给Session的性能带来一定的挑战。本文将介绍PHP Session跨域的性能测试与调优,并给出具体的代码示例。一、Sessi
2023-10-21

Couchbase中怎么进行性能调优和优化

Couchbase是一个高性能的NoSQL数据库,但是在特定情况下可能需要进行性能调优和优化。以下是一些常见的优化和调优方法:使用适当的硬件配置:确保服务器硬件能够支持负载和性能需求。可以考虑增加RAM、CPU和存储容量来提高性能。使用适当
Couchbase中怎么进行性能调优和优化
2024-03-08

Golang 技术性能优化中如何进行性能测试?

进行性能测试对于优化 go 应用程序至关重要,可以通过使用各种工具,例如 bencher、pprof、httperf 和 wrk,来评估应用程序在特定负载下的性能,包括响应时间、吞吐量和资源利用率等指标。实战案例中演示了如何使用 wrk 测
Golang 技术性能优化中如何进行性能测试?
2024-05-11

Linux服务器怎么进行性能测试

今天小编给大家分享一下Linux服务器怎么进行性能测试的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、Install sy
2023-06-28

Perl中怎么进行测试和调试

在Perl中进行测试和调试通常使用的工具包括Test模块和调试器。以下是一些常用的方法:使用Test模块进行单元测试:Test模块是Perl中用于编写和运行测试的标准模块。您可以使用Test::Simple、Test::More等模块来编写
Perl中怎么进行测试和调试
2024-03-05

怎么配置php.ini进行PHP性能调优

这篇文章主要介绍“怎么配置php.ini进行PHP性能调优”,在日常操作中,相信很多人在怎么配置php.ini进行PHP性能调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么配置php.ini进行PHP性
2023-06-29

MongoDB的性能基准测试与调优方法是什么

MongoDB的性能基准测试与调优方法如下:性能基准测试:使用工具如YCSB(Yahoo! Cloud Serving Benchmark)或者Sysbench进行基准测试,以评估MongoDB的读写性能、并发处理能力等。在测试过程中,可
MongoDB的性能基准测试与调优方法是什么
2024-05-07

Centos8下怎么使用Sysbench进行性能测试

本篇内容介绍了“Centos8下怎么使用Sysbench进行性能测试”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SysBench 是一个基
2023-06-27

如何在Python中进行代码性能优化和性能测试

如何在Python中进行代码性能优化和性能测试引言:当我们编写代码时,经常会面临代码执行速度慢的问题。对于一个复杂的程序来说,效率的提升可以带来明显的性能提升。本文将介绍如何在Python中进行代码性能优化和性能测试,并给出具体的代码示例。
2023-10-22

如何在MariaDB中进行性能优化和调试

在MariaDB中进行性能优化和调试可以采取以下几种方法:使用性能分析工具:MariaDB提供了一些性能分析工具,如EXPLAIN、SHOW PROFILE等,可以帮助你分析查询语句的性能瓶颈,找出优化的方法。使用索引:正确地使用索引可以
如何在MariaDB中进行性能优化和调试
2024-04-09

PostgreSQL中怎么进行性能调优和查询优化

在 PostgreSQL 中进行性能调优和查询优化可以通过以下几种方式来实现:使用合适的索引:创建索引可以加速查询操作,尤其是对于经常被查询的字段。在选择需要创建索引的字段时,可以考虑使用 WHERE 子句中经常被用到的字段以及 JOIN
PostgreSQL中怎么进行性能调优和查询优化
2024-03-12

Nginx负载均衡的性能测试与调优实践

概述:Nginx作为一款高性能的反向代理服务器,常用于负载均衡的应用场景。本文将介绍如何进行Nginx负载均衡的性能测试,并通过调优实践提升其性能。性能测试准备:在进行性能测试之前,我们需要准备一台或多台具备较好性能的服务器,安装Nginx
2023-10-21

Java使用JMH进行基准性能测试分析

本篇内容主要讲解“Java使用JMH进行基准性能测试分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java使用JMH进行基准性能测试分析”吧!一、前言在日常开发工作当中,开发人员可能有这些困
2023-06-25

C#开发经验分享:性能测试与调优经验

C#开发经验分享:性能测试与调优经验随着互联网技术的快速发展,软件开发行业也在不断壮大。在这个充满竞争的行业中,开发人员需要不断提升自己的技术水平,才能在激烈的竞争中脱颖而出。本文将分享一些关于C#开发中的性能测试与调优经验,希望能够对正在
C#开发经验分享:性能测试与调优经验
2023-11-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录