Mr *_*son 17 windows tomcat profiling visualvm jvisualvm
我正在尝试使用在本地运行的JVisualVM(JDK 1.7.0 - 06,64位)将在Apache Tomcat(7.0.34)中运行的Servlet作为Windows 7(64位)上的服务进行分析.
最初我遇到了Tomcat没有显示在本地应用程序列表中的问题,因为不同的"java.io.tmp"属性错误/功能,但在本论坛的几个帖子中建议解决它.
但是,虽然Tomcat进程现在在本地应用程序列表中显示为"本地应用程序",但是当我打开进程时,没有用于Monitor,Threads,Sampler或Profile的选项卡 - 只有JVM参数和Sytem属性子菜单的Overview选项卡-tabs显示可怕的"不支持此jvm"消息.
我仔细检查过以下几项:
最后几点:
如果有人已经解决了这个问题,那么解决方案将会非常受欢迎.但是,只知道其他人是否正在运行相同的配置 - Windows 7 64位,Java 7 64位,Tomcat 7作为服务运行 - 成功.
更新:我没有作为服务运行,而是使用批处理文件运行Tomcat,并且完美运行:作为服务运行的是什么?
正如我之前的评论中已经暗示的那样.我想简单的答案是不可能的.为了实现jconsole/jvisualvm与被监视进程之间的通信,Java使用内存映射文件.最后归结为某个Windows API调用因Windows Vista中添加的"Windows服务强化"[1]功能而失败,当然,Windows 7及更高版本中也存在此功能.
失败的调用是函数OpenFileMapping,可以在perfMemory_windows.cpp第1402行[2]中看到.在我的实验过程中,使用"hsperfdata_ [username] _ [process id]"形式的参数调用该方法.正如在微软中进一步详细说明的那样,如果没有使用名称前缀,通信将不起作用:"如果用户应用程序通过创建或打开与服务同步,则无法解释服务强化(参见[3])引入的差异对于具有Local \前缀(或没有前缀,默认为Local)的对象,应用程序不再按预期工作."
如果有人想看看自己.您可以使用Windows调试工具附带的Logger工具[4]来跟踪API调用.
此外,Sysinternals Process Explorer非常方便,因为它通过"Find Handle or DLL ..."函数显示用于内存映射文件的全名.只需搜索包含"hsperf"的句柄.
作为旁注:删除或以其他方式弄乱包含hsperf数据的临时目录的解决方法归结为以下事实:要监视的进程和监视进程使用的用户名的情况需要保持一致.但是,您也可以轻松更改监视进程使用的USERNAME环境变量,而不是更改临时目录.你还可以在perfMemory_windows.cpp第272行[2]中看到它是如何使用的.
[1] http://technet.microsoft.com/en-us/library/cc507844.aspx#EHF
[3] http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx
[4] http://msdn.microsoft.com/en-us/library/windows/hardware/ff560123(v=vs.85).aspx
你几乎成了"它不是作为服务运行,而是使用批处理文件运行Tomcat,并且完美运行:作为服务运行是什么 "现在唯一的一步就是将JVisualVM作为服务运行:)
请参阅此
https://blogs.oracle.com/nbprofiler/entry/monitoring_java_processes_running_as
由于只能分析在与VisualVM相同的用户下运行的Java进程,因此分析Windows服务(默认情况下在系统帐户下运行)的唯一方法是将VisualVM本身作为Windows服务启动.请注意,由于安全限制,此方法在Windows Vista上不起作用,默认情况下会阻止服务显示任何UI.
另一种选择是运行到本地系统运行CMD.EXE,请参阅下文.
http://vicevoice.blogspot.in/2009/09/vaas-visualvm-as-service.html
归档时间: |
|
查看次数: |
8033 次 |
最近记录: |