先注意这里是“本地”Tomcat监控不到,远程监控请百度。
先写
结论:
- 1. 磁盘文件系统必须使用NTFS,FAT32是监控不了的。原文见http://visualvm.java.net/troubleshooting.html
- 2. 必须使用有windows Tmp目录(这个路径可以参照3)写权限的用户来启动Jvisualvm
- 3. Jvisualvm的临时文件存储路径,必须(臆断了。。。)和想监控的JAVA程序的临时文件存储路径相同。Jvisualvm默认使用windows的temp目录作为临时目录。(这点搞了我半天)
- 4. tomcat启动参数添加
set JAVA_OPTS=-XX:+PerfBypassFileSystemCheck (这个经过我的测试发现不需要)
Tomcat6.0.35(应该6版本都一样,其他没看)的默认Tmp目录为%CATALINA_BASE%\temp,也就是大家经常看到的tomcat路径下的temp目录。这点在catalina.bat当中有注释,大家可以自己去查。
所以,解决方案:
- 针对1,请自行格式化。。。
- 针对2和3,由于jvisualvm默认使用windows的tmp路径,所以可以选择加一个CATALINA_TMPDIR环境变量,指向windows的默认temp路径(win7):%USERPROFILE%\AppData\Local\Temp
或者修改原本的windows环境变量tmp和temp到tomcat的temp目录,不过这样就只能看到那一个tomcat了,所以不推荐。
无图无真相,下图为本机启动三个tomcat监控。
以下为JvisualVM简单使用例子:
[list]
1.写个servlet,并加入配置
package test.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
test1();
test2();
resp.getWriter().write("Helloworld!");
}
/**
* 花费时间长,但是自运算时间不长(因为调用的sleep方法时间长,这个算另外一个方法了)
*/
private void test2() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 自运算使用时间长
*/
private void test1() {
long i = 0;
while (i < Integer.MAX_VALUE - 2) {
i++;
}
}
}
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
2. 启动tomcat和jvisualvm。。。。
3. 在jvisualvm中双击本地监控到的tomcat,如果不知道是哪个就看任务管理器的pid。
4. 概述中的jvm参数可以看到当前java进程的使用参数。
5. 监视Tab页可以看到CPU 类 堆(内存) 线程使用情况,DashBoard.另外堆dump可以帮助有效解决OOM问题。
6. 线程Tab页可以看到线程运行情况,(死锁全靠这个了),线程dump按钮点一下,在快照里面就能看到现在每个线程在干吗了,有偷窥的快感了。 以下是一段例子,第一次把循环设置为Long.maxval,结果2分钟也没跑完。。这是I5么。。
test1在不停的算,前面那个截图也是算的时候的情况。
"http-8080-1" daemon prio=6 tid=0x03d29800 nid=0x2518 runnable [0x0478f000]
java.lang.Thread.State: RUNNABLE
at test.servlet.TestServlet.test1(TestServlet.java:38)
at test.servlet.TestServlet.doGet(TestServlet.java:23)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- None
7.抽样器tab页可以看到CPU进行计算的热点(就是哪个方法运行的时间长)和堆使用监控,这两个功能主要用于性能优化和内存优化。 CPU监控使用方法为,点击cpu按钮,然后去访问http://localhost:8080/XXX/test
可以看到下图,明显发现test1和test2的运行时间比较长。详细的就不说了,这个请和项目结合起来用,尤其是你自己熟悉的代码,用多了就知道了。
[/list]
留个备份,当孩子数蚂蚁是从0这个index开始的时候,就注定要看这个文章了。。
文章写的比较乱,请大侠勿喷。