剖析java.util.concurrent锁 - 编程入门网
2)
时间:2010-11-03 infoq 译:齐尧
3. 如何使用 本节将通过一个真实的应用来探究如何使用jucprofiler来寻找程序中的问题。 3.1. 运行jucprofiler 使用如下的命令:
jucprofiler可以用于任何运行在JDK6上的Java程序上。假设jucprofiler安装在了目录$JUCP中,在 jucprofiler运行完你的程序之后,就会生成一个叫"BCIAgent.***.bci.trace"的文件,其中"***"代表本次运行的唯一时间戳。 3.2. 获取结果 运行如下所示的命令来得到结果:
其中: {tracefile}是一个追踪文件的全路径名称或者是一个包含若干追踪文件的目录名称,比如BCIAgent.***.bci.trace。 {resultOutputFile}是可选的参数,用来指定存放分析结果的文件。如果没有这个选现,那么分析结果就会在控制台打印出来。 说明:因为对追踪文件事后分析过程会有一些内存开销,所以最好用Java选项-Xmx来增加堆的大小。在我们的实验里,分析160M的文件,需要800M的内存。 3.3. 结果解析 如下图所示,纯文本输出包含了不同类型的信息,比如锁的名称,锁竞争的次数和时间,锁被持有的时间和次数,锁在申请时线程的调用栈,持续的时间和每一次锁竞争的调用栈。这些结果有助于用户发现JUC锁竞争造成的程序瓶颈。 在“LEGEND” 段之前,结果报告首先,按照锁竞争次数和时间的降序,总结了程序中全部的JUC锁竞争。其中每一行属于两种类型的一种,“AQS”代表JUC 锁,“CHM”代表ConcurrentHashMap. 因为一个ConcurrentHashMap内部被分割为了若干个片段(segment)进行存储,而且每一个片段都被一个不同的JUC锁保护,所以,从锁的角度来看,ConcurrentHashMap可以被看作为一个JUC锁的集合。例如,“CHM@8”有276次锁竞争,一共3,945,7000 纳秒的竞争时间,这就是说,“CHM@8”中的所有片段的JUC锁共有276次锁竞争,一共3,945,7000纳秒的竞争时间。这样的对锁的分组能够帮助程序员发现哪一个ConcurrentHashMap对象发生了最严重的锁竞争。相反,JUC锁“AQS@1790” 不属于任何一个ConcurrentHashMap对象,它就是程序中一个显式使用的锁。 说明:因为在这个例子中,没有打开记录获得锁的功能,所以列HOLD-COUNT和HOLD-TIME都是零。 在“LEGEND”段之后,结果给出了每一个JUC锁竞争的详细信息。在下边的结果片段中,对于ConcurrentHashMap “CHM@8” ,锁竞争出现在两个用来保护片段的锁上 “Lock [AQS@135]” and “Lock [AQS@146]”。对于“Lock [AQS@135]”,它在一个程序位置出现竞争,显示了竞争的次数,时间和竞争时刻的线程调用栈。对于“Lock [AQS@146]”,给出了同样的信息。这些细节信息可以很好地帮助程序员来定位程序中的锁竞争,并且清楚地理解ConcurrentHashMap中哪个片段竞争最严重。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |