快速业务通道

Java技术,IBM风格: 监视和判断问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
出了 DTFJ API 可以了解和探察的一些数据对象:

图 1. DTFJ 数据对象概述

Java技术,IBM风格: 监视和判断问题(7)

时间:2011-01-30 IBM Chris Bailey

运行 JExtract

因为各种操作系统生成不同的系统转储格式,而且随着时间的推移内部 Java 运行时数据结构可能会发生一些必要的改变,所以需要对系统转储运行一个称为 JExtract 的实用程序,然后才能使用 DTFJ API 访问系统转储。这个操作需要由生成系统转储时运行的相同 Java 运行时版本来执行,而且应该在同一个系统上执行。

JExtract 实用程序了解系统转储和 Java 运行时内部数据结构的格式。它利用这一知识创建一个 XML 描述文件,这个文件为系统转储文件提供索引,指出各个数据结构的位置。然后,DTFJ 就可以结合使用系统转储和 JExtract 生成的 XML 文件来生成工具所请求的信息。

尽管 JExtract 是系统转储的后处理程序,但是可以使用转储引擎的 tool 选项在创建系统转储之后自动调用 JExtract。例如,为了在发生 OutOfMemoryErrors 时创建系统转储,使用以下语法:

-Xdump:tool:events=uncaught,filter=  OutOfMemoryError,exec="jextract .\core.%Y%m%d.*.%pid.dmp"

可以使用 DTFJ API 实现什么?

可以使用 DTFJ API 访问系统转储中的大量信息。这包括关于运行进程的平台的信息:物理内存、CPU 数量和类型、库、命令行、线程堆栈和寄存器。它还可以提供关于 Java 运行时和 Java 应用程序的状态的信息,包括类装载器、线程、监视器、堆、对象、Java 线程、方法、编译的代码和字段及其值。

因为提供的数据范围非常广泛,DTFJ API 为创建各种工具提供了很大的灵活性。例如,在比较简单的层面上,它使工具能够查明各个缓存的大小和内容,从而更有效地调整这些缓存所需要的 Java 堆内存量。

开始使用 DTFJ

创建基于 DTFJ 的工具的第一步是获得与系统转储相关的 Image 对象,然后从 ImageAddressSpace 获得 ImageProcess 对象,见清单 2:

清单 2. 使用 DTFJ 获得当前进程

Image theImage = new ImageFactory().getImage(new File(fileName)); ImageAddressSpace currentAddressSpace =  (ImageAddressSpace) theImage.getAddressSpaces().next(); ImageProcess currentProcess = currentAddressSpace.getCurrentProcess();

在大多数平台上,映像中只有一个 ImageAddressSpace 和 ImageProcess 对象;但是,大型机操作系统可能有多个实例。

获得 ImageProcess 对象之后,就可以访问本机线程,见清单 3:

清单 3. 获得线程和堆栈帧

Iterator vmThreads = process.getThreads(); ImageThread vmThread = (ImageThread) vmThreads.next(); Iterator vmStackFrames = vmThread.getStackFrames();

还可以访问各个 ImageModule(库)对象,见清单 4:

清单 4. 获得已经装载的库

Iterator loadedModules = process.getLibraries()

可以从 ImageProcess 对象获得 JavaRuntime,见清单 5:

清单 5. 获得 Java 运行时

JavaRuntime runtime = (JavaRuntime) process.getRuntimes().next();

这样就可以访问所有 Java 结构。

Java技术,IBM风格: 监视和判断问题(8)

时间:2011-01-30 IBM Chris Bailey

获得了 JavaRuntime 对象之后,就可以编写工具来探察正在运行的任何 Java 应用程序。清单 6 中的简单示例演示了如何遍历 Java 堆上的所有对象并统计每种类型的对象的数量:

清单 6. 统计转储中每种对象的数量

..    Map<String,Long> objectCountMap = new HashMap<String,Long>();   Iterator allHeaps = currentRuntime.getHeaps();   /* Iterate over each of the Java heaps 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号