JVisualvm监控不到本地Tomcat问题总结和简单使用例子

先注意这里是“本地”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开始的时候,就注定要看这个文章了。。

    文章写的比较乱,请大侠勿喷。

    猜你喜欢

    转载自wwwcomy.iteye.com/blog/1896744