JVisualvm监控不到本地Tomcat问题总结和简单使用例子
先注意这里是“本地”Tomcat监控不到,远程监控请百度。
先写结论:
1. 磁盘文件系统必须使用NTFS,FAT32是监控不了的。原文见http://visualvm.java.net/troubleshooting.html2. 必须使用有windows Tmp目录(这个路径可以参照3)写权限的用户来启动Jvisualvm3. 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;@Overrideprotected 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么。。
"http-8080-1" daemon prio=6 tid=0x03d29800 nid=0x2518 runnable [0x0478f000] java.lang.Thread.State: RUNNABLEat 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:- None7.抽样器tab页可以看到CPU进行计算的热点(就是哪个方法运行的时间长)和堆使用监控,这两个功能主要用于性能优化和内存优化。CPU监控使用方法为,点击cpu按钮,然后去访问http://localhost:8080/XXX/test
