CN111679984A - 一种性能分析方法和装置 - Google Patents
一种性能分析方法和装置 Download PDFInfo
- Publication number
- CN111679984A CN111679984A CN202010513534.XA CN202010513534A CN111679984A CN 111679984 A CN111679984 A CN 111679984A CN 202010513534 A CN202010513534 A CN 202010513534A CN 111679984 A CN111679984 A CN 111679984A
- Authority
- CN
- China
- Prior art keywords
- information
- stack
- tracking information
- tracking
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 64
- 238000000034 method Methods 0.000 claims abstract description 280
- 239000000523 sample Substances 0.000 claims abstract description 45
- 238000004590 computer program Methods 0.000 claims description 16
- 230000006870 function Effects 0.000 claims description 11
- 238000006243 chemical reaction Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 claims description 8
- 238000003860 storage Methods 0.000 claims description 8
- 230000002085 persistent effect Effects 0.000 claims description 5
- 238000010276 construction Methods 0.000 claims description 3
- 238000003825 pressing Methods 0.000 claims description 3
- 230000002708 enhancing effect Effects 0.000 claims description 2
- 238000009826 distribution Methods 0.000 abstract description 6
- 238000010586 diagram Methods 0.000 description 20
- 238000012545 processing Methods 0.000 description 7
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000002688 persistence Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000010561 standard procedure Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Prevention of errors by analysis, debugging or testing of software
- G06F11/3604—Analysis of software for verifying properties of programs
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种性能分析方法和装置,该方法包括:将探针加入Java程序;在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;根据跟踪信息,确定跟踪日志文件;根据跟踪日志文件,确定方法栈信息;根据方法栈信息,确定方法热点报告。本发明可以实现无侵入性的获取跟踪信息;便于分析和优化程序结构,实现跟踪信息至方法栈信息的灵活定制,可以直观给出程序中的性能耗时分布和瓶颈所在。
Description
技术领域
本发明涉及性能分析技术领域,尤其涉及一种性能分析方法和装置。
背景技术
本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
Java性能分析,能够帮助人们快速方便地呈现性能分布以及性能热点问题。
在Java性能分析的发展过程中,存在有3种方法和手段:
(1)程序员在代码里手工调用print,然后分析日志找到性能问题,该方法的缺点明显,一是需要程序员修改代码,二是分析手段比较简单和原始;
(2)使用诸如jvisualVM工具来找到性能问题;该方法缺点是:一对Java应用程序的性能影响大;二该工具诊断所有的JVM(Java Virtual Machine,Java虚拟机)里的方法,无法进行定制;三提供的视图有限,例如无法提供并发量视图;
(3)在Spring基础上通过AOP拦截的方式找到性能问题;该方法的致命缺点:一Java应用程序得是由Spring托管的,二通过AOP只能拦截到部分Java代码,不能做到完全跟踪,三是侵入到应用的配置文件。
因此,如何提供一种新的方案,其能够解决上述技术问题是本领域亟待解决的技术难题。
发明内容
本发明实施例提供一种性能分析方法,实现了无侵入性和灵活定制性能分析,该方法包括:
将探针加入Java程序;
在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
根据跟踪信息,确定跟踪日志文件;
根据跟踪日志文件,确定方法栈信息;
根据方法栈信息,确定方法热点报告。
本发明实施例还提供一种性能分析装置,包括:
配置模块,用于将探针加入Java程序;
跟踪信息确定模块,用于在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
跟踪日志文件确定模块,用于根据跟踪信息,确定跟踪日志文件;
方法栈信息确定模块,用于根据跟踪日志文件,确定方法栈信息;
方法热点报告确定模块,用于根据方法栈信息,确定方法热点报告。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述一种性能分析方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行实现上述一种性能分析方法的计算机程序。
本发明实施例提供的一种性能分析方法和装置,对Java程序加入探针,在JVM启动后对加入探针的Java程序进行字节码增强,可以实现无侵入性的获取跟踪信息;然后根据跟踪信息,确定跟踪日志文件,再根据跟踪日志文件,分析获取方法栈信息,可以当作程序的流程或时序来看,便于分析和优化程序结构,实现跟踪信息至方法栈信息的灵活定制,最后根据方法栈信息,确定方法热点报告,可以直观给出程序中的性能耗时分布和瓶颈所在。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本发明实施例一种性能分析方法示意图。
图2为本发明实施例一种性能分析方法的数据流图。
图3为本发明实施例一种性能分析方法的字节码增强流程示意图。
图4为本发明实施例一种性能分析方法的调用链示意图。
图5为运行本发明实施的一种性能分析方法的计算机装置示意图。
图6为本发明实施例一种性能分析装置示意图。
图7为本发明实施例一种性能分析装置程序模块图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
图1为本发明实施例一种性能分析方法示意图,如图1所示,本发明实施例提供一种性能分析方法,实现了无侵入性和灵活定制性能分析,该方法包括:
步骤101:将探针加入Java程序;
步骤102:在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
步骤103:根据跟踪信息,确定跟踪日志文件;
步骤104:根据跟踪日志文件,确定方法栈信息;
步骤105:根据方法栈信息,确定方法热点报告。
本发明实施例提供的一种性能分析方法,对Java程序加入探针,在JVM启动后对加入探针的Java程序进行字节码增强,可以实现无侵入性的获取跟踪信息;然后根据跟踪信息,确定跟踪日志文件,再根据跟踪日志文件,分析获取方法栈信息,可以当作程序的流程或时序来看,便于分析和优化程序结构,实现跟踪信息至方法栈信息的灵活定制,最后根据方法栈信息,确定方法热点报告,可以直观给出程序中的性能耗时分布和瓶颈所在。
在实施本发明实施例提供的一种性能分析方法时,涉及到的相关技术名词和技术术语,在此作出解释:
Java:一门编程语言、平台、工具集。
JVM:Java Virtual Machine,Java虚拟机;JVM是一种用于计算设备的规范,是一个虚构出来的计算机,是通过再实际的计算机上仿真模拟各种计算机功能来实现的,例如:Java语言编写和编译出来的程序,需要运行在JVM上。
JavaAgent:一种Java探针技术,在JVM启动之后,运行main方法之前运行Premain-class里指定得那个类,可以理解成运行Java程序的一个前置处理。
ASM:一种基于java字节码层面的代码分析和修改工具,用于实现字节码增强。
跟踪信息:指本发明实施例里生成的一种用来跟踪Java程序运行时的信息,跟踪到Java程序的方法级。跟踪信息相对现有技术而言更加简洁,这样能够最大限度的降低跟踪信息额外带来的程序性能损耗。
跟踪日志文件:将跟踪信息持久化到指定位置形成的文件,该文件为跟踪日志文件。在本发明实施例中,为了提升性能,跟踪信息先保留在内存队列中,然后开启一个新的独立线程从内存队列中通过异步的方式进行持久化处理,得到跟踪日志文件。
方法栈信息:基于跟踪日志文件,分析得到的方法栈。
方法热点报告:用于展示Java程序中方法的耗时分布,耗时排行信息等。
图2为本发明实施例一种性能分析方法的数据流图,如图2所示,具体实施时,本发明实施例的一种性能分析方法,可以包括:
将探针加入Java程序;在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;根据跟踪信息,确定跟踪日志文件;根据跟踪日志文件,确定方法栈信息;根据方法栈信息,确定方法热点报告。
其中,由探针程序至跟踪信息再到日志文件的过程,属于探针部分的功能,由跟踪日志文件到方法栈信息再到方法热点报告的过程,属于分析部分的功能。
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,将探针加入Java程序,包括:
设置探针的诊断程序范围、显示方式和写入文件位置;
将设置好的探针加入Java程序。
本发明实施例通过对Java程序加入探针,实现了无侵入性的获取跟踪信息,对JVM中的Java程序运行不产生影响,且占用的内存较小,对java程序的性能影响极小,可以实现跟踪信息的高效获取。
本发明实施例采用的是JavaAgent探针,在具体实施时还可以采用其他形式的探针,并不以JavaAgent探针来限制本发明实施例的保护范围;如表1所示提供一种JavaAgent探针的具体程序部分截取。
表1
JavaAgent探针是后续实现字节码增强生成对应的跟踪信息以及跟踪信息持久化两部分功能的基础。
上述表1中涉及的JavaAgent探针程序含义如表2所示。
表2
图3为本发明实施例一种性能分析方法的字节码增强流程示意图。如图3所示,插入探针后,在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息,包括:
在JVM启动后,运行Java程序入口方法(main方法)之前启动探针;
在加载Java程序对应的类(class)之前,对类(class)进行字节码增强,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,对类(class)进行字节码增强,获取进入方法前和方法返回后的跟踪信息,写入内存队列,包括:
遍历加载的每个类(class)名字,检查类(class)名字是否包含在过滤器(filter)里,如果包含则进行字节码转换;
在进行字节码转换时,遍历当前类(class)的全部方法,去掉设定get,set,is开头的方法以及构造函数,将剩余的方法进入法级字节码增强;
在进入方法后,插入第一字节码;
在方法返回或抛出异常前,插入第二字节码;
根据第一字节码和第二字节码,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
前述的去掉设定开头的方法,实施例中,可以包括:去掉以get,set,is开头的方法。
实施例中,进行字节码增强时,包括:
转换字节码,检查class名字是否包含在filter里,如果包含在进入字节码转换,否则不进行字节码转换;
在进行字节码转化时,遍历该class的所有方法,去掉get,set,is开头的方法以及构造函数;剩下的方法进入方法级字节码增强;
在进入方法后,插入字节码1(通过ASM工具插入字节码);
在方法返回或抛出异常前,插入字节码2(通过ASM工具插入字节码);
上述字节码1和字节码2的作用是将方法跟踪信息插入内存队列。
生成的跟踪信息的数据结构说明如表3所示:
表3
在进入方法后插入的字节码1以及在方法返回或抛出异常前插入的字节码2,打印出的字节码1和字节码2的数据格式如表4所示:
表4
字节码1 | 序号|线程名|类名|方法名|I|时间戳(毫秒) |
字节码2 | 序号|线程名|类名|方法名|O|时间戳(毫秒) |
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,根据跟踪信息,确定跟踪日志文件,包括:
开启新的独立线程从内存队列中异步获取跟踪信息,持久化到跟踪日志文件。跟踪信息相对现有技术而言更加简洁,这样能够最大限度的降低跟踪信息额外带来的程序性能损耗,同时开启新的独立线程,对Java程序不产生影响,可以避免对Java程序的侵入。
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,所述跟踪信息,包括:调用链和跟踪信息;
所述调用链,包括:父方法和父方法调用的儿子方法构成的链式结构;
所述跟踪信息,包括:父方法的入栈时间戳和出栈时间戳,儿子方法的入栈时间戳和出栈时间戳。
图4为本发明实施例一种性能分析方法的调用链示意图,如图4所示,在该调用链中:
A()方法调用了B()方法和E()方法;
B()方法调用了C()方法;
C()方法调用了D()方法。
其中,A()方法为父方法,B()方法、E()方法、C()方法和D()方法为父方法调用的儿子方法。
表5展示了在Java程序中的生成的部分跟踪信息:
表5
不同的程序调用链和跟踪信息在具体实施时因为操作对象的不同结果会相差较大,不过原理都相同,均为程序运行时的栈式结构。
表6展示了表5中跟踪信息的具体含义:
表6
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,根据跟踪日志文件,确定方法栈信息,包括:
获取跟踪日志文件,从跟踪日志文件中读取跟踪信息,建立跟踪信息列表traceList;
建立一个以线程名称为键值key的线程字典桶threadBuckets;其中每个key对应一个线程字典桶threadBuckets;
从跟踪信息列表traceList中获取跟踪信息trace里的线程名threadName;
检查线程字典桶threadBuckets里是否存在线程名threadName的信息;
如果线程字典桶threadBuckets里不存在线程名threadName,则创建一个线程对象pthread(pthread为变量名),创建一个栈对象pStack(pStack为变量名),将当前跟踪信息trace丢入栈顶topTrace(topTrace为变量名);将线程对象pthread放入线程字典桶threadBuckets;
如果线程字典桶threadBucket中存在线程名threadName,则从线程字典桶threadBucket里获取对应的线程对象pthread;
判断跟踪信息trace里的出栈标志和入栈标志;
若跟踪信息trace里的标志为入栈标志时,将当前跟踪信息trace压入线程对象pthread的栈对象pStack中;
若跟踪信息trace里的标志为出栈标志时:令栈顶topTrace等于弹出线程对象pthread的栈对象pStack的栈顶信息;将当前跟踪信息trace与栈顶topTrace的时间戳相减,得到当前方法的运行总时长CT(CostTime);构建方法栈数据methodTraceMessage;如果栈对象pStack等于空,将方法栈数据methodTraceMessage输出到方法栈结果信息文件method-trace.result中;
重复执行从跟踪信息列表traceList中获取下一跟踪信息里的线程名至得到方法栈结果信息文件的过程,直至获取跟踪信息列表traceList中全部跟踪信息对应的方法栈结果信息文件;
将全部方法栈结果信息文件进行汇总,确定方法栈信息。
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,所述当前方法的运行总时长CT为父方法的运行时长和父方法调用的全部儿子方法的运行时长的总和;
将当前方法的运行总时长CT减去父方法调用的全部儿子方法的运行时长,确定为父方法的运行时长CT2(CostTime2)。
在实施例中,表7展示了根据跟踪日志文件到确定方法栈信息的伪代码:
表7
上面的伪代码结合上述实施例来说明,通过表8来表示CT,CT2以及方法栈信息的处理过程(在表8总抽取了一个线程的跟踪信息):
表8
在本实施例中构建的方法栈信息(截取部分)如表9所示:
表9
在表9中,‘-’符号方便树结构得展示,方法栈信息的核心数据结构如表10所示:
表10
在具体实施本发明实施例提供的一种性能分析方法时,一个实施例中,所述方法热点报告包括:简单型方法热点报告和树形方法热点报告;
根据方法栈信息,确定方法热点报告,包括:
将方法栈信息按照类名和方法名的维度进行汇总,把父方法的运行时长CT2按照设定顺序排列,确定简单型方法热点报告;
将方法栈信息按照类名和方法名的维度进行汇总,把当前方法的运行总时长CT按照设定顺序排列,确定树形方法热点报告。
简单型方法热点报告:按className,MethodName维度汇总统计,主要统计的CT2。简单型报告反映的是:各方法自身耗时的排行榜(按总CT2大小降序排列),举例如表11所示:
表11
其中总CT2=当前方法的CT2之和;总CT2占比=当前方法总CT2/所有方法的CT2之和(即100/500)
树型方法热点报告:按className,MethodName维度汇总统计,主要统计的CT(按树型的总分结构展开)。该报告反应的是:1、按一级方法汇总的耗时排行榜(按总CT大小降序排列);2、可以层层展开一级方法内部的耗时情况,举例如表12所示:
表12
其中,总CT=当前方法的CT之和;总CT占比=当前方法总CT/所有一级方法(没有父方法的方法)的CT2之和,(这里所有一级方法的CT2之和=500,那么a,b,c,d,e,分别为:500/500,300/500,200/500,100/500,100/500)。
图5为运行本发明实施的一种性能分析方法的计算机装置示意图,如图5所示,本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述一种性能分析方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行实现上述一种性能分析方法的计算机程序。
本发明实施例中还提供了一种性能分析装置,如下面的实施例所述。由于该装置解决问题的原理与一种性能分析方法相似,因此该装置的实施可以参见一种性能分析方法的实施,重复之处不再赘述。
图6为本发明实施例一种性能分析装置示意图,如图6所示,本发明实施例还提供一种性能分析装置,可以包括:
配置模块601,用于将探针加入Java程序;
跟踪信息确定模块602,用于在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
跟踪日志文件确定模块603,用于根据跟踪信息,确定跟踪日志文件;
方法栈信息确定模块604,用于根据跟踪日志文件,确定方法栈信息;
方法热点报告确定模块605,用于根据方法栈信息,确定方法热点报告。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,配置模块,具体用于:
设置探针的诊断程序范围、显示方式和写入文件位置;
将设置好的探针加入Java程序。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,跟踪信息确定模块,具体用于:
在JVM启动后,运行Java程序入口方法之前启动探针;
在加载Java程序对应的类之前,对类进行字节码增强,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,跟踪信息确定模块,还用于:
遍历加载的每个类名字,检查类名字是否包含在过滤器里,如果包含则进行字节码转换;
在进行字节码转换时,遍历当前类的全部方法,去掉设定开头的方法以及构造函数,将剩余的方法进入法级字节码增强;
在进入方法后,插入第一字节码;
在方法返回或抛出异常前,插入第二字节码;
根据第一字节码和第二字节码,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,跟踪日志文件确定模块,具体用于:
开启新的独立线程从内存队列中异步获取跟踪信息,持久化到跟踪日志文件。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,所述跟踪信息,包括:调用链和跟踪信息;
所述调用链,包括:父方法和父方法调用的儿子方法构成的链式结构;
所述跟踪信息,包括:父方法的入栈时间戳和出栈时间戳,儿子方法的入栈时间戳和出栈时间戳。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,方法栈信息确定模块,具体用于:
获取跟踪日志文件,从跟踪日志文件中读取跟踪信息,建立跟踪信息列表;
建立一个以线程名称为键值的线程字典桶;
从跟踪信息列表中获取跟踪信息里的线程名;
检查线程字典桶里是否存在线程名的信息;
如果线程字典桶里不存在线程名,则创建一个线程对象,创建一个栈对象pStack,将当前跟踪信息丢入栈顶;将线程对象放入线程字典桶;
如果线程字典桶中存在线程名,则从线程字典桶里获取对应的线程对象;
判断跟踪信息里的出栈标志和入栈标志;
若跟踪信息里的标志为入栈标志时,将当前跟踪信息压入线程对象的栈对象中;
若跟踪信息里的标志为出栈标志时:令栈顶等于弹出线程对象pthread的栈对象pStack的栈顶信息;将当前跟踪信息与栈顶的时间戳相减,得到当前方法的运行总时长CT;构建方法栈数据;如果栈对象等于空,将方法栈数据输出到方法栈结果信息文件中;
重复执行从跟踪信息列表中获取下一跟踪信息里的线程名至得到方法栈结果信息文件的过程,直至获取跟踪信息列表中全部跟踪信息对应的方法栈结果信息文件;
将全部方法栈结果信息文件进行汇总,确定方法栈信息。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,所述当前方法的运行总时长CT为父方法的运行时长和父方法调用的全部儿子方法的运行时长的总和;
将当前方法的运行总时长CT减去父方法调用的全部儿子方法的运行时长,确定为父方法的运行时长CT2(costTime2)。
在具体实施本发明实施例提供的一种性能分析装置时,一个实施例中,所述方法热点报告包括:简单型方法热点报告和树形方法热点报告;
方法热点报告确定模块,具体用于:
将方法栈信息按照类名和方法名的维度进行汇总,把父方法的运行时长CT2按照设定顺序排列,确定简单型方法热点报告;
将方法栈信息按照类名和方法名的维度进行汇总,把当前方法的运行总时长CT按照设定顺序排列,确定树形方法热点报告。
图7为本发明实施例一种性能分析装置程序模块图,如图7所示,本发明实施例还提供一种性能分析装置模块,包括:
1.配置单元,包括前述的配置模块601;
用来配置,需要跟踪哪些package下的类方法,以及怎么输出跟踪信息,持久化到哪里,也可以用来配置内存队列的深度,根据前述的各种配置信息,设定探针,将探针加入Java程序;
2.字节码增强单元,包括前述的跟踪信息确定模块602和跟踪日志文件确定模块603;
通过ASM将方法执行前后的代码进行增强,分别在方法执行前和返回后分别将各自的跟踪信息,写入内存队列,确定跟踪信息。然后额外开启一独立线程,异步从内存队列将跟踪信息持久化,写入跟踪日志文件里;
3.方法栈分析单元,包括前述的方法栈信息确定模块604;
核心分析模块,分析跟踪日志文科,形成规范的方法栈信息,包含调用链,方法耗时,方法自身耗时,进入的时间戳等。
4.方法热点报告单元,包括:方法热点报告确定模块605;
根据方法栈信息,进一步汇总统计出开发人员能够直观看懂的方法热点报告,能直观的看出耗时在什么位置。
其中,配置单元和字节码码增强单元属于探针程序的负责范围,方法栈分析单元和方法热点报告单元属于分析程序的负责范围。
综上,本发明实施例提供的一种性能分析方法和装置,对Java程序加入探针,在JVM启动后对加入探针的Java程序进行字节码增强,可以实现无侵入性的获取跟踪信息;然后根据跟踪信息,确定跟踪日志文件,再根据跟踪日志文件,分析获取方法栈信息,可以当作程序的流程或时序来看,便于分析和优化程序结构,实现跟踪信息至方法栈信息的灵活定制,最后根据方法栈信息,确定方法热点报告,可以直观给出程序中的性能耗时分布和瓶颈所在。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (12)
1.一种性能分析方法,其特征在于,包括:
将探针加入Java程序;
在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
根据跟踪信息,确定跟踪日志文件;
根据跟踪日志文件,确定方法栈信息;
根据方法栈信息,确定方法热点报告。
2.如权利要求1所述的方法,其特征在于,将探针加入Java程序,包括:
设置探针的诊断程序范围、显示方式和写入文件位置;
将设置好的探针加入Java程序。
3.如权利要求1所述的方法,其特征在于,在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息,包括:
在JVM启动后,运行Java程序入口方法之前启动探针;
在加载Java程序对应的类之前,对类进行字节码增强,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
4.如权利要求3所述的方法,其特征在于,对类进行字节码增强,获取进入方法前和方法返回后的跟踪信息,写入内存队列,包括:
遍历加载的每个类名字,检查类名字是否包含在过滤器里,如果包含则进行字节码转换;
在进行字节码转换时,遍历当前类的全部方法,去掉设定开头的方法以及构造函数,将剩余的方法进入法级字节码增强;
在进入方法后,插入第一字节码;
在方法返回或抛出异常前,插入第二字节码;
根据第一字节码和第二字节码,获取进入方法前和方法返回后的跟踪信息,写入内存队列。
5.如权利要求3所述的方法,其特征在于,根据跟踪信息,确定跟踪日志文件,包括:
开启新的独立线程从内存队列中异步获取跟踪信息,持久化到跟踪日志文件。
6.如权利要求1所述的方法,其特征在于,所述跟踪信息,包括:调用链和跟踪信息;
所述调用链,包括:父方法和父方法调用的儿子方法构成的链式结构;
所述跟踪信息,包括:父方法的入栈时间戳和出栈时间戳,儿子方法的入栈时间戳和出栈时间戳。
7.如权利要求6所述的方法,其特征在于,根据跟踪日志文件,确定方法栈信息,包括:
获取跟踪日志文件,从跟踪日志文件中读取跟踪信息,建立跟踪信息列表;
建立一个以线程名称为键值的线程字典桶;
从跟踪信息列表中获取跟踪信息里的线程名;
检查线程字典桶里是否存在线程名的信息;
如果线程字典桶里不存在线程名,则创建一个线程对象,创建一个栈对象,将当前跟踪信息丢入栈顶;将线程对象放入线程字典桶;
如果线程字典桶中存在线程名,则从线程字典桶里获取对应的线程对象;
判断跟踪信息里的出栈标志和入栈标志;
若跟踪信息里的标志为入栈标志时,将当前跟踪信息压入线程对象的栈对象中;
若跟踪信息里的标志为出栈标志时:令栈顶等于弹出线程对象的栈对象的栈顶信息;将当前跟踪信息与栈顶的时间戳相减,得到当前方法的运行总时长CT;构建方法栈数据;如果栈对象等于空,将方法栈数据输出到方法栈结果信息文件中;
重复执行从跟踪信息列表中获取下一跟踪信息里的线程名至得到方法栈结果信息文件的过程,直至获取跟踪信息列表中全部跟踪信息对应的方法栈结果信息文件;
将全部方法栈结果信息文件进行汇总,确定方法栈信息。
8.如权利要求7所述的方法,其特征在于,所述当前方法的运行总时长CT为父方法的运行时长和父方法调用的全部儿子方法的运行时长的总和;
将当前方法的运行总时长CT减去父方法调用的全部儿子方法的运行时长,确定为父方法的运行时长CT2。
9.如权利要求8所述的方法,其特征在于,所述方法热点报告包括:简单型方法热点报告和树形方法热点报告;
根据方法栈信息,确定方法热点报告,包括:
将方法栈信息按照类名和方法名的维度进行汇总,把父方法的运行时长CT2按照设定顺序排列,确定简单型方法热点报告;
将方法栈信息按照类名和方法名的维度进行汇总,把当前方法的运行总时长CT按照设定顺序排列,确定树形方法热点报告。
10.一种性能分析装置,其特征在于,包括:
配置模块,用于将探针加入Java程序;
跟踪信息确定模块,用于在JVM启动后对加入探针的Java程序进行字节码增强,确定跟踪信息;
跟踪日志文件确定模块,用于根据跟踪信息,确定跟踪日志文件;
方法栈信息确定模块,用于根据跟踪日志文件,确定方法栈信息;
方法热点报告确定模块,用于根据方法栈信息,确定方法热点报告。
11.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至9任一项所述一种性能分析方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行实现权利要求1至9任一项所述一种性能分析方法的计算机程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010513534.XA CN111679984B (zh) | 2020-06-08 | 2020-06-08 | 一种性能分析方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010513534.XA CN111679984B (zh) | 2020-06-08 | 2020-06-08 | 一种性能分析方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111679984A true CN111679984A (zh) | 2020-09-18 |
CN111679984B CN111679984B (zh) | 2023-09-19 |
Family
ID=72435132
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010513534.XA Active CN111679984B (zh) | 2020-06-08 | 2020-06-08 | 一种性能分析方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111679984B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113326184A (zh) * | 2021-05-11 | 2021-08-31 | 前海飞算云智软件科技(深圳)有限公司 | 接口测试方法、装置、存储介质及电子设备 |
CN114218047A (zh) * | 2021-12-17 | 2022-03-22 | 中国建设银行股份有限公司 | Java Web应用的日志输出方法和装置 |
CN115858399A (zh) * | 2023-02-09 | 2023-03-28 | 创智和宇信息技术股份有限公司 | 一种利用线程栈快照进行代码级性能分析的方法和系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110258608A1 (en) * | 2010-04-15 | 2011-10-20 | International Business Machines Corporation | Method and apparatus to locate bottleneck of java program |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控系统及方法 |
CN111026601A (zh) * | 2019-09-23 | 2020-04-17 | 拉扎斯网络科技(上海)有限公司 | Java应用系统的监控方法、装置、电子设备及存储介质 |
-
2020
- 2020-06-08 CN CN202010513534.XA patent/CN111679984B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110258608A1 (en) * | 2010-04-15 | 2011-10-20 | International Business Machines Corporation | Method and apparatus to locate bottleneck of java program |
CN110083436A (zh) * | 2019-05-14 | 2019-08-02 | 上海理想信息产业(集团)有限公司 | 一种基于Java字节码增强技术的业务数据实时监控系统及方法 |
CN111026601A (zh) * | 2019-09-23 | 2020-04-17 | 拉扎斯网络科技(上海)有限公司 | Java应用系统的监控方法、装置、电子设备及存储介质 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113326184A (zh) * | 2021-05-11 | 2021-08-31 | 前海飞算云智软件科技(深圳)有限公司 | 接口测试方法、装置、存储介质及电子设备 |
CN114218047A (zh) * | 2021-12-17 | 2022-03-22 | 中国建设银行股份有限公司 | Java Web应用的日志输出方法和装置 |
CN115858399A (zh) * | 2023-02-09 | 2023-03-28 | 创智和宇信息技术股份有限公司 | 一种利用线程栈快照进行代码级性能分析的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111679984B (zh) | 2023-09-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9594665B2 (en) | Regression evaluation using behavior models of software applications | |
US9329980B2 (en) | Security alerting using n-gram analysis of program execution data | |
US9355016B2 (en) | Automated regression testing for software applications | |
US8924937B1 (en) | Method and system for generating verification information and tests for software | |
EP3623948B1 (en) | Method and system for code analysis to identify causes of code smells | |
US20090287729A1 (en) | Source code coverage testing | |
CN109284269A (zh) | 异常日志分析方法、装置、存储介质及服务器 | |
US20150254163A1 (en) | Origin Trace Behavior Model for Application Behavior | |
CN111679984A (zh) | 一种性能分析方法和装置 | |
US20150254162A1 (en) | N-Gram Analysis of Software Behavior in Production and Testing Environments | |
CN106776338B (zh) | 一种测试方法、装置及服务器 | |
US20150254151A1 (en) | N-Gram Analysis of Inputs to a Software Application | |
CN117195568B (zh) | 一种基于离散事件的仿真引擎性能分析方法及装置 | |
CN109857637B (zh) | 基于注解的Java语言方法覆盖率和方法输入输出统计方法 | |
CN116431476A (zh) | 一种基于代码上下文变异的jvm模糊测试方法 | |
US8949103B2 (en) | Program code simulator | |
Srivastava et al. | Efficient integration testing using dependency analysis | |
CN109542444A (zh) | Java应用的监控方法、装置、服务器和存储介质 | |
CN115185797A (zh) | 视觉算法模型的测试方法、系统、电子设备及存储介质 | |
CN114490413A (zh) | 测试数据的准备方法及装置、存储介质和电子设备 | |
CN113806234A (zh) | 一种芯片寄存器提取及测试方法 | |
CN112148590B (zh) | 一种代码覆盖率的确定方法、装置及设备 | |
CN112084108A (zh) | 一种测试脚本生成方法、装置及相关组件 | |
CN112685316A (zh) | 代码执行路径的获取方法、装置、计算机设备及存储介质 | |
CN113806231B (zh) | 一种代码覆盖率分析方法、装置、设备和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |