VisualVM 监控注册成 Windows 服务的 Tomcat 之 jstatd 方式一

VisualVM Tomcat Windows 大约 1638 字

说明

jstatd方式监控与JMX方式多了一个可以观察GC的特点,即Visual GC可以展示堆区及GC情况。

注意

因为Tomcat是以Windows Services方式启动,启动Tomcat的用户是SYSTEM,比Administrator更高级别。所以,如果只是普通的启动jstatd是无法监控到Tomcat信息的。

即使把Tomcat使用指定用户名启动,且jstatd同样使用该用户启动,也无法监控到。

再即使使用提权工具psexec启动jstatd,同样无法监控到。

解决方法

安全策略文件

Java8及以前。

grant codebase "file:${java.home}/lib/tools.jar" {
   permission java.security.AllPermission;
};

grant codeBase "file:${java.home}/lib/ext/*" {
    permission java.security.AllPermission;
};

Java11,其实是Java9之后就使用此配置文件了,因为Java11LTS所以就以Java11为例子了。

grant codebase "jrt:/jdk.jstatd" {
   permission java.security.AllPermission;
};

grant codebase "jrt:/jdk.internal.jvmstat" {
   permission java.security.AllPermission;
};

脚本方式

指定了jstatd监听12345端口,且安全策略使用C:\jstatd.all.policy文件。

@echo off
"C:\jdk-11\bin\jstatd.exe" -p 12345 -J-Djava.security.policy=C:\jstatd.all.policy

创建服务

sc create jstatd binpath= "C:\jstatd.bat"

启动服务

打开Windows Services,找到jstatd服务,点击启动后可以直接点击取消,查看任务管理器中是否已经有jstatd.exe进程启动,且用户名是SYSTEM

命令方式

CMD中直接创建服务,双引号添加了转义符。

sc create jstatd2 binpath= "\"C:\jdk-11\bin\jstatd.exe\" -p 12345 -J-Djava.security.policy=\"C:\jstatd.all.policy\""

CMD中直接启动服务

sc start jstatd2

报错不用管,jstatd.exe进程已经启动,可以通过任务管理器查看。

C:\WINDOWS\system32>sc start jstatd2
[SC] StartService FAILED 1053:

The service did not respond to the start or control request in a timely fashion.

查看 VisualVM

添加jstatd连接,输入端口为12345,即可查看到本机所有的Java服务了。

参考

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstatd.html

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/sc-create

https://blogs.oracle.com/nbprofiler/monitoring-java-processes-running-as-a-windows-service

阅读 168 · 发布于 2021-07-31

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批