用于定位JAVA程序的瓶颈的方法和设备技术

技术编号:6838522 阅读:250 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及用于定位Java程序的瓶颈的方法和设备。提供了一种用于定位Java程序的瓶颈的方法,包括以下步骤:在对应于所述Java程序的Java进程中创建辅助线程,并将所述辅助线程挂接到在该Java进程中创建的Java虚拟机;在操作系统内核中插入探测器;所述探测器监视所述Java进程中的Java线程在操作系统内核中的状态并且响应于检测到Java线程被阻塞而向所述辅助线程发送信号;以及所述辅助线程响应于接收到来自操作系统内核的所述信号,从所述JVM中取回调用栈信息,并利用所取回的调用栈信息定位到所述Java程序的源代码中的引起所述阻塞位置。

【技术实现步骤摘要】

本专利技术一般涉及计算机领域。更具体地说,本专利技术涉及一种用于检测并定位Java 程序的瓶颈的方法和设备。
技术介绍
Java语言是是一种可以编写跨平台应用软件的面向对象的程序设计语言。Java 不同于一般的编译执行计算机语言(诸如C语言)和解释执行计算机语言(诸如HTML)。 它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的Java虚拟机(JVM) 来解释执行字节码,从而实现了 “一次编译、到处执行”的跨平台特性。如今,Java已经成为企业应用程序的主流开发语言,理解Java线程如何工作是非常重要的。尤其当一个企业应用程序无法良好地利用下层的硬件服务器时,就需要找出在 CPU利用率低的情况下一些应用程序线程仍然被阻塞的原因。不过,Java应用程序具有如下性质在硬件和应用程序代码之间存在许多层,这些层包括但不限于硬件层、操作系统层 (也称作本地层)、Java虚拟机层、中间件层以及应用程序层。由于上述的原因,如果发现CPU的利用率低,难以在Java源代码中找到问题所在。 但是应用程序开发者恰恰需要定位Java源代码中的问题从而能够解决该问题。例如,图IA示出了 JVM层的线程状态,我们发现很多应用程序线程在Java虚拟机层是可运行的,并且在Java虚拟机层不存在明显的问题。但是,图IB示出了本地层中的、 与JVM层的线程对应的线程的状态,如图IB所示,存在许多的线程阻塞。因此,Java应用程序开发者需要弄清楚在CPU利用率低的情况下线程为什么被阻塞以及源代码中的哪个地方导致了发生该问题。在现有技术中,已经存在很多监视及瓶颈分析工具。下面举例说明现有技术中存在的各种工具。例如,存在一种本地瓶颈分析工具,该瓶颈分析工具查看执行栈中的一层以定位瓶颈。这种本地层瓶颈分析工具例如包括LockStat,该LockStat提供针对锁的统计结果。 这种瓶颈分析工具的缺点在于对于例如锁的每种资源,均需要一种专用的工具,这导致对于本地层的多种资源,需要很多的专用工具对每种资源进行监视和分析。此外,这种瓶颈分析工具只能在本地层即操作系统层中进行监视,而无法将在本地层中发生的事件与Java 源代码的相应部分联系起来。此外,存在一种筛选工具,该筛选工具跨越多层架构的各层进行查找以定位可疑的瓶颈。这种筛选工具主要用于多层架构的Web开发框架,其示例为哥伦比亚大学Watson 实验室的WAIT。所述多层架构典型地包括Web层、应用层以及数据库层。这种筛选工具仅能在该多层框架结构中识别引起可以瓶颈的节点(即硬件服务器)。因此,这种筛选工具识别的是包含多个节点的系统中导致瓶颈的节点,但是并不能在源代码中定位瓶颈。此外,目前还存在Java运行时监视工具,诸如jstack和JFluid。该jstack工具可以进行运行时栈分析,但是这种工具具有显著的性能开销,甚至会干扰应用程序的行为。而JFluid工具监控与特定资源相关的所有函数调用,这种工具同样具有显著的性能开销,因为即使有些函数调用与线程阻塞并无关联,JFluid仍会记录所有的函数调用。此外,jstack 和JFluid属于JVM层的监控工具,它们对JVM层中的瓶颈进行监视,但是无法监视位于JVM 层之下的本地层中的线程状 态。
技术实现思路
现有技术的各种工具都不能实现根据本地层中的瓶颈找出Java源代码中引起该瓶颈的精确位置的功能。因此,需要提供一种能够将本地层中的瓶颈链接回Java源代码的有效方法。为了解决上述问题,本专利技术的主要目的是提供一种用于检测并定位Java程序的瓶颈的方法和设备。该方法和设备能够将本地层中的瓶颈链接回Java源代码。此外,该方法和设备没有明显的性能开销,不会对目标应用程序的正常运行产生不利影响。根据本专利技术的一方面,提供了一种用于定位Java程序的瓶颈的方法,包括以下步骤在对应于所述Java程序的Java进程中创建辅助线程,并将所述辅助线程挂接到在该Java进程中创建的Java虚拟机;在操作系统内核中插入探测器;所述探测器监视所述 Java进程中的Java线程在操作系统内核中的状态并且响应于检测到Java线程被阻塞而向所述辅助线程发送信号;以及所述辅助线程响应于接收到来自操作系统内核的所述信号, 从所述JVM中取回调用栈信息,并利用所取回的调用栈信息定位到所述Java程序的源代码中的引起所述阻塞位置。根据本专利技术的另一方面,提供了一种用于定位Java程序的瓶颈的设备,包括用于在对应于所述Java程序的Java进程中创建辅助线程,并将所述辅助线程挂接到在该 Java进程中创建的Java虚拟机的装置;用于在操作系统内核中插入探测器的装置;用于由所述探测器监视所述Java进程中的Java线程在操作系统内核中的状态并且响应于检测到 Java线程被阻塞而向所述辅助线程发送信号的装置;以及用于在所述辅助线程响应于接收到来自操作系统内核的所述信号从所述JVM中取回调用栈信息,并利用所取回的调用栈信息定位到所述Java程序的源代码中的引起所述阻塞的位置的装置。采用本专利技术的上述设备和方法,能够将本地层中的瓶颈准确地链接回Java源代码,即找到引起所述本地层中的瓶颈的Java源代码的相应位置。因此,上述设备和方法能够在JVM层中没有任何指示的情况下,找到Java线程状态改变的原因。此外,上述方法是独立且自足的方法,不需要其它的监视器或工具的帮助。另外,上述设备和方法没有明显的性能开销,不会对目标应用程序的正常运行产生不利影响。附图说明以下通过结合附图阅读参考下述对说明性实施例的详细描述,将更好地理解本专利技术本身、实施方式、其它目的及其优点。在附图中图IA和图IB示出了 JVM层的线程状态和本地层的线程状态之间的差别;图2是示出本专利技术的总体专利技术构思的示意图;图3示出了根据本专利技术的一个实施例的方法流程;图4是示出了用户空间中的Java线程和内核空间中的本地任务之间的关系的示意图;图5是示出了图3中的步骤320的处理的一个示例的示意图;图6是示出了图3中的步骤340的处理的一个示例的示意图;以及图7是示出了在四核处理器的情况下的辅助线程示例的示意图。现在参照附图描述优选方法和系统,其中,在附图中相同的附图标号用来指相同的部件。在下面的描述中,为了解释的目的,阐述大量特定的细节,以便帮助完全了解系统及方法等。在其它的例子中,为了简化描述,以框图的形式示出常用的结构和装置。对于本领域技术人员来说,可以想到很多修改和其它实施例,同时拥有在说明书和附图中所教导的益处。因此,应该理解,本专利技术不局限于所公开的特定实施例,另外可选的实施例应当包含在本专利技术的范围和范例专利技术构思内。虽然本文采用了一些特定术语,但是仅仅为了一般的描述意义而非限制目的使用它们。具体实施例方式以下将参照附图对本专利技术的具体实施方式进行详细说明。在以下的说明中,术语 “内核空间”和“用户空间”是针对操作系统的内核而言的。在本专利技术中,操作系统可以是诸如Unix、Linux以及Windows的各种操作系统。为了简单起见,在本专利技术中,仅以Linux作为操作系统的示例。但是本领域的技术人员应该明白,本专利技术的方法和设备同样适用于其它操作系统。Linux的虚拟地址空间为0至4G。Linux内核将这4G字节的空间分为两本文档来自技高网
...

【技术保护点】
1.一种用于定位Java程序的瓶颈的方法,包括以下步骤:在对应于所述Java程序的Java进程中创建辅助线程,并将所述辅助线程挂接到在该Java进程中创建的Java虚拟机JVM;在操作系统内核中插入探测器;所述探测器监视所述Java进程中的Java线程在操作系统内核中的状态并且响应于检测到Java线程被阻塞而向所述辅助线程发送信号;以及所述辅助线程响应于接收到来自操作系统内核的所述信号,从所述JVM中取回调用栈信息,并利用所取回的调用栈信息定位到所述Java程序的源代码中的引起所述阻塞的位置。

【技术特征摘要】

【专利技术属性】
技术研发人员:王海川钟虓滕启明李影
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:US

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1