现在的码农真不好干,不仅要天天搬砖垒代码,还要安排监控系统做运维。既然选择了这行,就应该有使命感去把事情做好,让老板开心,码农虽然很苦逼,但必须要有尊严的活着,不能让产品看不起,我们是有价值的。

闲话不多说,今天想聊聊线上问题分析,一些小的异常:业务报错、空指针异常、格式转换异常等这些小儿科就不用多说了,堆栈信息已经显示了对应的类、方法和行号,修下代码就好了。有的时候会出现服务器CPU或者内存飙高的情况,我们可以用Zabbix 看到,但这种现象一般偶发或者一定周期频发,现在都是分布式系统,会有几十台服务器,现实情况是某一台服务器发生。出现这种情况,很有可能是JVM在作怪,JVM在进行Full GC的时候会CPU飙升,有句话叫“Stop the world”,可见Full GC强大的威力,如果频繁Full GC那么整个应用服务器就别想正常工作,所以过来的请求将面临time out的风险。

线上出现了该问题,领导、产品、测试都围过来了,他们现在意识到开发才是最有价值的,这个时候千万不能怂。赶紧上问题服务器看看。

1. top命令查下CPU或者Memory异常的进程 PID

2. top -Hp [进程ID] 找该进程下的线程 ID

Linux的骚操作搞完了,再用下JDK给我们提供的工具,进入到JDK的安装目录下的bin目录,如果不知道安装在哪里的,用 “ps -ef | grep java” 走一波

3. 用 ./jstat -gcutil 304c 5000ms 走起 (这里用的线程号是步骤的ID号转十六进制)

Java 频繁调get java 频繁fullgc_Full GC

这是什么?有什么用?不要紧张,这非常有用。面试JVM必考题:请您简要说下JVM的堆内存。相信你一定答得出来,有什么Young区,Old区,Young区又分为Eden区、Survivor0和Survivor1区,巴拉巴拉。好了,取首字母后对比上图中,是不是有点眉目了。S0,S1,E,O列下面的数字表示的是内存使用比例,YGC表示的是年轻代垃圾回收的次数,78变成79说明JVM进行了一次YGC操作。定位问题的时候重点是看FGC和FGCT,FGC代表老年代垃圾回收的次数,FGCT代表一次回收的时间,如果回收的次数频繁并且每次回收的时间长,则证明服务器有隐藏的问题。

4. 前面这些操作只能证明我们的猜想,我们还是要通过工具检验下效果,jprofiler就是一个不错的工具。安装有两种方式:一种是利用插件;一种是装客户端。

Idea安装Profiler 插件 https://plugins.jetbrains.com/plugin/253-jprofiler/versions安装Profiler客户端 https://www.ej-technologies.com/download/jprofiler/version_92

我采用的是安装Idea的插件,安装完后在Idea里就可以看到有蓝色仪表盘的东西。

Java 频繁调get java 频繁fullgc_Java 频繁调get_02

5. 下一段内存溢出的代码跑跑看看效果:

ArrayList<User> userList = Lists.newArrayList();
int i = 0;
/*while (true){
    i++;
    userList .add(new User());
    if(i>1000){
        break;
    }

}*/

Fun fun = new Fun();
fun.f1(1L);

 

Java 频繁调get java 频繁fullgc_Minor GC_03

6. 总结

从图上可以看到,Classes就是对象实例在不断增多,期间内存和CPU负载会升高下降,这是因为在做GC的效果。一般我们的应用都是跑在远程的服务器上,jprofiler支持连接远程服务器,对远程服务器的内存、CPU和GC都可以做全方位监控。