tmb*_*gmn 5 java jvm cpu-usage tcserver
我们在其中一个应用服务器上看到了一个有趣(但非常严重)的问题:在某个时间点,运行我们的Web应用程序的JVM的CPU使用率开始上升并持续上升,直到应用程序最终减速到爬行.解决此问题的唯一方法是重新启动应用程序服务器软件.
这让我想到一个简单的问题; 我们可以做些什么来解决这个问题?
我考虑过使用VisualVM(或其他一些JVM监控工具),但他们能做的最好 - 在这种特殊情况下 - 给我一个线程转储,它仍然不会告诉我是什么占用了所有的CPU时间(除非我我错过了什么.
你需要找出它在做什么?此问题的常见原因是可用内存不足.如果这不是原因,则需要CPU分析器.VisualVM免费提供JDK,可以为您完成这两项工作.
只有你无法随时分析应用程序
发生这种情况时,您可以通过jstack多次间隔多次调用来进行临时分析.您可以使用diff堆栈跟踪来帮助您找到可能繁忙且占用CPU的线程.
CPU 消耗线程基本上是卡住或占用线程或 GC 活动(如果正在执行 Full GC)。
如果您在基于 UNIX 的环境中,则执行以下命令将预览 JVM 线程的利用率。(PID 是 jvm 的进程 ID)。
prstat -L -p <PID>
Run Code Online (Sandbox Code Playgroud)
随后可以获取 threaddump (kill -3 ),然后将 prstat 和 threadump 关联起来以查找哪些线程正在使用高 CPU。
线程转储中的 nid 对应于 prstat 输出中 LWPID 的十六进制值。
Eg: LWPID = java/75 corresponds to nid = 0X4B
Run Code Online (Sandbox Code Playgroud)
一旦在线程转储中找到 CPU 消耗线程,就可以使用指向调查开始位置的指针。
此外,运行分析器(例如:Jprofiler)会很有帮助。
| 归档时间: |
|
| 查看次数: |
9141 次 |
| 最近记录: |