java的常见性能问题分析以及出现场景

一般来说java出现性能问题就是代码写的不怎么样,需要使用一些命令或者工具手动定位到问题代码并进行优化

CPU占满

这种问题一般出现在使用了大量的计算资源,比如:

GTA5联机版的要跑19.8亿次if语句、堪称游戏开发史上最大的“屎山”代码,一支烟的功夫游戏都加载不完。存在了7年,R星从没想过要修复。这大量的if判断需要消耗CPU资源,导致CPU占满

那么如何定位到代码问题所在呢?

可以使用top命令,top命令使我们最常用的Linux命令之一,它可以实时的显示当前正在执行的进程的CPU使用率,内存使用率等系统信息。top -Hp pid可以查看线程的系统资源使用情况

定位到线程之后可以使用jstack来动态监视jvm的堆栈使用情况

内存泄漏

程序中存在无用但是存在引用的对象

常见的情况有:忘记断开引用,使用生命周期很长的对象,ThreadLocal使用不当

使用JProfiler来分析及定位内存泄漏问题

也可以使用linux的命令来定位问题,比如top和vmstat

vmstat是一个指定周期和采集次数的虚拟内存检测工具,可以统计内存,CPU,swap的使用情况,它还有一个重要的常用功能,用来观察进程的上下文切换。

死锁(内存占满)

死锁会导致耗尽线程资源,占用内存,表现就是内存占用升高,如果是直接new线程,会导致JVM内存被耗尽,报无法创建线程的错误,这也是体现了使用线程池的好处

死锁的出现必须满足四大条件,条件内容百度即可,预防死锁只要避免其中一个条件就可以了,如按序获取资源、一次申请所有要使用的资源、申请不到资源时,可以放弃已有资源

线程频繁切换

上下文切换会导致将大量CPU时间浪费在寄存器、内核栈以及虚拟内存的保存和恢复上,导致系统整体性能下降。当你发现系统的性能出现明显的下降时候,需要考虑是否发生了大量的线程上下文切换

通过top命令以及top -Hp pid查看进程和线程CPU情况,发现Java线程CPU占满了,但是线程CPU使用情况很平均,没有某一个线程把CPU吃满的情况,这种情况就是线程频繁切换的典型例子

经验分享 程序员 微信小程序 职场和发展