本系列的第 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