如何在JVM上激活JMX以便使用jconsole进行访问?
我用-javaagent参数和premain方法做了一些java字节码检测.但这是我第一次听到agentmain方法.我对这个方法有一些疑问.接下来是这样的.
premain和agentmain方法有相同的用途吗?
调用agentmain方法时?
在java检测中使用agentmain方法有什么用?
我需要通过在给定类的实例上调用特定方法来停止进程.这个过程已经运行了一天,如果我把它关闭,我会失去很多工作.由于API中的错误,GUI错误连线并且没有调用正确的停止功能.我附加了一个交互式Java(Scala)解释器,所以如果我能掌握进程的实例,我可以轻松地调用正确的方法.
我不在调试会话中,没有com.sun.jdi.我可以在堆栈跟踪转储中看到该实例,但StackTraceElement不包含实际实例,只包含类和行号.
在没有特定检测的情况下,在运行会话中是否有任何方法可以通过其类,通过线程转储来获取该实例?
使用VisualVM,我可以附加到本地java进程,启动/停止CPU分析,并生成快照.我甚至不需要用任何特殊的代理商来处理这个过程.
是否有可能在无头生产服务器上做同样的事情?我知道我可以配置远程连接调试器的过程,但我希望尽量减少更改客户环境的数量和影响.我只想运行一个命令来分析一段时间并生成一个快照文件,我可以scp到我的工作站进行VisualVM或同等的分析.
优选的是,任何程序我运行要做到这一点应该是自由软件,这样我就可以用我的Java应用程序捆绑它,并将它在客户环境中使用.
理想情况下,就像使用VisualVM一样,我希望能够在不重启的情况下连接到正在运行的系统.
到目前为止,我发现的最接近的是使用hprof:
java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname
Run Code Online (Sandbox Code Playgroud)
但这需要重新启动以开始分析而另一个需要停止,因为我没有看到在运行时打开和关闭采样的方法.
有没有更好的办法?如果没有开箱即用的解决方案,那么如何构建它?它必须是可能的,因为VisualVM做到了.
java ×3
jvm ×2
profiling ×2
bytecode ×1
javaagents ×1
jconsole ×1
jmx ×1
monitoring ×1
reference ×1
reflection ×1