阻止代码中出现的锁定

时间:2016-01-10 16:56:37

标签: java multithreading profiling java-mission-control

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

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

我正在查看线程锁并看到3个线程被锁定。我打开了堆栈跟踪,看到了一个数字请求/响应,套接字等条目。

知道这意味着什么吗?

Java Mission Control Output

2 个答案:

答案 0 :(得分:1)

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

现在,既然你已经说过你不是开发者了,那就让我为你解决一下:

对象锁定是什么意思?

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

synchronized(myObject){
    //code
}

在执行//code时,没有其他线程可以在块中执行//other code,如:

synchronized(myObject){
    //other code
}

(假设myObject每次引用相同的实际对象。)

锁争用是什么意思?

假设线程A当前正在从上面的示例执行//code(假设它需要一些非零时间),并且线程B到达它想要尝试执行//other code的位置。由于语言设置为这两部分代码不能同时执行(称为mutual exclusion,因此线程b 必须等待执行{在//other code完成之前{1}}。当发生这种情况时,我们会说//code的锁是争用

我看到的3个班级是什么?

这些是作为锁的3个对象的类,它们导致等待它们的线程造成最大的延迟。

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

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

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

这取决于您的航班记录的持续时间,但我的意见(鉴于我不知道您的申请的任何细节,我认为这是一个相当平庸的可能,但不一定。等待最具竞争力的锁定的总时间超过3秒,平均等待时间为一秒半。这可能听起来不是很多(如果等待发生在一个相对不重要的线程上,实际上可能不会很多),但对于代码来说,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。如果您在管理用户界面的线程上发生等待锁定,则用户会注意到延迟。

作为非开发人员,我最好的建议是通过查看myObject对象来获取您收到的堆栈跟踪,并将其发送给项目的开发人员以进一步检查。

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

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

答案 1 :(得分:0)

与许多程序一样,他们将大部分时间用于记录。在这种情况下,你的程序花了很多时间写入它的控制台,我想这被重定向到一个文件。写得越多,花费的时间就越长。 esp如果您的磁盘子系统成为瓶颈。如果日志在某个地方进入某个屏幕,它可能会根据计算机的运行速度变慢。