以下是我在采样模式下探测应用程序时JProfiler的“CPU视图”的“热点”的屏幕截图。堆栈的顶部(占CPU使用率的76%)被“java.lang.Thread.run”占用。
我的问题是这些线程是什么?这些是负责从第二个位置和下面显示的其他热点的线程(在绿色框中标记)?或者这些是做垃圾收集和所有背景任务的线程(相应的方法在热点列表中不可见)?
答案 0 :(得分:1)
大多数网络服务器(Java和其他方面,包括JBoss)遵循“每个请求一个线程”模型,即每个HTTP请求完全由一个线程完全处理。这个线程通常会花大部分时间等待DB请求之类的事情。 Web容器将根据需要创建新线程。
这些线程不负责垃圾回收活动。 JVM总是在专用线程中执行GC,即“GC线程”。每当GC线程处于活动状态时,它们就会与可用处理器的实际“应用程序线程”竞争,从而与CPU时间竞争。
要回答您的问题,请在此处考虑与用户请求相对应的所有任务。换句话说,您的CPU花费了76%的时间来处理用户请求。
所有嵌套的方法调用时间都会在您在图像中显示的第一个热点中捕获。
答案 1 :(得分:0)
很可能这部分负责JEE / JSE内部内容,例如解压缩JAR。默认情况下,JProfile过滤器是关闭的。这种隐藏的RAM / CPU消耗占用了您的大部分资源,这意味着您的应用程序本身实际上并没有消耗或根本没有做任何有意义的工作;-)
禁用过滤器(会话设置->过滤器设置),然后重新启动分析。您将看到“ Thread.run”后面发生了什么。