监视Java应用程序:向死锁检测应用程序添加方法分析视图

本系列的第 2 部分将采用 第 1 部分中的死锁检测应用程序,并添加一个方法分析视图来显示应用程序的哪些地方花费了大部分的 CPU 周期。

Health Center 是一款适用于 Java 的 IBM®监视和诊断工具,是一个免费的低开销诊断工具和 API,用于监视在 IBM Java 虚拟机 (JVM) 上运行的应用程序。有关此 API 可以执行的操作的细节,请参阅 第 1 部分。在本文中,将会采用 第 1 部分中开发的死锁检测应用程序,并添加一个方法分析视图来显示应用程序的哪些地方花费了大部分的 CPU 周期。

系统要求

Health Center API bundle 至少需要安装 ">Eclipse 3.4 或 Eclipse 4.x。

测试应用程序

在 第 1 部分中,已经测试了生成死锁条件的应用程序。在本文中,我们将使用该应用程序的修订版,该版本包含一些会给 CPU 施加压力的功能。请参阅 下载,以获得相关的源代码。清单 1 显示了一个代码片段示例:

清单 1. 新的 GenerateDeadLock 源代码的代码片段

private class runSlowMethods extends Thread { public void run() { SlowClassAndMethod1 sCAM1 = new SlowClassAndMethod1(); SlowClassAndMethod2 sCAM2 = new SlowClassAndMethod2(); sCAM1.start(); sCAM2.start(); } private class SlowClassAndMethod1 extends Thread { public void run() { while (true) { slowMethod1(); try { Thread.
sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void slowMethod1() { String largeString = new String("a string to add"); for (int i = 0; i < 1000000; i++) { largeString.concat(largeString); } } } private class SlowClassAndMethod2 extends Thread { public void run() { while (true) { slowMethod2(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void slowMethod2() { HashMap map = new HashMap(); String largeString = new String("another string to add"); for (int i = 0; i < 1000000; i++) { map.put(i, largeString); largeString.concat(largeString); } }

通过与该程序连接的 Health Center 代理启动该程序。要使用 Java 5 SR10 及更高版本、Java 6 SR5 及更高版本和 Java 7 并通过代理来启动该应用程序,请使用以下命令(参见图 1):

java -Xhealthcenter GenerateDeadlock

图 1. 启动应用程序

要使用 Java 5 SR9 及其早期版本或者 Java 6 SR4 及其早期版本并通过代理来启动应用程序,请使用:

java -
agentlib:healthcenter -Xtrace:output=healthcenter.out GenerateDeadlock

时间: 2024-07-28 17:16:24

监视Java应用程序:向死锁检测应用程序添加方法分析视图的相关文章

通过Health Center API向死锁检测应用程序添加方法分析视图

Health Center 是一款适用于 Java 的 IBM监视和诊断工具,是一个免费的低开销诊断工具和 API,用于监视在 IBM Java 虚拟机 (JVM) 上运行的应用程序.有关此 API 可以执行的操作的细节,请参阅 第 1 部分.在本文中,将会采用 第 1 部分中开发的死锁检测应用程序,并添加一个方法分析视图来显示应用程序的哪些地方花费了大部分的 CPU 周期.(请 参阅 下载,以便获得示例的完整源代码.) 系统要求 Health Center API bundle 至少需要安装

监视Java应用程序:Health Center API入门

本文章系列由两个部分组成,在本系列的第 1 部分中,您将学习如何使用 Health Center API,以及如何监视正在运行的 Java 应用程序中的死锁.第 2 部分 使用了本文中开发的死锁检测应用程序,并添加了一个方法分析视图来显示应用程序的哪些地方花费了大部分的 CPU 周期. 您是否曾经遇到过没有明确原因的应用程序服务器挂起或者 Java 应用程序变得没有响应?您的应用程序是否内存不足或者运行情况欠佳?使用 Health Center,您就可以更轻松地解决这些问题. 使用 Health

Java理论与实践:用JMX检测应用程序

有多少次您曾经注视着运行中的应用程序,问自己:"它到底在做什么?为 什么用了这么长时间呢?" 在这些时刻,您可能会想如果自己在应用程序中构 建了更多的监视功能就好了.例如,在服务器应用程序中,能够查看排队等候处 理的任务的数量和类型.当前正在处理的任务.过去一分钟或一小时内的吞吐量 统计.平均任务处理时间等.这些统计值容易搜集,但是在需要数据的时候,如 果没有非侵入性的数据检索机制,那么这些值就不太有用. 可以用许多方式导出操作性数据--可以把周期性统计快照写入日志文件. 创建 Swi

Java死锁检测

ThreadMXBean 常用方法: /** ThreadMXBean常用方法test */ ThreadMXBean threadMXBean= ManagementFactory.getThreadMXBean(); int count=threadMXBean.getThreadCount();//获取当前线程数目 System.out.println("当前线程数为:"+count); long[] threadIds=threadMXBean.getAllThreadIds(

Java Web中的入侵检测及简单实现

web 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据.当然,入侵检测可以用很多方法实现,包括软件.硬件防火墙,入侵检测的策略也很多.在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御. 该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新. 我们的入侵

Fork and Join: Java也可以轻松地编写并发程序

原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) 如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑.这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行.在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多个可以并行执行的块,以便可以最大化利用计算能力. 处理并发(并行)程序,一向都是比较困难的,因为你必须处理线程同步和共享数据

新官上任,转贴一篇:Java做一个最简单的通话程序

程序 Java中的网络编程是一个很重要的部分,也是其编程优越性的地方之一.在Java中有一个专门的Java.net类库来管理网络编程的有关方法. 下面先介绍在Java中怎样用socket进行客户与服务器通信.最后再介绍一个一个最简单的通话程序. 一.怎样用socket进行客户与服务器通信 在Java中用socket进行客户/服务器之间的通信编程.Socket是两个实体之间进行通信的有效端点.通过socket可以获得源IP地址和源端口.终点IP地址和终点端口.用户可以将多个socket连入同一个端

在Java Web中的入侵检测及简单实现

一.简介 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据.当然,入侵检测可以用很多方法实现,包括软件.硬件防火墙,入侵检测的策略也很多.在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御. 该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新. 我们的入

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1.问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.prin