文章目录
📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、优快云博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。🎥有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。


🍊 查看CPU占用率
使用系统监控工具或命令行工具查看Java程序占用CPU的情况,如果发现CPU占用率很高,那么问题可能就出在Java程序上。
在Linux系统中,可以使用以下几种方法查看CPU占用率:
🎉 1. 使用top命令
打开终端输入top命令,可以看到进程列表,其中CPU占用率最高的进程排在最上面。在top命令下,我们可以使用“%cpu”进行占用率排序,按照CPU占用率从高到低排序,并可以查看该进程的PID、用户、内存、虚拟内存和进程名称等。
🎉 2. 使用htop命令
htop是top的一个增强版,它可以显示更多的进程信息,支持鼠标操作和更加友好的用户界面。
首先需要安装htop工具,可以使用以下命令进行安装:
sudo apt-get install htop
安装完后,打开终端,输入htop命令,按回车键,会显示出当前系统中各个进程的资源使用情况,包括CPU使用率、内存使用率等,和top命令类似,但是界面更加直观。
示例代码:
htop
检查其他系统资源的使用情况可以通过查看系统日志、网络使用情况、磁盘使用情况等。
查看系统日志可以使用以下命令:
sudo tail -f /var/log/syslog
这个命令可以实时查看系统日志,可以查看出一些错误信息和警告信息。
查看网络使用情况可以使用以下命令:
sudo iftop
这个命令可以查看当前系统中的网络流量情况,可以查看到哪些进程正在使用网络,以及它们的流量大小。
查看磁盘使用情况可以使用以下命令:
df -h
这个命令可以查看当前系统中硬盘的使用情况,可以查看到哪些分区的可用空间不足。
示例代码:
sudo tail -f /var/log/syslog
sudo iftop
df -h
🎉 3. 使用ps命令
ps命令是Linux下常用的进程查看命令,可以查看当前所有进程的状态。可以输入以下命令查看进程的CPU占用率:ps -aux | grep java
这个命令会输出所有正在运行的Java进程,包括进程PID、CPU占用率、内存占用率和进程命令等信息。
以下是一些示例代码:
使用top命令
top
使用htop命令
sudo apt-get install htop
htop
使用ps命令
ps -aux | grep java
🍊 检查Java程序的线程数
Java程序的线程数过多,也会导致CPU占用率过高,使用jstack命令查看程序的线程数,如果线程数过多,可以考虑使用线程池等技术进行优化。
检查Java程序的线程数可以使用jstack命令,该命令可以输出Java程序的线程堆栈信息,包括线程的状态、调用栈等信息。通过解析jstack输出的信息可以得到线程数量的数据。
示例代码如下:
-
打开Linux终端或命令行窗口
-
切换到Java程序的运行目录
-
使用以下命令获取Java程序的进程ID
ps -ef|grep java
输出结果中可以看到Java程序的进程ID(PID)
- 使用以下命令获取Java程序的线程堆栈信息
jstack [PID]
其中,[PID]为Java程序的进程ID,执行该命令后,会输出Java程序的线程状态、调用栈等信息,其中包含线程数量的数据。
例如,假设Java程序的进程ID为1234,则可以使用以下命令检查Java程序的线程数:
$ cd /path/to/java/program
$ ps -ef|grep java
user 1234 1 0 Jan01 ? 00:00:00 java -jar program.jar
user 5678 1234 90 Jan01 ? 01:23:45 java -Xmx1024m -jar program.jar
$ jstack 5678
在命令输出的信息中可以看到线程数量的数据,如果发现线程数过多,可以采取线程池等技术进行优化。
🍊 检查内存和GC情况
如果Java程序在运行时频繁进行GC(垃圾回收),也会导致CPU占用率升高,此时可以通过查看GC情况或者使用内存分析工具进行定位。
检查内存和GC情况的方法:
🎉 1. 使用jps命令查看Java进程的进程号
jps
输出结果类似:
1234 MyApp
5678 Jps
其中MyApp就是Java进程的名称,1234就是进程号。
🎉 2. 使用jstat命令查看GC情况
jstat -gcutil <pid> <interval> <count>
其中<pid>为Java进程的进程号,<interval>为间隔时间(单位为毫秒),<count>为查询次数。
示例代码,每隔1秒查询一次,共查询3次:
jstat -gcutil 1234 1000 3
输出结果类似:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 72.43 23.81 81.03 76.14 1140 190.027 42 4.816 194.843
0.00 0.00 72.43 23.81 81.03 76.14 1141 190.057 42 4.816 194.872
0.00 0.00 72.43 23.81 81.03 76.14 1142 190.089 42 4.816 194.905
其中:
S0和S1表示Survivor区的使用情况;E表示Eden区的使用情况;O表示Old区的使用情况;M表示Metaspace区的使用情况;CCS表示Compressed Class Space区的使用情况;YGC表示Young GC的次数;YGCT表示Young GC的时间;FGC表示Full GC的次数;FGCT表示Full GC的时间;GCT表示GC总时间。
从GC情况可以看出,如果Young GC次数和时间过多,说明有大量对象被频繁创建和释放,此时可以考虑优化代码;如果Full GC次数和时间过多,说明Old区的对象太多,可以考虑调整JVM参数或者优化代码。
🎉 3. 使用jmap命令生成内存快照
jmap -dump:format=b,file=<filename> <pid>
其中<filename>为生成的快照文件名,<pid>为Java进程的进程号。
示例代码:
jmap -dump:format=b,file=heapdump.bin 1234
生成的快照文件可以使用Memory Analyzer Tool(MAT)等内存分析工具进行分析。
注意:生成内存快照会阻塞Java进程,建议在非生产环境下进行。
🍊 检查程序中的死循环等问题
如果Java程序中存在死循环等问题,也会导致CPU占用率升高,可以通过代码审查或者查看日志进行排查。
查找程序中的死循环等问题,可以通过以下几个步骤:
-
查看日志文件:查看程序的日志文件,判断程序在哪个时间段CPU占用率出现问题。如果可以定位到某一个时间段,可以针对这个时间段进行分析。
-
检查代码:查看程序中的代码,搜索是否存在死循环、无限递归等可能导致CPU占用率升高的问题。以下是一个简单的死循环例子:
while(true) {
// do something
}
在上面的代码中,while循环的条件永远为true,会一直执行下去,造成CPU占用率升高。
- 分析线程:查看程序中的线程,判断是否存在一些线程在不断地执行某个操作,导致CPU占用率升高。以下是一个简单的线程例子:
public class MyThread extends Thread {
@Override
public void run() {
while(true) {
// do something
}
}
}
在上面的代码中,线程的run方法中的while循环条件永远为true,会一直执行下去,造成CPU占用率升高。
以上只是简单的示例代码,实际情况比较复杂。如果无法找到问题,可以通过Java Profiler等工具进行分析。

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
📥博主的人生感悟和目标

- 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本身是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
- 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
- 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
- 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。
173

被折叠的 条评论
为什么被折叠?



