官方文档http://resources.ej-technologies.com/jprofiler/help/doc/index.html
错误地使用线程可能会产生许多不同类型的问题。太多活动线程可能导致线程不足,线程可能会相互阻塞并影响应用程序的活跃性或以错误的顺序获取锁定可能导致死锁。此外,有关线程的信息对于调试目的很重要。
在JProfiler中,线程分析分为两个视图部分,“线程”部分处理线程的生命周期和捕获线程转储。“监视器和锁定”部分提供了分析多个线程交互的功能。
线程历史记录视图将每个线程显示为时间线中的彩色行,其中颜色表示记录的线程状态。线程按创建时间排序,可以按名称过滤。记录监视器事件后,您可以将鼠标悬停在处于“等待”或“阻止”状态的线程部分,并查看关联的堆栈跟踪以及指向监视历史记录视图的链接。
线程监视器视图中提供了所有线程的表格视图。如果在创建线程时CPU记录处于活动状态,则JProfiler会保存创建线程的名称并将其显示在表中。在底部,显示了创建线程的堆栈跟踪。出于性能原因,未从JVM请求实际堆栈跟踪,但使用来自CPU记录的当前信息。这意味着堆栈跟踪将仅显示满足调用树集合的过滤器设置的那些类。
如果在概要分析设置中启用了估计的CPU时间记录,则会在表中添加“ CPU时间”列。仅在记录CPU数据时测量CPU时间。
与大多数调试器一样,JProfiler也可以进行线程转储。线程转储的堆栈跟踪是JVM提供的完整堆栈跟踪,不依赖于CPU记录。当您选择两个线程转储并单击“ 显示差异”按钮时,可以在差异查看器中比较不同的线程转储。也可以通过选择它们并从上下文菜单中选择Show Difference来比较单个线程转储中的两个线程 。
线程转储也可以通过“触发器线程转储”触发器操作或通过 API进行。
每个Java对象都有一个关联的监视器,可用于两个同步操作:一个线程可以在监视器上等待,直到另一个线程在其上发出通知,或者它可以获取监视器上的锁,可能阻塞直到另一个线程放弃锁的所有权。此外,Java还提供了java.util.concurrent.locks
包中的类,用于实现更高级的锁定策略。该包中的锁不使用对象的监视器,而是使用不同的本机实现。
JProfiler可以记录上述两种机制的锁定情况。在锁定情况下,有一个或多个线程,监视器或实例java.util.concurrent.locks.Lock
以及需要一定时间的等待或阻塞操作。这些锁定情况在监视器历史记录视图中以表格形式显示,并在锁定历史记录图中以可视方式显示。
锁定历史记录图集中关注所有相关监视器和线程的整个关系集,而不是隔离监视器事件的持续时间。参与锁定情况的线程和监视器被绘制为蓝色和灰色矩形,如果它们是死锁的一部分,则它们被涂成红色。黑色箭头表示监视器的所有权,黄色箭头从等待线程延伸到关联的监视器,而红色虚线箭头表示线程想要获取监视器并且当前正在阻塞。如果已记录CPU数据,则将鼠标悬停在阻塞或等待箭头上时,可以使用堆栈跟踪。这些工具提示包含超链接,可将您带到监视历史记录视图中的相应行。
表格监视器历史记录视图显示监视器事件。它们具有显示为列的持续时间,因此您可以通过对表进行排序来查找最重要的事件。对于表格视图中的任何选定行,您可以使用“ 在图形中显示”操作跳转到图形。
每个monitor事件都有一个关联的监视器。所述监视器类列显示其监控器被使用,或“[原监控]”如果没有Java对象与所述显示器相关联的实例的类名。在任何情况下,监视器都有一个唯一的ID显示在单独的列中,因此您可以将同一监视器的使用情况与多个事件相关联。每个监视器事件都有一个正在执行操作的等待线程,以及可选的阻塞操作的拥有线程。如果可用,它们的堆栈跟踪将显示在视图的下半部分。
如果您对显示器的实例进一步的问题,将在堆查看器显示两个监视器历史视图操作和锁定历史图提供了一个链接到堆Walker和选择监视器实例作为一个新的对象集。
分析监视器事件的一个基本问题是应用程序可能以非常高的速率生成监视器事件。这就是为什么JProfiler具有等待和阻止事件的默认阈值,低于该阈值会立即丢弃事件。这些阈值在视图设置中定义,并且可以增加以便关注更长的事件。
对于录制的事件,您可以进一步应用过滤器。监视历史记录视图在视图顶部提供阈值,事件类型和文本过滤器。锁定历史记录图允许您选择感兴趣的线程或监视器,并仅显示涉及标记实体的锁定情况。感兴趣的事件在时间线中以不同的颜色显示,并且有一个辅助导航栏来逐步完成这些事件。如果当前事件不是感兴趣的事件,您可以查看当前事件与下一个任何方向感兴趣的事件之间有多少事件。
除了存在所选线程或监视器的锁定情况之外,还显示了从图形中移除它的锁定情况。这是因为每个监视器事件都由两个这样的锁定情况定义,一个是操作开始,另一个是结束。这也意味着一个完全空的图是一个有效的锁定情况,表明JVM中没有更多的锁。
减少需要注意的事件数量的另一个策略是累积锁定情况。在锁定历史记录图表中,底部有一个时间线,显示所有记录的事件。单击并拖动它可选择一个时间范围,所有包含事件的数据将显示在上面的锁定图中。在累积图中,每个箭头可以包含多个相同类型的事件。在这种情况下,工具提示窗口显示事件的数量以及所有包含事件的总时间。工具提示窗口中的下拉列表显示时间戳,并允许您在不同事件之间切换。
无论是否记录监视器事件,始终显示当前锁定图和当前监视器视图中的数据。这些视图显示当前锁定情况和正在进行的监视器事件。阻塞操作通常是短暂的,但是如果发生死锁,两个视图都将显示问题的永久视图。此外,当前锁定图表显示产生红色死锁的线程和监视器,因此您可以立即发现此类问题。
要从更高的角度研究阻止和等待操作,监视器统计信息视图将根据监视器记录数据计算报告。您可以按监视器,线程名称或监视器类对监视器事件进行分组,并分析每行的累计计数和持续时间。