(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里放的消息太大了,处理不过来,憋在内存中,导致内存占满。
去掉大消息,搞定。
|