JVM调优

今天无意中看到alibaba的这个TProfiler插件,用来查找JVM的性能瓶颈问题,感觉用起来还不错,推荐给大家。用起来还算简单,功能其实也只是对(方法信息 执行次数 平均执行时间 全部执行时间)等这些信息进行监控。GitHub地址,本文参考了http://blog.youkuaiyun.com/defonds/article/details/52605670
1.TProfiler的下载与安装

可以访问TProfiler的GitHub主页,点击Clone or download,再点击Download ZIP进行下载:

这里写图片描述

下载完解压后的目录如下:

这里写图片描述

我这里在Linux的/usr/local下新建一个tprofiler目录(当然这个目录随便你建在哪里),然后将dist目录下的TProfiler_1.0.1.zip进行解压,解压后把profile.properties配置文件和lib目录下的tprofiler-1.0.1.jar复制到刚刚新建的tprofiler目录下。
好了文件准备好了,不过别忘记了重要的一步,给目录和文件赋予读写权限,不然会提示找不到文件的。

cd /usr/local
chmod -R 755 tprofiler/

好了,这样就给刚刚的文件夹和下面的文件加好权限了。

2.TProfiler 的配置部署

编辑服务器下的/usr/local/tprofiler/profile.properties配置文件,文件内容如下:

这里写图片描述

一般只要根据自己的需求修改红框的地方。下面是各个参数的详细说明:

这里写图片描述

要是还有什么不清楚的可以访问GitHub主页的WiKi,里面有官网的详细说明。

tomcat启动参数配置
我的环境是tomcat7,jdk1.7的,在catalina.sh里面加上启动参数配置,如下:

-javaagent:/usr/local/tprofiler/tprofiler-1.0.1.jar -Dprofile.properties=/usr/local/tprofiler/profile.properties

这里写图片描述

假如已经加了JAVA_OPTS启动参数,直接如上图加在后面就可以了。

3.top统计

好了经过上面的操作后,就可以直接启动tomcat了,启动tomcat后在相应的/usr/local/tprofiler目录下就会生成logs目录,目录下会生成tmethod.log、tprofiler.log和tsampler.log三个日志文件。

假如生成的tprofiler.log内容为空,或只有=号数据,那么估计是下图中的这个问题了:

这里写图片描述

好啦,监控信息都已经打印到日志里面去了,下面就只剩下统计这些信息了,执行下面的命令:

java -cp /usr/local/tprofiler/tprofiler-1.0.1.jar com.taobao.profile.analysis.ProfilerLogAnalysis /usr/local/tprofiler/logs/tprofiler.log /usr/local/tprofiler/logs/tmethod.log /usr/local/tprofiler/logs/topmethod.log /usr/local/tprofiler/logs/topobject.log

执行后会在/usr/local/tprofiler/logs目录下生成topmethod.log文件,文件内容如下(格式说明:方法信息 执行次数 平均执行时间 全部执行时间):

这里写图片描述

4.性能方法的优化

根据 topmethod.log 统计结果,我们拿到了热点方法 top10:

这里写图片描述

以排名第一的热点方法

com/defonds/core/ppts/common/support/JsonUtils:object2jsonString:123 

为例,看看如何来进行调优。

import org.codehaus.jackson.map.ObjectMapper;  
    public static <T> String object2jsonString(T t) {  
        try {  
            ObjectMapper objectMapper = instanceObjectMapper();  
            return objectMapper.writeValueAsString(t);  
        } catch (JsonParseException e) {  
            log.error(e.getMessage(), e);  
            throw new SysException(e);  
        } catch (JsonMappingException e) {  
            log.error(e.getMessage(), e);  
            throw new SysException(e);  
        } catch (IOException e) {  
            log.error(e.getMessage(), e);  
            throw new SysException(e);  
        }  
    }  
    public static ObjectMapper instanceObjectMapper() {  
        JsonFactory jf = new JsonFactory();  
        jf.configure(Feature.WRITE_NUMBERS_AS_STRINGS, true);  
        return new ObjectMapper(jf);  
    }     

这个方法平均调用时间在 154ms,如果在低并发时可能比这要小得多。但是高并发时可能要等待 GC 的堆内存释放、GC 作业时对业务线程造成的暂停时间等因素影响,这个时间会被无限放大。

object2jsonString 方法的 objectMapper 对象,instanceObjectMapper 方法的 jf 对象,把临时对象改成静态对象; json 处理由 jackson 改为 fastjson,不过fastjson自己没用过,不知道数据量大的json转换效率是不是真的有那么好,大家可以尝试一下。

好啦,到此写得差不多了,至于其他的对数据的分析大家可以根据自己的需求分析一下。官网上的感觉不够详细所以自己在这里整理了一下,希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值