我正在调查一个持续存在的 CPU 使用率问题,该问题在使用一段时间后会变高。我在其中一个节点上收到负载很高的警报,我打开了 Java Mission Control 并快速记录了飞行记录。
我附上我所看到的输出。我不是开发人员,因此我需要帮助来理解我所看到的内容。
我正在查看线程锁,发现有 3 个线程被锁定。我打开堆栈跟踪并看到一些 Request/Response 、 Socket 等条目。
知道这意味着什么吗?
最佳答案
您显示的图像并未显示三个锁定的线程,而是显示了三个竞争最激烈的锁对象。有关您正在查看的页面上各个部分的含义的一般开发人员友好描述,请参阅 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/