java开发过程中常见性能问题汇总

常见的性能问题:

1、CPU高

  a)线程忙 

    1) 使用top命令,先找到占用CPU高的进程PID,确认是否是java进程导致的占用CPU高

    2) top -H -p <PID>  查看哪个占用CPU高的线程Thread-ID,先把它记下来,留待第4步使用

    3) jstack <PID>  /home/aaa.log   将堆栈信息存储到文件中,下载文件

    4) 将步骤2的线程ID,转成十六进制,在aaa.log中搜索,便可以看到该线程的调用栈,便可知道该线程在执行什么代码

  b)频繁GC

    如果经过a)排查结果发现是频繁GC,说明有线程在大量创建对象,存在内存溢出风险,可按“内存溢出”的思路继续排查

2、内存溢出 | 内存占用大

  现象:

    1)Tomcat重启十几分钟后,界面逐步变卡,请求响应慢

    2)CPU占用高,GC频率高

  排查思路:

    1)通过命令jmap -histo:live <PID>  | head -1000, 查看创建的对象个数排名前1000

    2)查看哪些是自己写的Bean之类,推测该Bean的使用场景

  排查结果:

    某个服务挂了很长时间,数据库里堆积了大量未推送的消息。Tomcat启动时会一次推送全部数据,数据量太大,创建的对象多

3、上下行流量大

  现象:客户对服务器做流量监控,以防止偷数据的事情发生。使用zabix发现有一台服务器流量异常大

  排查思路:通过tcpdump抓包,将数据转成csv文件,通过Excel对数据做透视图,统计哪两个IP通信异常

   排查结果:有一台备用机,做数据备份,属于正常流量  

4、磁盘IO高

  现象:界面响应慢,静态资源耗时长,Ajax请求耗时短。CPU占用正常,内存占用正常,网络正常

  排查思路:因只有静态资源加载慢,怀疑是磁盘IO的问题

    1)使用iostat查看系统的磁盘占用情况,确定存在IO大的问题

    

    2)iotop命令或pidstat -d 1,查看IO排名,看是否有进程在一直读写操作。发现有多个磁盘写操作的记录,logging操作是日志相关的线程      

    

    3)查看日志级别,发现是DEBUG级别的日志

    

  解决思路:

    1)设置日志缓存,达到缓存时,才输出到文件中  log4j.appender.A3.BufferSize=8192

    2)改为异步输出  <appender name="ASYNCOUT" class="org.apache.log4j.AsyncAppender">

    3)日志级别改成ERROR级别,减少日志的打印量
    4)log4j.additivity.monitorLogger=false 控制监控logger的日志不会输出到rootlogger,否则会产生许多重复的数据

5、JDBC耗时

猜你喜欢

转载自blog.csdn.net/shark1357/article/details/109397399