如何validation作为Windows服务运行的活动JVM的堆大小启动参数并从registry加载JVM params?

我有一个Windows服务器,上面有第三方应用程序,作为Windows服务运行。 该服务/应用程序实际上是一个Java虚拟机,但它在任务pipe理器中显示为一个exe(我们称之为foo.exe )。

我知道该程序旨在从registry中获取JVM堆大小分配首选项,我知道registry中的哪个位置正在查找该信息。 话虽如此,我不知道如果一个pipe理员之前(或之后)启动服务编辑registry。

由于这是一个生产系统,我不愿意重新启动服务(特别是如果它已经使用了我在registry中看到的堆分配值)。 有没有其他方式可以告诉没有重新启动服务? 我想我可以看看目前在任务pipe理器中使用的内存,但不会提供确切的值。

在任务pipe理器中显示命令行列,它应该具有假定它们在命令行上传递的设置:

任务管理器

请注意,下面的答案可能需要启用JMX – 我相信它在公共JRE中是默认禁用的,并且需要重新启动JVM才能更改它,这对您的情况来说是无用的。 还是值得一试?

它们是否工作也取决于这个应用程序使用的特定的本地包装方法。

您应该能够将这些工具以及来自JDK的jli.dll以及相应的次要版本和体系结构复制到您正在运行的JRE中。 您也可以远程运行这些工具,但由于远程连接的安全性要求,如果没有进行初始设置,就不太可能工作。


JDK中提供的jps工具应该能够使用命令jps -v提供这些信息。 如果有多个Java进程正在运行,则可以通过第一列中的PID来标识它们。

Netbeans(PID 9056)(使用类似于您的应用程序的本机包装器)的示例输出:

 9056 -Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade -Dnetbeans.accept_ license_class=org.netbeans.license.AcceptLicense -client -Xss2m -Xms32m -XX:Perm Size=32m -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true - Dsun.java2d.noddraw=true -Dsun.java2d.dpiaware=true -Dsun.zip.disableMemoryMappi ng=true -Xmx1024m <snip> 

注意-Xss-Xms-Xmx参数。


你可以尝试的另一件事是jinfo ,它允许你定位一个特定的PID,例如jinfo 9056

注 – 此实用程序不受支持,可能会或可能不会在将来版本的JDK中使用。


你也可以尝试jconsolejvisualvm ,虽然他们似乎有麻烦附加到包装的JVM和列出虚拟机参数,从我的testing。

查看包含string-Xms-Xmx任何文本文件的“C:\ Program Files(x86)\ Foo Vender”下 – 可以从INI文件中提取值。 如果没有,可能会从registry中find它们,正如你猜测的那样。 我的一个客户端使用作为Windows服务运行的Web代理,并从安装的registry项获取启动参数。

如果要确切确认在启动EXE期间正在读取哪些文件或registry项,请在启动服务时使用Sysinternals中的ProcMon。