技术文章

哪些代码(操作)可能会导致CPU的使用率增加?

我们在项目开发过程中和上线后,监控服务器资源使用的时候,首先看的是就是CPU和内存的使用情况,所以我们在写代码的时候,最好也能明白CPU使用率跟啥有关系,避免CPU不正常的飙升。

CPU使用率

列举一些比较消耗CPU的操作

GC是要占用CPU的,所以如果程序内存分配太快,导致需要频繁的进行GC操作,那么会导致CPU的占用率过高;例如Young GC在进行垃圾回收操作的时候,会计算内存和调用寄存器,所以如果Young GC很频繁的话,CPU的占用率也会很高;所以很多时候,Java程序内存占用的高了,会导致CPU占用率过高;

顺便说一句,数据库中,大记录集排序不仅增加了CPU开销(数据库服务器);而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降;

序列化和反序列化;

线程上下文切换:如果线程数量启用的过多,会导致线程不断的在阻塞状态和执行状态之间切换;所以线程池的大小也不能瞎设置;

正则表达式校验;

加密、解密;

死循环:死循环会调用寄存器进行计数,这个操作就会占用CPU;另外死循环不会让出CPU,除非时间片到期,但是死循环还是会不断地申请时间片;

CPU使用率

如何定位CPU占用率过高的原因

通常我们的应用都运行在Linux系统上:

1、登录到服务器上后,通过top命令查看CPU使用率高的线程;(top后shift+H)

2、找到线程号,转成16进制;

3、使用jps命令查看java进程号;

4、使用jstack [进程号] 打印当前进程的堆栈;

5、在堆栈信息中,看看这个线程号对应的线程在做什么操作。