我们在项目开发过程中和上线后,监控服务器资源使用的时候,首先看的是就是CPU和内存的使用情况,所以我们在写代码的时候,最好也能明白CPU使用率跟啥有关系,避免CPU不正常的飙升。
GC是要占用CPU的,所以如果程序内存分配太快,导致需要频繁的进行GC操作,那么会导致CPU的占用率过高;例如Young GC在进行垃圾回收操作的时候,会计算内存和调用寄存器,所以如果Young GC很频繁的话,CPU的占用率也会很高;所以很多时候,Java程序内存占用的高了,会导致CPU占用率过高;
顺便说一句,数据库中,大记录集排序不仅增加了CPU开销(数据库服务器);而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降;
序列化和反序列化;
线程上下文切换:如果线程数量启用的过多,会导致线程不断的在阻塞状态和执行状态之间切换;所以线程池的大小也不能瞎设置;
正则表达式校验;
加密、解密;
死循环:死循环会调用寄存器进行计数,这个操作就会占用CPU;另外死循环不会让出CPU,除非时间片到期,但是死循环还是会不断地申请时间片;
通常我们的应用都运行在Linux系统上:
1、登录到服务器上后,通过top命令查看CPU使用率高的线程;(top后shift+H)
2、找到线程号,转成16进制;
3、使用jps命令查看java进程号;
4、使用jstack [进程号] 打印当前进程的堆栈;
5、在堆栈信息中,看看这个线程号对应的线程在做什么操作。