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

标签 windows tomcat profiling visualvm jvisualvm

我正在尝试使用本地运行的 JVisualVM(JDK 1.7.0 - 06、64 位)将在 Apache Tomcat (7.0.34) 中运行的 Servlet 配置为 Windows 7(64 位)上的服务。

最初,由于“java.io.tmp”属性错误/功能不同,我遇到了 Tomcat 未显示在本地应用程序列表中的问题,但我按照本论坛中几篇帖子的建议解决了这个问题。

然而,虽然 Tomcat 进程现在在本地应用程序列表中显示为“本地应用程序”,但当我打开该进程时,没有用于 Monitor、Threads、Sampler 或 Profile 的选项卡——只有 Overview 选项卡,其中包含 JVM 参数和系统属性子选项卡显示可怕的“此 jvm 不支持”消息。

我仔细检查了以下项目:

  • 通过查看 JVisualVM 中的 JVM 属性(使用 Tomcat 的 JMX 连接),Tomcat 和 JVisualVM 都运行相同版本的 Java
  • Tomcat 和 JVisualVM 都具有相同的“java.io.tmp”路径,方法是查看 JVisualVM 中的系统属性(再次使用 Tomcat 的 JMX 连接)并查看实际的 TMP/TEMP 目录并确认 PID两者的文件都存在
  • 文件系统是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,并且一切正常:作为服务运行有什么意义?

最佳答案

正如我之前的评论中所暗示的那样。我想简单的答案是不可能。 Java为了实现jconsole/jvisualvm与被监控进程的通信,使用了内存映射文件。最后归结为某个 Windows API 调用失败,原因是 Windows Vista 中添加了“Windows 服务强化”[1] 功能,当然,Windows 7 及更高版本中也存在该功能。

失败的调用是对函数 OpenFileMapping 的调用,如 perfMemory_windows.cpp 第 1402 行 [2] 中所示。在我的实验中,使用“hsperfdata_[用户名]_[进程 ID]”形式的参数调用该方法。如 Microsoft 对服务强化引入的差异的解释(参见 [3])中的进一步详细说明,如果不使用名称前缀,通信将无法工作:“如果用户应用程序 [...] 通过创建或打开与服务同步带有 Local\前缀(或没有前缀,默认为 Local)的对象,应用程序不再按预期工作。”

如果有人想自己看一看。您可以使用 Windows 调试工具附带的记录器工具 [4] 来跟踪 API 调用。

Sysinternals Process Explorer 也非常方便,因为它通过“查找句柄或 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

关于windows - 无法对在 Windows7 上作为服务运行的 Tomcat7 使用 JVisualVM 分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14574308/

相关文章:

windows - 为什么需要 IP_MULTICAST_IF 和 IPV6_MULTICAST_IF?

linux - AllJoyn Router 是否支持发现在有线本地网络上运行的远程服务

java - 服务器没有启动是因为将 PrimeFaces 从 4.0.x 升级到 5.2?

java - AWS : Does elastic beanstalk use s3 (storage) implicitly?

java - 无法访问我的 WebContent 文件夹中的 index.html

windows - 如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

windows - 找出环境变量是否包含子字符串

xcode - Xcode Instrument 的反汇编时间分析的可靠性

macos - 在 mac os x 上分析 c++

java - Java 内存消耗的类级分析