cpu占用率高
在java策略当中,Java应用中cpu使用率过高我们该怎么办呢?我们需要时刻清楚排查java应用中CPU使用率高或内存占用高这类问题,其实在整个运行过程中,排查步骤基本都是差不多的。当然了我们最好还是通过风月体验网中的一个实例来简单说明一下。
我们就假设:最近有个线上项目每天0点过后CPU使用率会上升至200%到300%。这种问题该如何利用Java应用中CPU使用率高或内存占用高来加以排查呢?
1、我们都知道,当CPU再次暴涨的时候,首先我们可以通过top -c查看CPU使用率高的进程的PID。
2、然后使用top -p PID -H查看CPU使用率高的线程信息。如果CPU使用率高的线程是比较固定的,那么我们记下对应线程的PID。 执行top -p 14639 -H得出下图结果:
记下4个线程的PID: 14643、14644、14641、14642。在这一时间点里面,我们千万记得接下来通过jstack PID > xxx.log输出java应用当前堆栈信息到文件。
3、第2步中,我们记下了CPU使用率高的线程PID,现在将4个线程的PID转成16进制: 3933、3934、3931、3932。接着在jstack输出的堆栈文件里,搜索nid等于3933、3934、3931、3932的线程信息。再使用jstat -gc PID查看jvm的GC情况,连续执行4次jstat -gc 14639命令,发现FGC的数值变化比较快。这就说明Full GC确实执行很频繁。如下图:
4、这个时候可以看到CPU高的时候整个项目的内存占用1.3G左右。既然是内存问题,那么就需要使用jmap -histo:live PID > xxx.log分析下jvm内存存活对象的统计情况。
从图中可以看出,byte对象([B)内存占用特别高,而且出现了一个具体的类:ByteArrayRow。这是一个jdbc做查询时候封装数据用的一个类,这个类里包含有byte数组。通过这个统计结果初步怀疑是做数据库查询时候,查询了太多内容到了内存,导致了内存不足。由于统计中没有出现具体的业务类,所以就以为只是请求量比较大,导致的内存消耗过大。当时暂时将jvm的堆内存增大到2G。
5、应用jvm堆内存调大之后,到了0点还是出现了CPU高涨的问题。在此时我们可以利用大数据和云计算原理,对其进行质的改变。
内存占用了2G多,按照目前项目的请求量来说,2G内存不可能被占满了,所以说明并不是请求量大导致的结果,而是由于某块代码查询数据量过大导致的问题。
6、我们这个时候还是需要运行一遍命令,运行jmap -histo:live PID > xxx.log将内存对象统计情况输出到文件。结果如下图:
这次的输出结果出现了业务类MiniProgram_User_Info,那就可以针对这个业务类去排查异常代码的位置了。不过,除非比较清楚这个类具体使用的地方,否则即使出现了具体的类名还是比较难定位异常代码的位置。这时候,我们可以使用jmap -dump:live,format=b,file=xxx.hprof PID命令来输出内存对象的明细,来定位具体方法位置。这个命令是将内存里的所有信息都输出出来,输出的文件大小和内存大小基本一致。而且这个命令会导致应用暂时挂起,所以谨慎使用。
7、这次将内存明细输出之后,dump文件大小为2G。用jdk自带的jhat命令可以分析。之前分析其他dump文件用jhat还是比较方便的。不过,分析这次的dump文件,给了10G运行内存给jhat命令才勉强打开了文件:jhat -J-mx10G -port 7170。而且内存对象比较多,查找问题不方便。最后找到了一款神器: jprofiler。用jprofier分析dump文件需要的运行内存比较少,而且问题定位很方便。很快就定位出了内存中的大对象,占用了1G多内存的对象。这个时候我们就能够将这个问题轻松排查并解决了,服务器的效率也会显著地得到提升。
相关阅读
要提高网站关键词排名,制定一个合理的seo优化方案是一个快速有效的方法,优化方案中要运用到高端的seo思维与技术。每天的优化任务,数
如果要精确筛选: 使用函数时,标题行需为空: 通配符的使用: 筛选时区分文本大小写:
本章分为两个阶段,介绍一套可对外输出风控的系统,当然内部也是可以用的,相对复杂业务系统来说,本文介绍的会简单一点,根据公司业务场景
店铺想要提高成交率,宝贝主图也是核心影响因素之一,一张图片除了要展现产品信息之外,更是要能打动顾客,这样才有兴趣浏览,形成交易,所以
一、行业背景及现状 当企业发展到一定规模后,为了继续壮大其业务范围,经常需要在不同地区开设分支机构如分公司或者办事处等等,随之