我正在尝试使用本地运行的JVisualVM (JDK1.7.0- 06,64位)将运行在Apache Tomcat (7.0.34)中的Servlet评测为Windows7 (64位)上的服务。
最初,由于不同的"java.io.tmp“属性错误/功能,我遇到了Tomcat没有显示在本地应用程序列表中的问题,但我按照这个论坛上几篇帖子中的建议解决了这个问题。
然而,尽管Tomcat进程现在在本地应用程序列表中显示为“本地应用程序”,但当我打开该进程时,没有监视器、线程、采样器或配置文件的选项卡-只有“概述”选项卡,其中的“JVM参数”和“系统属性”子选项卡显示可怕的“此jvm不支持”消息。
我已经仔细检查了以下几项:
中的进程,发现Tomcat和JVisualVM都是作为同一个Windows用户执行的
最后几点:
如果任何人有并解决了这个问题,显然,解决方案将非常感谢。然而,了解其他人是否正在运行相同的配置-Windows764位、Java764位、Tomcat7作为服务运行- successfully.会很有用
Tomcat:不是作为服务运行,而是使用批处理文件运行,一切都运行得很好:作为服务运行是什么意思?
发布于 2014-01-28 00:46:46
正如我在之前的评论中所暗示的那样。我想简单的答案是,这是不可能的,。为了实现jconsole/jvisualvm与被监控进程之间的通信,Java使用了内存映射文件。最后,它归结为某个Windows API调用由于Windows Vista中添加的"Windows Service Hardening“1功能而失败,当然,该功能也存在于Windows 7和更高版本中。
失败的调用是对函数OpenFileMapping的调用,如perfMemory_windows.cpp行1402所示。在我的实验中,该方法是使用"hsperfdata_username_process id“形式的参数调用的。正如Microsoft对服务强化引入的差异的进一步详细解释(请参阅3),如果不使用名称前缀,通信将无法工作:“如果用户应用程序...通过创建或打开带有Local\前缀(或无前缀,默认为Local)的对象来与服务同步,则应用程序不再按预期工作。”
如果有人想亲自看看的话。您可以使用Windows调试工具附带的记录器工具4来跟踪API调用。
此外,Sysinternals进程浏览器非常方便,因为它通过其“查找句柄或DLL...”显示用于内存映射文件的全名。函数。只需搜索包含"hsperf“的句柄。
作为附注:删除或以其他方式处理包含hsperf数据的临时目录的变通方法归结为要监视的进程和监视进程所使用的用户名的大小写需要一致的事实。但是,除了更改临时目录之外,还可以轻松地更改监视进程使用的USERNAME环境变量。您还可以在perfMemory_windows.cpp的272行中看到它是如何被使用的。
发布于 2013-02-18 19:53:23
您几乎做到了“我使用批处理文件运行Tomcat,而不是将其作为服务运行,一切都运行得很好:作为服务运行是什么?”现在剩下的唯一步骤就是将JVisualVM作为服务运行:)
请参考以下内容
https://blogs.oracle.com/nbprofiler/entry/monitoring_java_processes_running_as
由于只能评测在与VisualVM相同的用户下运行的Java进程,因此评测Windows服务(缺省情况下在System帐户下运行)的唯一方法是将VisualVM本身作为一项Windows服务启动。请注意,由于默认情况下阻止服务显示任何UI的安全限制,此方法在Windows Vista上不起作用。
另一种选择是运行来作为本地系统运行CMD.EXE,请参阅下面的内容。
http://vicevoice.blogspot.in/2009/09/vaas-visualvm-as-service.html
发布于 2014-01-28 06:31:59
您不能直接通过网络连接吗,即用以下命令启动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的网络连接
https://stackoverflow.com/questions/14574308
复制相似问题