如何进行Java EE性能测试与调优

发表于:2012-4-20 11:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:祥哥的珍藏    来源:51Testing软件测试网采编

  利用JVM的MXBean找到blocked的点

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

  1. <%@ page import="java.lang.management.*, java.util.*" %>   
  2.     <%!   
  3.         Map cpuTimes = new HashMap();   
  4.         Map cpuTimeFetch = new HashMap();   
  5.     %>   
  6.        
  7.     <%   
  8.     out.println("Threads Monitoring");   
  9.     long cpus = Runtime.getRuntime().availableProcessors();   
  10.     ThreadMXBean threads = ManagementFactory.getThreadMXBean();   
  11.     threads.setThreadContentionMonitoringEnabled(true);   
  12.     long now = System.currentTimeMillis();   
  13.     ThreadInfo[] t = threads.dumpAllThreads(falsefalse);   
  14.     for (int i = 0; i < t.length; i++) {   
  15.         long id = t[i].getThreadId();   
  16.         Long idObj = new Long(id);   
  17.         long current = 0;   
  18.         if (cpuTimes.get(idObj) != null) {   
  19.             long prev = ((Long) cpuTimes.get(idObj)).longValue();   
  20.             current = threads.getThreadCpuTime(t[i].getThreadId());   
  21.             long catchTime = ((Long) cpuTimeFetch.get(idObj)).longValue();   
  22.             double percent = (double)(current - prev) / (double)((now - catchTime) * cpus * 1000);   
  23.             if (percent > 0 && prev > 0) {  
  24.     out.println("<li>" + t[i].getThreadName()+"#"+t[i].getThreadId() + " Time: " + percent + " (" + prev + ", " + current + ") ");  
  25.     String locked = t[i].getLockInfo()==null?"":t[i].getLockInfo().getClassName();  
  26.     out.println(" Blocked: (" + t[i].getBlockedTime() + ", " + t[i].getBlockedCount() + ", " + locked + ")</li>");  
  27.     }  
  28.         }   
  29.         cpuTimes.put(idObj, new Long(current));     
  30.         cpuTimeFetch.put(idObj, new Long(now));   
  31.     }   
  32.     %>

  同步是性能的一大瓶颈

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

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号