Windows上的Java线程CPU分析

本文将为您提供一个教程,介绍如何在Windows OS上快速查明Java线程贡献者与CPU严重问题有关。 Windows与Linux,Solaris和AIX等其他操作系统一样,使您可以在进程级别监视CPU利用率,还可以监视在进程中执行任务的单个线程。

在本教程中,我们创建了一个简单的Java程序,使您可以逐步学习该技术。

故障排除工具

本教程将在下面使用以下工具:

  • Windows Process Explorer (查明高CPU线程贡献者)
  • JVM线程转储(用于代码级别的线程关联和根本原因分析)

高CPU模拟器Java程序

下面的简单程序只是循环并创建新的String对象。 这将使我们能够按线程分析执行此CPU。 我建议您将其导入您选择的IDE中,例如Eclipse并从那里运行它。 执行Windows计算机后,应立即观察到CPU数量的增加。

package org.ph.javaee.tool.cpu;/*** HighCPUSimulator* @author Pierre-Hugues Charbonneau* http://javaeesupportpatterns.blogspot.com**/
public class HighCPUSimulator {private final static int NB_ITERATIONS = 500000000;// ~1 KB data footprintprivate final static String DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatad
atadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadata";/*** @param args*/public static void main(String[] args) {System.out.println("HIGH CPU Simulator 1.0");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com/");try {for (int i = 0; i < NB_ITERATIONS; i++) {// Perform some String manipulations to slowdown and expose looping process...String data = DATA_PREFIX + i;                }} catch (Throwable any) {System.out.println("Unexpected Exception! " + any.getMessage()+ " [" + any + "]");}System.out.println("HighCPUSimulator done!");}}

步骤#1 –启动流程浏览器

Process Explorer工具以可视方式动态显示CPU使用情况。 这对于实时分析非常有用。 如果您需要每个线程在CPU上的历史数据,则还可以将Windows perfmon与%Processor Time&Thread Id数据计数器一起使用。 您可以从下面的链接下载Process Explorer:
http://technet.microsoft.com/zh-cn/sysinternals/bb896653

在我们的示例中,您可以看到在执行示例程序之后,Eclipse javaw.exe进程现在使用了约25%的CPU利用率。

步骤#2 –启动Process Explorer的Threads视图

下一步是显示javaw.exe进程的“线程”视图。 只需右键单击javaw.exe进程,然后选择“属性”。 将根据以下快照打开“线程”视图:

  • 第一列是线程ID(十进制格式)
  • 第二列是每个线程使用的CPU利用率%–
  • 第三列也是另一个计数器,指示线程是否正在CPU上运行

在我们的示例中,我们可以看到罪魁祸首是使用约25%CPU的线程ID#5996。

步骤#3 –生成JVM线程转储

此时,Process Explorer将不再有用。 目的是查明一个或多个Java线程,这些线程消耗了我们实现的大部分Java进程CPU利用率。 为了进入分析的下一个层次,您将需要捕获JVM线程转储。 这将使您能够将线程ID与线程堆栈跟踪相关联,从而可以查明这种处理类型正在消耗如此多的CPU。
JVM线程转储的生成可以通过几种方式完成。 如果您使用的是JRockit VM,则可以按照以下示例使用jrcmd工具:

获得线程转储数据后,只需搜索线程ID并找到您感兴趣的线程堆栈跟踪。
在我们的示例中,从Eclipse触发的线程“主线程”被暴露为主要罪魁祸首,而这正是我们想要演示的。

Main Thread id=1 idx=0x4 tid=5996 prio=5 alive, native_blockedat org/ph/javaee/tool/cpu/HighCPUSimulator.main(HighCPUSimulator.java:31)at jrockit/vm/RNI.c2java(IIIII)V(Native Method)-- end of trace

步骤#4 –分析罪魁祸首的线程堆栈跟踪并确定根本原因

此时,您应该具备进行根本原因分析所需的一切。 您将需要检查每个线程堆栈跟踪,并确定要处理的问题类型。 最后一步通常是您将花费大部分时间的地方,问题可能很简单(例如无限循环),也可能很复杂(例如与垃圾回收相关的问题)。

在我们的示例中,线程转储确实揭示了CPU的高CPU数量来自第31行附近的示例Java程序。正如所料,它确实揭示了我们为本教程专门设计的循环条件。

for (int i = 0; i < NB_ITERATIONS; i++) {// Perform some String manipulations to slowdown and expose looping process...String data = DATA_PREFIX + i;                }

我希望本教程可以帮助您了解如何分析和帮助查明Windows OS上Java CPU问题的根本原因。 请继续关注更多更新,下一篇文章将为您提供Java CPU故障排除指南,包括如何处理最后的分析步骤以及常见问题模式。

参考: Java EE支持模式和Java教程博客中的JCG合作伙伴 Pierre-Hugues Charbonneau在Windows上的Java线程CPU分析 。


翻译自: https://www.javacodegeeks.com/2012/04/java-thread-cpu-analysis-on-windows.html

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

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

相关文章

flask 继承模版的基本使用1

转载于:https://www.cnblogs.com/wanghaonull/p/6399492.html

东芝2303am维护清零_东芝打印机2303A怎样清零

展开全部东芝e68a843231313335323631343130323136353331333365653137打印机是按照相关要求生产的正规产品&#xff0c;其清零方式与正规产品相同。因此此处将介绍常用的打印机清零方法。打印机清零一般分两种&#xff1a;一种是手工清零&#xff0c;另一种是软件清零。一、手工…

计算机日期函数公式大全,Excel技巧: 根据日期汇总月份的计算公式

在许多情况下&#xff0c;Excel记录的数据将按照发生的日期进行记录&#xff0c;但是根据日期记录的数据将非常分散&#xff0c;通常需要每月汇总相应的数据. 在这种情况下&#xff0c;您需要将日期转换为月份. 本文介绍了如何使用SUMPRODUCT函数按月汇总数据.公式提示在SUMPRO…

Java陷阱:内部类中的字段访问

这本身不是一个“陷阱”&#xff0c;而是一个值得了解的实现细节。 假设我有一个带有字段的内部类。 这样的字段对于封闭的类是可见的&#xff0c;但是以下哪种方法是访问它的最快方法&#xff1f; 注意&#xff01; 我只在这里查看生成的字节码&#xff0c;而不考虑任何JIT优化…

coverity代码检测工具介绍_微服务测试之静态代码扫描

静态代码扫描为整个发展组织增加价值。无论您在开发组织中发挥的作用如何&#xff0c;静态代码扫描解决方案都具有附加价值&#xff0c;拥有软件开发中所需要的尖端功能&#xff0c;最大限度地提高质量并管理软件产品中的风险。背景微服务架构模式具有服务间独立&#xff0c;可…

XML引入以及与html的区别

1.1 引入HTML: 负责网页的结构 CSS&#xff1a; 负责网页的样式&#xff08;美观&#xff09;Javascript&#xff1a; 负责在浏览器端与用户进行交互。负责静态的网页制作的语言HTML语言特点&#xff1a;1&#xff09;由标签组成。 <title> <p> <hr/> <br…

ADF:在任务流终结器中支持bean作用域

介绍 当我们需要在任务流消失之前完成一些最终工作&#xff08;干净的资源&#xff0c;紧密的连接等&#xff09;时&#xff0c;这是使用任务流终结器的非常普遍的推荐做法。 和往常一样&#xff0c;我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围-请求&#…

Python 异常处理--raise函数用法

在Python中&#xff0c;要想引发异常&#xff0c;最简单的形式就是输入关键字raise&#xff0c;后跟要引发的异常的名称。异常名称标识出具体的类&#xff1a; Python异常处理是那些类的对象。执行raise语句时&#xff0c;Python会创建指定的异常类的一个对象。raise语句还可指…

大学计算机教学ppt数制,大学计算机基础 第3讲 数制及其相互转换 国家精品课程课件(可编辑)...

大学计算机基础第3讲数制及其相互转换国家精品课程课件PPT第1 章计算机基础知识第3 讲数制及其相互转换主要教学内容数制的基本概念1 数制转换2 小结3 学习目标1 理解数制的基本概念。2 掌握数制间的转换。3 能够灵活应用转换关系完成数制之间的转换。重点与难点不同数制之间的…

linux中匿名用户怎么登陆_南京课工场IT培训:Linux中vsftpd服务配置(匿名,用户,虚拟用户)...

vsftpd概述vsftpd 是“very secure FTP daemon”的缩写&#xff0c;安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字&#xff0c;它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面&#xff0c;是一个完全免费的、开放源代码的ftp服务…

Java _ JDK _ Arrays, LinkedList, ArrayList, Vector 及Stack

(最近在看JDK源码&#xff0c;只是拿着它的继承图在看&#xff0c;但很多东西不记录仍然印象不深&#xff0c;所以开始记录JDK阅读系列。) &#xff08;一&#xff09;Arrays Arrays比较特殊&#xff0c;直接继承自Arrays -》List(Interface) -》Collection(Interface)。(Maybe…

server2016做文件服务器,『配置』服务器搭建 Office Online Server2016 实现文档预览 番外 错误篇...

安装一个或多个角色、角色服务或功能失败。找不到源文件。请再次尝试在新的“添加角色和功能”向导会话中安装角色、角色服务或功能&#xff0c;然后在向导的“确认”页中单击“指定备用源路径”以指定安装所需的源文件的有效位置。目标服务器的计算机帐户必须能够访问该位置。…

Java High CPU故障排除指南–第1部分

本文是该系列的第1部分&#xff0c;它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 该指南也适用于独立的Java程序&#xff0c;但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产问题解决…

PHP数据结构之三 线性表中的单链表的PHP实现

线性表的链式存储&#xff1a;用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。 链式存储线性表的特点&#xff1a;存储链表中结点的一组任意的存储单元可以是连续的&#xff0c;也可以是不连续的&#xff0c;甚至是零散分布在内存中的任意位…

php进程间通信 yoc_swoole的process模块创建和使用子进程

swoole中为我们提供了一个进程管理模块 Process&#xff0c;替换PHP的 pcntl 扩展&#xff0c;方便我们创建进程&#xff0c;管理进程&#xff0c;和进程间的通信。swoole提供了2种进程间的通信&#xff1a;1、基于 unix socket 的管道 pipe。2、基于 sysvmsg 的消息队列。我们…

ajax回复留言,Ajax 留言板模拟

这一节我们利用 Ajax 制作一个留言板模拟&#xff0c;之所以叫模拟&#xff0c;是由于没有将留言内容存入数据库&#xff0c;而只是假像地处理&#xff0c;因为这里着重讨论 Ajax&#xff0c;暂时就不涉及数据库操作。这里我们模拟了留言失败的情况&#xff0c;每次提交有 50% …

RabbitMQ:计划邮件传递

本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一个演讲&#xff0c;与会人员提出的一个问题是“是否可以发布一条消息供以后使用&#xff1f;” 我回答说&#xff0c;就我所知&#xff0c;这是不可能的&#xff0c;但是可能会有一些技巧来实现它。 好吧&#xff0c;今天…

mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?

阿里妹导读&#xff1a;如何治理测试稳定性问题&#xff1f;很多人会说&#xff1a;环境、流程管控、监控、工具化、加机器、专人负责、等等。这些都是对的。不过这些都是解决方案层面的&#xff0c;而不是方法论和理论体系层面的。今天&#xff0c;阿里研究员郑子颖来说说测试…

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

【iOS开发】---- 强大的UI修改工具 UIAppearance-有图片效果

iOS5及其以后提供了一个比较强大的工具UIAppearance&#xff0c;可以轻松的统一你的界面&#xff0c;它提供如下两个方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一个方法是统一全部改&#xff0c;比如你设置UINav…