问题:每天的系统自动计算都会报CPU使用率过高短信报警与邮件报警
最终问题定位:vendor信息同步redis中代码 for循环中使用list.contains()线性查找判断sku是否存在,该代码块的时间复杂度近似O(n*m)导致线程并发情况下CPU耗用高
解决方案:把list数据放入HashSet判断sku是否存在,把CPU使用率从90+%降到了10+%及以下
通常的解决思路是:
-
top
命令找出有问题Java
进程及其线程号:- 开启线程显示模式
- 按
CPU
使用率排序 - 记下
Java
进程号及其CPU
高的线程号
- 手动转成十六进制(可以用
printf %x 1234
)。 -
jstack
有问题的Java
进程。 -
grep
十六进制的线程id
,找到线程栈,查看关联的问题代码块。
参见:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#beer-show-busy-java-threadssh
本次解决时,基本知道哪个代码模块Job有问题,同时无法访问线上系统环境(可以申请),所以省略了大部分步骤,只使用了的jstack来解决问题。
本次解决思路:
1、根据报警时间与当时正在跑的Job,定位到具体JOB,当时只有VENDOR一个Job在跑
2、晚上跑vendor信息同步redis,在cpu使用率高时,选择一台机器,执行 jstack -l pid命令,并导出栈信息
3、查看栈信息,找到具体的线程栈,查看当时栈都在执行什么操作,发现vendor的10个线程所有Thread栈都在执行com.calc.redis.adaptor.VendorSKURedisAdaptor.getValue(VendorSKURedisAdaptor.java:66)
4、分析具体的代码,基本定位到使用list.contains()线性查找导致CPU使用过高
5、将上段代码由list改为HashSet,上线测试,CPU使用率正常,问题解决。如果CPU还高的话就需要循环以上步骤,改进耗CPU的代码
Tips:解决问题过程中发现的一个有关线程池的未合理使用场景
定位到具体job,分析相应时间段的任务队列表时,发现CPU高集中报在Job会连续占用多个id相连的任务阶段。线程池固定大小是10,队列固定也是10,RejectedExecutionHandler策略使用的是CallerRunsPolicy,当CallerRunsPolicy生效跑的过程中,线程池不会放入新的任务,使得CallerRunsPolicy执行完后线程池队列基本是空的,未能充分使用线程资源。
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 120, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.CallerRunsPolicy());
这时需要考虑如何合理的使用线程资源,诸位自己想想吧。
相关推荐
在Java编程语言中,开发一个绘制CPU使用率图形的程序是一项技术挑战,它涉及到系统监控、图形用户界面(GUI)以及实时数据处理等多方面的知识。这个程序的主要目的是模拟任务管理器的部分功能,显示计算机的CPU使用...
请注意,由于JVM自身的开销,直接测量的CPU使用率可能包含JVM的消耗,因此在某些情况下可能需要进一步调整。 此外,还可以结合其他监控工具,如Prometheus、Grafana或JMX工具,将Java程序集成到更全面的系统监控...
- **频繁的垃圾回收**:由于业务压力较大,JVM不得不频繁地执行垃圾回收任务,这会消耗大量的CPU资源,进而导致CPU使用率居高不下。 - **内存参数配置不当**:JVM的内存参数设置为`-Xms2048m -Xmx2048m`,即初始堆...
互联网资讯,技术简介,IT、AI技术,人工智能
5. **分析**:打开`flamegraph15394.svg`,观察CPU使用率最高的函数调用,识别性能问题。 通过上述工具和方法,开发者可以深入理解JVM中各个方法的CPU使用情况,找出性能瓶颈,进一步优化Java代码,提升系统效率。...
通过jconsole,用户可以直观地看到JVM的CPU使用率、堆内存使用情况等关键指标。 **使用步骤:** 1. **启动jconsole**:在命令行输入`jconsole`即可启动该工具。 2. **连接本地JVM**:启动后,jconsole会自动检测并...
在Java应用程序的运行过程中,有时候会遇到JVM(Java虚拟机)CPU使用率过高的问题。这通常是由于线程执行不恰当或者存在死锁、资源争抢等状况引起的。为了定位并解决这些问题,开发者需要有效地监控和分析Java线程的...
`top`命令还支持多种内部命令,如`s`可调整屏幕刷新频率,`l`开关第一部分的第一行信息显示,`t`开关任务和CPU信息显示,`m`开关内存和交换分区信息显示,`N`、`P`、`M`分别按PID、CPU使用率和内存使用率排序进程,`...
- `P`:按CPU使用率排序显示进程列表。 - `M`:按内存使用率排序显示进程列表。 - `h`:显示帮助信息。 - `n`:设置显示的进程数量。 - `q`:退出`top`。 3. **使用`free`命令查看内存使用情况** `free`命令...
1、用top命令找到cpu占用率最高的进程号是8958 top 2、top -Hp pid 命令找到该进程下cpu占用最高的线程(shift+p 按cpu排序,shift+m 按内存排序) top -Hp 8958 3、使用 printf ‘%x\n’ PID (PID为上一步中获取...
5. **CPU使用率**:监控JVM的CPU使用情况,过高可能意味着存在性能瓶颈或无用计算。 6. **系统资源监控**:除了JVM内部,`jvm-mon`还能提供操作系统级别的信息,如CPU、内存和磁盘使用情况,以全面了解系统健康状况...
CPU使用率是指CPU在一段时间内执行非空闲任务的比例,通常以百分比表示。内存使用率则反映了系统分配给进程的内存在当前时刻被占用的程度。在Java中,我们通常使用`java.lang.management`包中的`...
- 通过`top`命令,我们可以观察到CPU使用率最高的进程,以及它们所占用的资源百分比等信息。 2. **深入分析某个特定进程的CPU消耗** - 使用`top`时可以通过参数`-p`来关注特定进程的CPU使用情况,例如:`[root@3...
综上所述,解决“Java进程CPU占用率高”问题需要从多个角度出发,包括但不限于代码优化、JVM调优、垃圾收集策略调整、监控与诊断工具的使用等。通过系统性地分析和改进,可以有效地降低Java进程对CPU的占用,提高...
性能调优通常需要结合具体的监控工具,例如JConsole、VisualVM、JProfiler等,来跟踪和分析内存泄漏、线程死锁、CPU使用率等问题。通过对GC日志、内存快照等数据的分析,可以对应用程序的性能瓶颈做出准确判断,并...
它循环打印出 Java 应用程序的 CPU 使用率、JVM 总内存大小以及剩余内存等信息。 ### 总结 以上代码展示了如何通过 Java 获取系统的监控信息,包括 CPU 使用率、内存使用情况等,并且针对不同操作系统提供了不同的...
当CPU使用率过高,可能意味着系统资源紧张,或者有程序占用过多CPU资源,导致其他进程运行缓慢或系统响应变慢。 在Windows操作系统中,可以使用任务管理器来监控CPU使用情况。通过按下Ctrl+Shift+Esc快捷键,或者...
- **功能**:显示系统中的进程列表,可以查看每个进程的CPU使用率、内存使用率等信息。 - **应用场景**: - 监控系统资源使用情况。 - 快速查找消耗资源较高的进程。 ##### 2. **jstack** - **命令格式**:`...
同时,监控JVM的运行状态,如内存使用、垃圾回收时间和CPU占用率,以便及时发现和解决问题。 总之,大促高并发系统下的JVM调优是一项复杂而细致的工作,涉及到服务器配置、Tomcat优化和JVM参数调整等多个层面。通过...
JVM调优工具详解 ...Jstack命令是JVM调优工具之一,用于找到死锁和高CPU使用率的线程。Jstack命令可以生成线程dump文件,用于分析Java应用程序的线程信息。例如,使用Jstack命令可以找到占用CPU最高的堆栈信息。 ...