今天无意中看到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转换效率是不是真的有那么好,大家可以尝试一下。
好啦,到此写得差不多了,至于其他的对数据的分析大家可以根据自己的需求分析一下。官网上的感觉不够详细所以自己在这里整理了一下,希望对大家有所帮助。