java项目:项目定制化产品的微服务,主要做查es的定时任务和报表统计,实时监控数据.
上线几天,cpu报警
看图:
排查思路:
七八个定时任务同时查es,可能造成的飙升,然后只能拿jstack分析,生产环境慎用.
jstack是Java开发工具包中的一个命令行工具,用于生成Java虚拟机(JVM)的线程堆栈跟踪信息。jstack记录的线程堆栈跟踪信息对于分析和调试Java应用程序非常有用。
jstack记录的作用:
- 线程状态分析:jstack可以提供每个线程的状态信息,包括线程的运行状态(如运行中、等待、阻塞等)和优先级。这对于识别和解决应用程序中的线程问题非常有帮助。
- 死锁检测:jstack可以检测并显示应用程序中的死锁情况。通过分析线程堆栈跟踪信息,可以确定哪些线程持有了哪些锁,并且哪些线程正在等待锁。这有助于识别潜在的死锁问题,并采取相应的措施进行解决。
- 性能分析:jstack可以提供应用程序中各个线程的执行情况。通过分析线程堆栈跟踪信息,可以确定哪些线程正在执行哪些代码,并了解每个线程的执行时间。这有助于识别性能瓶颈和优化代码。
- 内存泄漏分析:jstack可以显示线程堆栈跟踪信息中的对象引用关系。通过分析线程堆栈跟踪信息,可以确定哪些对象正在被哪些线程引用,从而帮助识别潜在的内存泄漏问题。 总之,jstack记录的线程堆栈跟踪信息对于分析和调试Java应用程序非常有用。它可以帮助开发人员识别线程问题、死锁、性能问题和内存泄漏等,并提供有价值的信息用于问题的定位和解决。
jstack 1 > test.txt
1为 PID test.txt 生成记载的文件
怎么分析java的stack文件?
1.使用jstack命令生成stack文件:在命令行中运行jstack <pid> > stack.txt,其中<pid>是Java应用程序的进程ID。这将会生成一个名为stack.txt的文件,其中包含了Java应用程序的线程堆栈信息。
2.打开stack文件:使用文本编辑器(如Notepad++、Sublime Text等)打开生成的stack文件。
3.分析线程堆栈信息:在stack文件中,每个线程的堆栈信息以"Thread"开头。每个线程的堆栈信息可以帮助我们了解线程的执行状态、调用的方法以及方法调用的深度。
4.查找CPU占用高的线程:根据线程堆栈信息,可以查找CPU占用高的线程。通常情况下,CPU占用高的线程会在堆栈信息中有大量的方法调用或者处于某个方法调用中。
5.分析线程堆栈信息:分析CPU占用高的线程的堆栈信息,可以确定导致CPU暴增的具体代码位置。检查是否存在无限循环、过度递归、频繁的IO操作、大量的计算等问题。
6.进行代码优化:根据分析结果,进行相应的代码优化。可以使用合适的算法、减少不必要的计算、优化IO操作等,以降低CPU的使用率。
7.进行性能测试:在进行代码优化后,可以进行性能测试,验证优化效果。通过监控CPU使用情况,确认是否成功降低了CPU的占用率。
需要注意的是,stack文件只是一个快照,记录了线程的堆栈信息。如果你想要监控应用程序的CPU使用情况,可以考虑使用性能分析工具(如Java VisualVM、JProfiler、YourKit等),这些工具可以提供更详细的CPU使用情况、方法调用树等信息,帮助你更好地分析和解决CPU暴增问题。
问题原因:
查到原因 ,看了代码 Socket没关闭;
最后:生产上jmap也慎用
哪些对象占用内存 前20
jmap -histo 27863 | head -20