我想知道在Java中获取应用程序的性能指标的标准做法是什么。目前,我们定期安排一项收集系统指标的任务。通常,此任务不会按时安排,导致指标在当时不可用,导致监控仪表板被破坏[如果线图会出现间隙]。
通常,当应用程序性能不佳时,我们希望所有指标都可用。但是我们观察到那些是我们无法收集任何指标的时候[因为应用程序非常繁忙]
答案 0 :(得分:0)
您可以使用名为top-threads的工具,可在此处找到:https://bitbucket.org/pjtr/topthreads
这样做可以为您提供有关目标JVM加载的每个类和线程的每个请求详细信息(RAM,CPU等)。
上面的页面
您可以使用位于java lib目录的Tools.jar文件中的Sun库将代理加载到目标VM中。
加载代理如下所示:
/**
* Hooks/Attaches to the process's VM with a given PID
*
* @return true if the hook/attach was successful
*/
public boolean hook() {
try {
return (vm = VirtualMachine.attach(Long.toString(pid))) != null;
} catch (AttachNotSupportedException | IOException e) {
e.printStackTrace();
return false;
}
}
/**
* Loads a thread agent which can debug the running threads and classes of this process
* @param agent - the location of the agent jar file
* @param options - the options/arguments to pass into the agents main method
*/
public boolean loadAgent(String agent, String options) {
try {
vm.loadAgent(agent, options);
return true;
} catch (AgentLoadException | AgentInitializationException | IOException e) {
e.printStackTrace();
return false;
}
}
Agent Main Class看起来像这样......
另外,请注意:创建代理jar时,必须在清单文件中指定Agent-main,其中包含要从中加载代理的Class包含agentmain方法的位置。
public class Agent {
/**
* An Object Lock for thread sync's if neccessary */
public static final Object LOCK = new Object();
/**
* Starts the agent with this agent main
*
* @param agentArgs
* - the agent args being passed into this method
* @param inst
* - the instrumentation instrument that is passed into this
* method
*/
public static void agentmain(String agentArgs, Instrumentation inst) {
//Do whatever you want to the target VM here, hacky, but eh, use at your own risk, it is included in java itself...
}
}
代理清单文件的描述
Manifest-Version: 1.0
Agent-Class: packageNameThatWillBeDifferent.Agent
Created-By: 1.8.0_101 (Oracle Corporation)
答案 1 :(得分:0)
无论这是“企业”应用程序还是在JVM中执行其服务的小型服务。您需要深入了解此垃圾收集运行时的基本运行状况详细信息。这是内存池(堆,堆外),GC统计最显着。
从主机视图中收集流程指标(CPU使用率,驻留集大小(RSS),IO)无助于您真正了解JVM的功能,也无法了解代码中的热点。< / p>
如果您无法访问代码,那么代理可能是唯一获得JVM洞察力的机会。否则,您应该使用上面提到的一些着名的Java度量库来检测JVM。
从我的观点来看,最广泛使用的Java度量标准库是Dropwizard Metrics。
尽管我有点偏颇,但我建议您查看Micrometer项目。您可以在几行代码中配置一组基本JVM运行时指标,以便基本了解JVM运行时行为。如果这样做,您可以通过计时来开始检测代码中的热点。 千分尺为各种已建立的监控系统提供了大量的公制出口商。 (普罗米修斯,InfluxDb,石墨,...)