java - 阻止代码中出现的锁

标签 java multithreading profiling java-mission-control

我正在调查一个持续存在的 CPU 使用率问题,该问题在使用一段时间后会变高。我在其中一个节点上收到负载很高的警报,我打开了 Java Mission Control 并快速记录了飞行记录。

我附上我所看到的输出。我不是开发人员,因此我需要帮助来理解我所看到的内容。

我正在查看线程锁,发现有 3 个线程被锁定。我打开堆栈跟踪并看到一些 Request/Response 、 Socket 等条目。

知道这意味着什么吗?

Java Mission Control Output

最佳答案

您显示的图像并未显示三个锁定的线程,而是显示了三个竞争最激烈的锁对象。有关您正在查看的页面上各个部分的含义的一般开发人员友好描述,请参阅 the doc on this page .

现在,既然您已经说过您不是开发人员,那么让我为您详细解释一下:

对象成为锁意味着什么?

这是一个java的东西。 Java 已经基于 monitors 的概念建立了多线程锁定方案。 。基本上该语言中的任何对象都可以用作锁,这样当线程执行如下代码时:

synchronized(myObject){
    //code
}

//code 正在执行时,没有其他线程可以在 block 中执行 //other code,如下所示:

synchronized(myObject){
    //other code
}

(假设 myObject 每次都引用同一个实际对象)。

争用锁意味着什么?

假设线程 A 当前正在执行上面示例中的 //code(假设它需要一些非零时间),并且线程 B 到达它想要尝试执行 的位置//其他代码。由于语言的设置使得这两部分代码无法同时执行(称为 mutual exclusion ,因此线程 b 将不得不坐下来等待来执行 //其他代码直到//code完成。当发生这种情况时,我们说myObject的锁已竞争

我看到的 3 个类(class)是什么?

这些是充当锁的 3 个对象的类,它们因等待它们的线程而导致最大延迟。

我看到的堆栈跟踪是什么?

这是对其中一个线程花费最多时间等待的位置之一的堆栈跟踪。

您最关心的问题可能是:此配置文件中的信息是否表明存在性能问题?

这取决于您的飞行记录被记录了多长时间,但我的观点(考虑到我不知道您申请的任何细节,所以持保留态度)可能是相当平淡的,但不是必然。等待竞争最激烈的锁的总时间略多于 3 秒,平均等待时间为 1 秒半。这听起来可能不是很多(如果等待发生在相对不重要的线程上,实际上可能也不是很多),但对于代码来说,1.5 秒的等待可能很多。考虑到这一点,用户界面响应性的准则是操作必须 take less than 0.1 seconds for a user not to notice and less than 1 second for their train of thought to not be interrupted 。如果您对该锁的等待发生在管理用户界面的线程上,则用户会注意到延迟。

作为非开发人员,我对您的最佳建议是通过查看 java.lang.ref.ReferenceQueue$Lock 对象来获取收到的堆栈跟踪,并将其发送给开发人员您的项目需要进一步检查。

此外,您提到 CPU 负载问题促使了此项调查,因此:竞争锁会导致高 CPU 负载吗?

否。当发生锁争用时,一个或多个线程会处于等待状态,这意味着它们不会使用 CPU。事实上,锁争用可能导致问题的迹象之一是您的 CPU 负载是否异常低(特别是在多核计算机上)。您的高 CPU 使用率可能位于分析结果中的其他位置。要调查高 CPU 使用率,您应该尝试方法热点或类似 this 的方法。 。如果您有训练有素的开发人员与您一起查看,那么工作效率可能会大大提高。

关于java - 阻止代码中出现的锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708188/

相关文章:

go - runtime.adjustdefers 在 pprof 输出中意味着什么?

java - Apache Camel : do not trigger route if previous route run is not complete

linux - ptrace 和线程

python - 无法使 cProfile 在 IPython 中工作

java - Java 条件等待和通知

c# - ASP.NET Web API 异步任务,发送邮件

c++ - 我如何衡量我的多线程代码扩展(加速)的方式?

java - 找不到 org.apache.hadoop.mapred.LocalClientProtocolProvider

java - 如何清除 picasso 的缓存?

Java正则表达式重复组捕获