[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]记录一下几次java线上问题的调查手段[jprofiler,fullGC,CAT,卡死]

上一篇:[备忘]apache2报错:No protocol handler was valid for the URL
下一篇:[GDS]Sabre的高可用性地址:https://webservices.havail.sabre.com

添加日期:2017/9/20 13:22:53 快速返回   返回列表 阅读1704次
(1)某tomcat占cpu长期在60%左右,开始以为是gzip压缩导致的,一直没在意
某日,想起用JProfiler分析一下

使用JProfiler连接远程tomcat后,看到一个解析日期的方法,占用最多


public static final Date parse(String source, String pattern) {
    Date date = null;
    try {
        date = new SimpleDateFormat(pattern).parse(source);
    } catch (ParseException e) {
        // e.printStackTrace();
    }
    return date;
}


看了代码后,发现是个大循环,一次请求中就会调用多次该方法。
开始还想用什么线程Local解决,后来一看入口参数,
完全就是20170918这种很规矩的参数,
而且解析成日期后,完全是为了比较大小,
那还转换个屁啊,直接比较字符串完事~~

本案例的亮点之处是:好久没用JProfiler,都没想起来这个神器。
看代码猜来猜去的,没有用,上JProfiler一下就看出来了。

(2)几个tomcat完全没反应,用jstack xxx查看线程,发现N多线程全部BLOCKED住
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.xxx.util.DateUtil.convertStringToDate(DateUtil.java:178)

一看代码,


public static synchronized Date convertStringToDate(int formatType,String str){
        try{
            switch(formatType){
            case 1:
                return FORMATER_1.parse(str);//yyyyMMdd
            case 2:
...


竟然用了synchronized,无语,这是个静态方法诶~~
直接用类的class对象当做锁,N多地方抢一个锁,NB~~
懒得搞线程Local,直接每个方法里直接new,搞定

(3)又一次,几个tomcat又挂了,

看GC日志,发现一直在full GC,不停的full GC

调大内存到5G,重启,过一会又不停的GC了,看来有问题。

jstack xx,jmap -heap几个命令完全不行,没反应,搞不进去

不能直接重启啊,我得留个现场分析,

上大招,

jmap -dump:format=b,file=/data/query5.bin 18844

终于有一个tomcat有反应,花了一个小时下载下来,用mat分析,一看

com.dianping.cat.message.io.DefaultMessageQueue 占了2.8G

原来是往CAT里放的消息太大了,处理不过来,憋在内存中,导致内存占满。

去掉大消息,搞定。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved