先写 结论:
- 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]
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>
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
可以看到下图,明显发现test1和test2的运行时间比较长。详细的就不说了,这个请和项目结合起来用,尤其是你自己熟悉的代码,用多了就知道了。
[/list]
留个备份,当孩子数蚂蚁是从0这个index开始的时候,就注定要看这个文章了。。
文章写的比较乱,请大侠勿喷。