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

6 篇文章 0 订阅
先注意这里是“本地”Tomcat监控不到,远程监控请百度。

先写[b]结论[/b]:
[list]
[*]1. 磁盘文件系统必须使用NTFS,FAT32是监控不了的。原文见[url]http://visualvm.java.net/troubleshooting.html[/url]
[*]2. 必须使用有windows Tmp目录(这个路径可以参照3)写权限的用户来启动Jvisualvm
[*]3. Jvisualvm的临时文件存储路径,必须(臆断了。。。)和想监控的JAVA程序的临时文件存储路径相同。Jvisualvm默认使用windows的temp目录作为临时目录。(这点搞了我半天)
[*]4. tomcat启动参数添加
set JAVA_OPTS=-XX:+PerfBypassFileSystemCheck (这个经过我的测试发现不需要)
[/list]

Tomcat6.0.35(应该6版本都一样,其他没看)的默认Tmp目录为%CATALINA_BASE%\temp,也就是大家经常看到的tomcat路径下的temp目录。这点在catalina.bat当中有注释,大家可以自己去查。

[b]所以,解决方案[/b]:
[list]
[*]针对1,请自行格式化。。。
[*]针对2和3,由于jvisualvm默认使用windows的tmp路径,所以可以选择加一个CATALINA_TMPDIR环境变量,指向windows的默认temp路径(win7):%USERPROFILE%\AppData\Local\Temp
或者修改原本的windows环境变量tmp和temp到tomcat的temp目录,不过这样就只能看到那一个tomcat了,所以不推荐。
[/list]

[b]无图无真相,下图为本机启动三个tomcat监控。[/b]
[img]http://dl2.iteye.com/upload/attachment/0086/3572/7b24b0f1-eb2d-33fe-a1b2-805297f8ff97.jpg[/img]


以下为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的运行时间比较长。详细的就不说了,这个请和项目结合起来用,尤其是你自己熟悉的代码,用多了就知道了。

[img]http://dl2.iteye.com/upload/attachment/0086/3581/fe477c39-a6df-3100-9c82-eb5a3c520883.jpg[/img]

[/list]


留个备份,当孩子数蚂蚁是从0这个index开始的时候,就注定要看这个文章了。。

文章写的比较乱,请大侠勿喷。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值