我正在尝试使用在本地运行的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”消息。
我仔细检查过以下项目:
最后几点:
如果有人已经解决了这个问题,那么解决方案将会非常受欢迎。但是,只知道其他人是否正在运行相同的配置 - Windows 7 64位,Java 7 64位,Tomcat 7作为服务运行 - 成功,这将非常有用。
更新:我没有作为服务运行,而是使用批处理文件运行Tomcat,并且完美运行:作为服务运行的是什么?
答案 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
[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连接。只要服务器没有重新启动,你就可以获得良好的监控。