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

时间:2013-01-29 01:40:15

标签: 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 Properties子选项卡显示可怕的“不支持此jvm”消息。

我仔细检查过以下项目:

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

最后几点:

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

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

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

4 个答案:

答案 0 :(得分:8)

正如我先前的评论所暗示的那样。我想简单的答案是它不可能。为了实现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

答案 1 :(得分: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

答案 2 :(得分:2)

你不能只通过网络连接,即用

启动JVM
 java 
  -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=1234 
  -Dcom.sun.management.jmxremote.local.only=false 
  -Dcom.sun.management.jmxremote.authenticate=false 
  -Dcom.sun.management.jmxremote.ssl=false 
  -jar my.jar`

并在工具中创建一个到localhost的网络连接:1234

答案 3 :(得分:0)

如果有人在Windows 7上有解决方案,我也很好奇。正如所指出的那样,将VisualVM作为服务运行的技巧在Vista上不起作用我假设相同的安全功能阻止它在赢7。

我唯一的解决方案是将您的应用服务器(Tomcat)设置为服务,这样如果服务器重新启动,它将会出现并可用。然后手动停止服务并从命令行启动应用程序服务器(Tomcat)并与VisualVM连接。只要服务器没有重新启动,你就可以获得良好的监控。