无法对在Windows7上作为服务运行的Tomcat7使用JVisualVM分析

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"消息.

我仔细检查过以下几项:

  • 通过查看JVisualVM中的JVM属性(使用Tomcat的JMX连接),Tomcat和JVisualVM都运行相同版本的Java
  • 通过查看JVisualVM中的系统属性(再次使用Tomcat的JMX连接)并查看实际的TMP/TEMP目录并确认两者的PID文件,Tomcat和JVisualVM都具有相同的"java.io.tmp"路径存在
  • 文件系统是NTFS
  • Windows用户名称中没有下划线(注意:由于我们使用"firstname.lastname"形式的网络登录,用户确实在名称中有句点,但是在JVisualVM中查看其他Java应用程序时没有问题所以不要认为这是一个问题)
  • 通过查看任务管理器中的进程,Tomcat和JVisualVM都作为同一个Windows用户执行

最后几点:

  • 我需要配置 Servlet,因此使用JMX是不够的
  • 我能够在Windows XP机器(Java 7,Tomcat 7作为服务)上进行配置,因此看起来似乎是Windows 7/64位的东西?

如果有人已经解决了这个问题,那么解决方案将会非常受欢迎.但是,只知道其他人是否正在运行相同的配置 - Windows 7 64位,Java 7 64位,Tomcat 7作为服务运行 - 成功.

更新:我没有作为服务运行,而是使用批处理文件运行Tomcat,并且完美运行:作为服务运行的是什么?

Chr*_* K. 9

正如我之前的评论中已经暗示的那样.我想简单的答案是不可能的.为了实现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

[2] http://hg.openjdk.java.net/jdk7/hotspot-rt/hotspot/file/5dce25362b8a/src/os/windows/vm/perfMemory_windows.cpp

[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


Man*_*ngh 7

你几乎成了"它不是作为服务运行,而是使用批处理文件运行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